unit DReqPrintList; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, VirtualTrees, Vcl.ExtCtrls, System.Generics.Collections, Vcl.Menus; type PReqEnt = ^TReqEnt; TReqEnt = record dtReg: TDateTime; sDocId, sDocName, sPath: String; nPageCnt: Integer; end; TDlgReqPrintList = class(TForm) vtList: TVirtualStringTree; popFun: TPopupMenu; miDel: TMenuItem; miDoPrint: TMenuItem; procedure vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); procedure vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); procedure miDelClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure miDoPrintClick(Sender: TObject); private { Private declarations } procedure RefreshList; public { Public declarations } Constructor Create(aOwner: TComponent); override; end; var DlgReqPrintList: TDlgReqPrintList; implementation uses Tocsg.VTUtil, ManagerService, ManagerPrint, Tocsg.Safe; {$R *.dfm} Constructor TDlgReqPrintList.Create(aOwner: TComponent); begin Inherited Create(aOwner); RefreshList end; procedure TDlgReqPrintList.FormClose(Sender: TObject; var Action: TCloseAction); begin Action := TCloseAction.caFree; end; procedure TDlgReqPrintList.miDelClick(Sender: TObject); var pNode: PVirtualNode; pData: PReqEnt; begin pNode := vtList.GetFirstSelected; if pNode = nil then exit; if MessageBox(Handle, PChar('삭제하시겠습니까?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; vtList.BeginUpdate; try pData := vtList.GetNodeData(pNode); gMgSvc.MgPrt.DelPrintInfo(pData.sDocId, true); vtList.DeleteNode(pNode); finally vtList.EndUpdate; end; end; procedure TDlgReqPrintList.miDoPrintClick(Sender: TObject); var pNode: PVirtualNode; pData: PReqEnt; pEnt: PPrtEnt; begin pNode := vtList.GetFirstSelected; if pNode = nil then exit; if MessageBox(Handle, PChar('출력하시겠습니까?'), PChar(Caption), MB_ICONQUESTION or MB_YESNO) = IDNO then exit; vtList.BeginUpdate; try pData := vtList.GetNodeData(pNode); pEnt := gMgSvc.MgPrt.GetPrintInfo(pData.sDocId); if pEnt <> nil then gMgSvc.DoPrint(pEnt); finally vtList.EndUpdate; end; end; procedure TDlgReqPrintList.RefreshList; var enum: TEnumerator; pData: PReqEnt; begin vtList.BeginUpdate; try VT_Clear(vtList); Guard(enum, gMgSvc.MgPrt.GetEnts); while enum.MoveNext do begin pData := VT_AddChildData(vtList); pData.dtReg := enum.Current.dtReg; pData.sDocId := enum.Current.sId; pData.sDocName := enum.Current.WInfo.sDocName; pData.sPath := enum.Current.sFPath; end; finally vtList.EndUpdate; end; end; procedure TDlgReqPrintList.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PReqEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgReqPrintList.vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TReqEnt); end; procedure TDlgReqPrintList.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PReqEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := DateTimeToStr(pData.dtReg); 2 : CellText := pData.sDocName; 3 : CellText := IntToStr(pData.nPageCnt); 4 : CellText := pData.sPath; end; end; end.