unit DSelRdpDest; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, VirtualTrees, Vcl.ExtCtrls, RSecuClient; const WM_RESP_DESTLIST = WM_USER + 3945; type PDestEnt = ^TDestEnt; TDestEnt = record sIp, sEmpNo, sAccount, sComName: String; end; TDlgSelRdpDest = class(TForm) pnClient: TPanel; pnBottom: TPanel; vtList: TVirtualStringTree; btnOk: TButton; btnCancel: TButton; 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 btnOkClick(Sender: TObject); private { Private declarations } Client_: TRSecuClient; sSelDestIp_: String; procedure RequestDestList; public { Public declarations } Constructor Create(aOwner: TComponent; aClient: TRSecuClient); procedure process_WM_RESP_DESTLIST(var msg: TMessage); Message WM_RESP_DESTLIST; property SelDestIp: String read sSelDestIp_; end; var DlgSelRdpDest: TDlgSelRdpDest; implementation uses GlobalSocketDefine, Tocsg.Packet, Tocsg.Exception, Tocsg.VTUtil, superobject; {$R *.dfm} Constructor TDlgSelRdpDest.Create(aOwner: TComponent; aClient: TRSecuClient); begin Inherited Create(aOwner); sSelDestIp_ := ''; Client_ := aClient; RequestDestList; end; procedure TDlgSelRdpDest.RequestDestList; var Send: ISendPacket; begin Send := TTgPacket.Create(RS_REQ_RDP_DESTLIST); Send.Handle := Handle; Send.WndMessage := WM_RESP_DESTLIST; Send.S['EmpNo'] := Client_.EmpNo; gClient.SendPacket(Send); end; procedure TDlgSelRdpDest.btnOkClick(Sender: TObject); var pNode: PVirtualNode; pData: PDestEnt; begin pNode := vtList.GetFirstSelected; if pNode = nil then begin MessageBox(Handle, PChar('´ë»ó PC¸¦ ¼±ÅÃÇØ ÁֽʽÿÀ.'), PChar(Caption), MB_ICONWARNING or MB_OK); exit; end; pData := vtList.GetNodeData(pNode); sSelDestIp_ := pData.sIp; ModalResult := mrOk; end; procedure TDlgSelRdpDest.vtListFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var pData: PDestEnt; begin pData := Sender.GetNodeData(Node); Finalize(pData^); end; procedure TDlgSelRdpDest.vtListGetNodeDataSize(Sender: TBaseVirtualTree; var NodeDataSize: Integer); begin NodeDataSize := SizeOf(TDestEnt); end; procedure TDlgSelRdpDest.vtListGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: string); var pData: PDestEnt; begin pData := Sender.GetNodeData(Node); case Column of 0 : CellText := IntToStr(Node.Index + 1); 1 : CellText := pData.sIp; 2 : CellText := pData.sEmpNo; 3 : CellText := pData.sAccount; 4 : CellText := pData.sComName; end; end; procedure TDlgSelRdpDest.process_WM_RESP_DESTLIST(var msg: TMessage); var Rcv: IRcvPacket; i: Integer; pData: PDestEnt; begin try Rcv := IRcvPacket(msg.LParam); vtList.BeginUpdate; try VT_Clear(vtList); if Rcv.O['List'] = nil then exit; if Rcv.O['List'].DataType <> stArray then exit; for i := 0 to Rcv.A['List'].Length - 1 do begin pData := VT_AddChildData(vtList); pData.sIp := Rcv.A['List'].O[i].S['IP']; pData.sEmpNo := Rcv.A['List'].O[i].S['EmpNo']; pData.sAccount := Rcv.A['List'].O[i].S['Account']; pData.sComName := Rcv.A['List'].O[i].S['ComName']; end; finally vtList.EndUpdate; end; except on E: Exception do ETgException.TraceException(Self, E, 'Fail .. process_WM_RESP_DESTLIST()'); end; end; end.