⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vcdemomainform.pas

📁 delphi编程控件
💻 PAS
字号:
unit VCDemoMainForm;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, TreeVwEx, dbTree, DB, DBTables, Grids, DBGrids, StdCtrls,
  DBCtrls, Mask, ExtCtrls, dbTreeCBox;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheetDepartments: TTabSheet;
    TableDepartment: TTable;
    TableDepartmentDepartmentID: TStringField;
    TableDepartmentDescription: TStringField;
    TableDepartmentDateEstablished: TDateField;
    TableDepartmentOwnerDept: TStringField;
    DataSourceDepartment: TDataSource;
    TableStaff: TTable;
    TableStaffEmpNo: TStringField;
    TableStaffLastName: TStringField;
    TableStaffFirstName: TStringField;
    TableStaffPhoneExt: TStringField;
    TableStaffHireDate: TDateTimeField;
    TableStaffSalary: TFloatField;
    TableStaffDisplayName: TStringField;
    TableStaffDepartment: TStringField;
    DataSourceStaff: TDataSource;
    TableStaffUnassigned: TTable;
    TableStaffUnassignedEmpNo: TStringField;
    TableStaffUnassignedLastName: TStringField;
    TableStaffUnassignedFirstName: TStringField;
    TableStaffUnassignedPhoneExt: TStringField;
    TableStaffUnassignedHireDate: TDateTimeField;
    TableStaffUnassignedSalary: TFloatField;
    TableStaffUnassignedDepartment: TStringField;
    TableStaffUnassignedDisplayName: TStringField;
    DataSourceStaffUnassigned: TDataSource;
    dbtvDepartment: TDBTreeView;
    dbtvStaff: TDBTreeView;
    dbtvUnassigned: TDBTreeView;
    DBEdit2: TDBEdit;
    DBEdit1: TDBEdit;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label4: TLabel;
    Label3: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    TabSheetPeople: TTabSheet;
    TablePeople: TTable;
    TablePeopleEmpNo: TStringField;
    TablePeopleLastName: TStringField;
    TablePeopleFirstName: TStringField;
    TablePeoplePhoneExt: TStringField;
    TablePeopleHireDate: TDateTimeField;
    TablePeopleSalary: TFloatField;
    TablePeopleDepartment: TStringField;
    DataSourcePeople: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator2: TDBNavigator;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DbTreeLookupComboBox1: TDbTreeLookupComboBox;
    Button2: TButton;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label11: TLabel;
    procedure FormShow(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure PageControl1Changing(Sender: TObject;
      var AllowChange: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure DataSourceDepartmentDataChange(Sender: TObject; Field: TField);
    procedure TableDepartmentBeforeDelete(DataSet: TDataSet);
    procedure TableStaffCalcFields(DataSet: TDataSet);
    procedure TableStaffUnassignedCalcFields(DataSet: TDataSet);
    procedure dbtvDepartmentDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure dbtvDepartmentDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure dbtvStaffDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure dbtvStaffDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure dbtvUnassignedDragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure dbtvUnassignedDragDrop(Sender, Source: TObject; X, Y: Integer);
    procedure TableDepartmentAfterDelete(DataSet: TDataSet);
  private
    DeletedDepartment: string;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure OpenTable(Table: TTable);
var
  TableName: String;
begin
  if Table.Active then
    exit;
  if (Table.DatabaseName = '') then
  begin
    TableName := Table.TableName;
    if (Pos('.DB', UpperCase(TableName)) = 0) then
      TableName := TableName + '.DB';
    if FileExists(ExtractFilePath(Application.ExeName) +
                  TableName) then
      Table.DatabaseName := ExtractFileDir(Application.ExeName)
    else
    begin
      ShowMessage(
        'Please set ' + Table.Name + '.DatabaseName to the location of ' +
        TableName + ' or copy ' + TableName +
        ' to the location of ' + Application.ExeName);
      halt;
    end;
  end;
  Table.Open;
end;

function PostQuery(Table: TTable): Boolean;
begin
  result := true;
  with Table do
    if (State in [dsEdit, dsInsert]) then
      case MessageDlg(TableName + ' is still in edit-mode.' + #10 +
                      'Save changes ?',
                      mtConfirmation, mbYesNoCancel, 0) of
        mrYes: Post;
        mrNo: Cancel;
        else result := false;
      end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  OpenTable(TableDepartment);
  OpenTable(TableStaff);
  OpenTable(TableStaffUnassigned);
  OpenTable(TablePeople);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := PostQuery(TableDepartment) and PostQuery(TablePeople);
end;

procedure TForm1.PageControl1Changing(Sender: TObject;
  var AllowChange: Boolean);
begin
  AllowChange := PostQuery(TableDepartment) and PostQuery(TablePeople);
{ Refresh would not be needed if we would use TSelfRefreshTables: }
  TableStaffUnassigned.Refresh;
  TableStaff.Refresh;
  TablePeople.Refresh;
end;

procedure TForm1.TableStaffCalcFields(DataSet: TDataSet);
begin
  TableStaffDisplayName.AsString :=
    TableStaffLastName.AsString + ', ' +
    TableStaffFirstName.AsString
end;

procedure TForm1.TableStaffUnassignedCalcFields(DataSet: TDataSet);
begin
  TableStaffUnassignedDisplayName.AsString :=
    TableStaffUnassignedLastName.AsString + ', ' +
    TableStaffUnassignedFirstName.AsString
end;

procedure TForm1.DataSourceDepartmentDataChange(Sender: TObject; Field: TField);
begin
  dbtvStaff.RebuildTree;
end;

procedure TForm1.dbtvDepartmentDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
{ We set dtAutoDragMove in dbtvDepartment.Options, so the items of
  dbtvDepartment can get moved. But if we use the DragOver-event, we
  could stop it anyway by setting Accept to false - so we have to
  set Accept to true if Source = dbtvDepartment: }
  Accept := (Source = dbtvDepartment) or
            (Source = dbtvStaff) or
            (Source = dbtvUnassigned);
end;

procedure TForm1.dbtvDepartmentDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  if (dbtvDepartment.GetNodeAt(X, Y) <> nil) and
     (dbtvDepartment.IDOfNode(dbtvDepartment.GetNodeAt(X, Y)) <> '') then
  begin
    if (Source = dbtvStaff) then
    begin
      dbtvStaff.SynchronizeCurrentRecordToSelectedNode;
      TableStaff.Edit;
      TableStaffDepartment.AsString :=
        dbtvDepartment.IDOfNode(dbtvDepartment.GetNodeAt(X, Y));
      TableStaff.Post;
      TableStaffUnassigned.Refresh;
    end;
    if (Source = dbtvUnassigned) then
    begin
      dbtvUnassigned.SynchronizeCurrentRecordToSelectedNode;
      TableStaffUnassigned.Edit;
      TableStaffUnassignedDepartment.AsString :=
        dbtvDepartment.IDOfNode(dbtvDepartment.GetNodeAt(X, Y));
      TableStaffUnassigned.Post;
      TableStaff.Refresh;
    end;
  end;
end;

procedure TForm1.dbtvUnassignedDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := (Source = dbtvStaff);
end;

procedure TForm1.dbtvUnassignedDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  if (Source = dbtvStaff) then
  begin
    dbtvStaff.SynchronizeCurrentRecordToSelectedNode;
    TableStaff.Edit;
    TableStaffDepartment.AsString := '';
    TableStaff.Post;
    TableStaffUnassigned.Refresh;
  end;
end;

procedure TForm1.dbtvStaffDragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  Accept := (Source = dbtvUnassigned);
end;

procedure TForm1.dbtvStaffDragDrop(Sender, Source: TObject; X,
  Y: Integer);
begin
  if (Source = dbtvUnassigned) then
  begin
    dbtvUnassigned.SynchronizeCurrentRecordToSelectedNode;
    TableStaffUnassigned.Edit;
    TableStaffUnassignedDepartment.AsString :=
      TableDepartmentDepartmentID.AsString;
    TableStaffUnassigned.Post;
    TableStaff.Refresh;
  end;
end;

procedure TForm1.TableDepartmentBeforeDelete(DataSet: TDataSet);
begin
  DeletedDepartment := TableDepartmentDepartmentID.AsString;
end;

procedure TForm1.TableDepartmentAfterDelete(DataSet: TDataSet);
begin
  if (DeletedDepartment = '') then
    exit;
  TableStaffUnassigned.DisableControls;
  TableStaffUnassigned.Filter :=
    'Department = ''' + DeletedDepartment + '''';
  TableStaffUnassigned.Last;
  while not TableStaffUnassigned.BOF do
  begin
    TableStaffUnassigned.Edit;
    TableStaffUnassignedDepartment.AsString := '';
    TableStaffUnassigned.Post;
  end;
  TableStaffUnassigned.Filter := 'Department = ''''';
  TableStaffUnassigned.EnableControls;
  dbtvUnassigned.RebuildTree;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -