unit DSelPerInfo; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, VirtualTrees, ManagerPerInfo; type TDlgSelPerInfo = class(TForm) pnClient: TPanel; pnBottom: TPanel; btnOk: TButton; btnCancel: TButton; vtList: TVirtualStringTree; procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure btnOkClick(Sender: TObject); procedure vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); private { Private declarations } PerList_: TPerInfoEntList; SelEnt_: PPerInfoEnt; procedure RefreshList; public { Public declarations } Constructor Create(aOwner: TComponent; aList: TPerInfoEntList); property SelEnt: PPerInfoEnt read SelEnt_; end; var DlgSelPerInfo: TDlgSelPerInfo; implementation uses Tocsg.VirtualTreeViewUtil, Tocsg.Strings; {$R *.dfm} Constructor TDlgSelPerInfo.Create(aOwner: TComponent; aList: TPerInfoEntList); begin Inherited Create(aOwner); SelEnt_ := nil; PerList_ := aList; ASSERT(PerList_ <> nil); RefreshList; end; procedure TDlgSelPerInfo.RefreshList; var i: Integer; pData: PPerInfoEnt; begin vtList.BeginUpdate; try VT_Clear(vtList); for i := 0 to PerList_.Count - 1 do begin pData := VT_AddChildData(vtLIst); pData^ := PerList_[i]^; end; finally vtList.EndUpdate; end; end; procedure TDlgSelPerInfo.btnOkClick(Sender: TObject); begin SelEnt_ := VT_Get1SelNodeData(vtList); if SelEnt_ = nil then begin MessageBox(Handle, PChar('°Ë»ç °á°ú¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; ModalResult := mrOk; end; procedure TDlgSelPerInfo.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PPerInfoEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgSelPerInfo.vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TPerInfoEnt); end; procedure TDlgSelPerInfo.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PPerInfoEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := DateTimeToStr(pData.dtBegin); 2 : CellText := pData.sTime; 3 : CellText := InsertPointComma(pData.dwVulFileCnt, 3); end; end; end.