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

📄 unit1.pas

📁 程序启动时
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, Buttons, ExtCtrls, DB, DBTables, ImgList,
  StdCtrls, ComCtrls;

const
  gpMainRegionName = '某公司';

type
  TForm1 = class(TForm)
    Panel6: TPanel;
    Panel5: TPanel;
    SpeedButton1: TSpeedButton;
    Query1: TQuery;
    Query2: TQuery;
    LargeImages: TImageList;
    ControlTree: TVirtualStringTree;
    Splitter1: TSplitter;
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
    procedure ControlTreeGetText(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure ControlTreeGetImageIndex(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
      var Ghosted: Boolean; var ImageIndex: Integer);
    procedure ControlTreeGetHint(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex;
      var LineBreakStyle: TVTTooltipLineBreakStyle;
      var HintText: WideString);
    procedure SpeedButton1Click(Sender: TObject);
    procedure ControlTreeFocusChanged(Sender: TBaseVirtualTree;
      Node: PVirtualNode; Column: TColumnIndex);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure LoadGroup;
  end;

  NodeKind = (nkCompany, nkDepartment, nkEmployee);
  
  PEntry = ^TEntry;
  TEntry = record
      Caption: string;
           ID: Word;
         Kind: NodeKind;
   ImageIndex: Byte;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

function FindChild(Sender: TBaseVirtualTree; hParent: PVirtualNode; EMPID: integer): PVirtualNode;
var
  llhChild: PVirtualNode;
  Data: PEntry;
begin
  Result := nil;

  llhChild := hParent.FirstChild; //获取hParent的第一个子节点
  while Assigned(llhChild) do begin
    Data := Sender.GetNodeData(llhChild);
    if (Data.Kind = nkEmployee) and (Data.ID = EMPID) then begin
       Result := llhChild;
       Exit;
    end;

    {对llhChild节点进行处理}
    Result := FindChild(Sender, llhChild, EMPID);
    if Result <> nil then Exit;
    llhChild := llhChild.NextSibling;
  end;

end;


procedure TForm1.LoadGroup;
var
  MainNodeLevel, ChildNodeLevel1, ChildNodeLevel2: PVirtualNode;
  Data: PEntry;
begin
  ControlTree.Clear;
  ControlTree.NodeDataSize  := SizeOf(TEntry);
  MainNodeLevel := ControlTree.AddChild(nil);
  MainNodeLevel.States := MainNodeLevel.States + [vsExpanded];
  Data := ControlTree.GetNodeData(MainNodeLevel);
  Data.Caption := gpMainRegionName;
  Data.ImageIndex := 1;
  Data.Kind := nkCompany;

  Query2.DisableControls;
  Query2.Close;
  Query2.SQL.Clear;
  Query2.SQL.Add('SELECT * FROM Department.db');
  Query2.Prepare;
  Query2.Open;
  Query2.First;
  while not Query2.Eof do begin
       ChildNodeLevel1 := ControlTree.AddChild(MainNodeLevel);
       Data := ControlTree.GetNodeData(ChildNodeLevel1);
       Data.Caption := Query2.FieldByName('DEPNAME').AsString;
       Data.ID := Query2.FieldByName('DEPID').AsInteger;
       Data.Kind := nkDepartment;
       Data.ImageIndex := 0;
       Query1.DisableControls;
       Query1.Close;
       Query1.SQL.Clear;
       Query1.SQL.Add('SELECT * FROM Employee.db WHERE(DEPID=:InputData)');
       Query1.ParamByName('InputData').AsInteger := Data.ID;
       Query1.Prepare;
       Query1.Open;
       Query1.First;
       while not Query1.Eof do begin
          ChildNodeLevel2 := ControlTree.AddChild(ChildNodeLevel1);
          Data := ControlTree.GetNodeData(ChildNodeLevel2);
          Data.Caption := Query1.FieldByName('EMPNAME').AsString;
          Data.ID := Query1.FieldByName('EMPID').AsInteger;
          Data.Kind := nkEmployee;
          Data.ImageIndex := 2;
          Query1.Next;
       end;
       Query1.EnableControls;
       Query1.SQL.Clear;
       Query1.Close;
       Query2.Next;
  end;
  Query2.EnableControls;
  Query2.SQL.Clear;
  Query2.Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Query1.DatabaseName := GetCurrentDir + '\' + 'DataBase';
  Query2.DatabaseName := GetCurrentDir + '\' + 'DataBase';
  LoadGroup;  
end;

procedure TForm1.ControlTreeGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  Data: PEntry;
begin
  Data := Sender.GetNodeData(Node);
  if Data.Kind = nkEmployee then
     CellText := Data.Caption + '(' + IntToStr(Data.ID) + ')'
  else
     CellText := Data.Caption;
end;

procedure TForm1.ControlTreeGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  Data: PEntry;
begin
  Data := Sender.GetNodeData(Node);
  case Kind of
    ikNormal, ikSelected:
      begin
        ImageIndex := Data.ImageIndex;
      end;
  end;

end;

procedure TForm1.ControlTreeGetHint(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex;
  var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: WideString);
var
  Data: PEntry;
begin
  Data := ControlTree.GetNodeData(Node);
  if not Assigned(Data) then Exit;
  
  with Query1 do begin
    try
      DisableControls;
      Close;
      SQL.Clear;
      SQL.Add('SELECT DISTINCT d.*, d1.DEPNAME');
      SQL.Add('FROM "Employee.DB" d,"Department.DB" d1');
      SQL.Add('where (d.EMPID=:Para1) and (d.DEPID=d1.DEPID)');
      ParamByName('Para1').AsInteger := Data.ID;
      Prepare;
      Open;

      if Data.Kind = nkEmployee then
         HintText := '职员编号: ' + IntToStr(Data.ID) + #13#10 +
                     '姓名: ' + Data.Caption + #13#10 +
                     '工资:' + IntToStr(FieldByName('Pay').AsInteger)
      else if  Data.Kind = nkDepartment then
         HintText := '部门名称: ' + Data.Caption
      else
         HintText := '公司名称: ' + Data.Caption;

    finally
      SQL.Clear;
      Close;
      DisableControls;
    end;

  end;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  PNode: PVirtualNode;
  AStr: string;
  EMPID: integer;
begin
  if not InputQuery('公司职员','请输入职员编号:', AStr) then Exit;
  try
    EMPID := StrToInt(AStr);
  except
    MessageDlg('输入的编号无效!',mtError,[mbOK],0);
    Exit;
  end;

  PNode := FindChild(Controltree,Controltree.RootNode,EMPID);
  if PNode<>nil then begin
     Controltree.SetFocus;
     Controltree.Selected[PNode] := True;
     Controltree.FocusedNode := PNode;
  end
  else
    MessageDlg('该职员编号不存在!',mtError,[mbOK],0);

end;

procedure TForm1.ControlTreeFocusChanged(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex);
var
  Data: PEntry;
  EMPPAY: integer;
  S: string;
begin
  Data := ControlTree.GetNodeData(Node);
  if not Assigned(Data) then Exit;

  if Data.Kind = nkEmployee then begin
     with Query1 do begin
       try
         DisableControls;
         Close;
         SQL.Clear;
         SQL.Text := 'SELECT pay FROM Employee.DB WHERE(EMPID=:Para1)';
         ParamByName('Para1').AsInteger := Data.ID;
         Prepare;
         Open;
         EMPPAY := FieldByName('pay').AsInteger;
       finally
         SQL.Clear;
         Close;
         DisableControls;
       end;
     end;
    S := '职员编号: ' + IntToStr(Data.ID) + #13#10 +
         '姓名: ' + Data.Caption + #13#10 +
         '工资:' + IntToStr(EMPPAY);
    Showmessage(S);
  end;  
end;

end.

⌨️ 快捷键说明

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