我正在尝试使用VirtualStringTree而不是Listview来构建我的项目,因为速度差异巨大.事情是,即使在通过演示之后,我也无法弄清楚我将如何将其用作ListView.比如,添加,删除,基本上只是使用ListView项目是如此简单,但是当我看到VT时,它变得非常复杂.
我正在寻找的是一个看起来像ListView的VT,子项目等.
以下是使用ListView的一些例程,我想与VT一起使用(这只是一个伪示例:
procedure Add; begin with ListView.Items.Add do Begin Caption := EditCaption.Text; SubItems.Add(EditSubItem.Text): End; end; Procedure ReadItem(I : Integer); begin ShowMessage(ListView.Items[I].Caption); ShowMessage(ListView.Items[I].SubItems[0]); end;
任何人都可以将上面的例子翻译成使用ListView风格的VT吗?
谢谢!
解决方法
procedure Add; Var Data: PLogData; XNode: PVirtualNode; begin with vst do Begin XNode := AddChild(nil); ValidateNode(XNode,False); Data := GetNodeData(Xnode); Data^.Name:= EditCaption.Text; Data^.Msg := EditSubItem.Text; End; end; Procedure ReadItem(I : Integer); var Data: PLogData; begin if not Assigned(vst.FocusedNode) then Exit; Data := vst.GetNodeData(vst.FocusedNode); ShowMessage(Data^.Name); ShowMessage(Data^.Msg); end;
基本上这就是你需要做的,但是VirtualStringTree有很多其他的东西需要一起工作才能完全理解它.一旦你“得到它”,VST就变得简单而有力.以下网页将为您提供帮助:http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus
以下我将添加更多用于简单VST日志显示的代码.我将所有代码保存在datamodule中,只需使用Log程序显示信息并将FormMain.vstLog更改为您的…
unit udmVstLog; interface uses SysUtils,Windows,Forms,Classes,Graphics,VirtualTrees,ActnList,Dialogs,ExtDlgs; type PLogData = ^TLogData; TLogData = record IsErr : Boolean; Name: String; Msg : String; end; type TdmVstLog = class(TDataModule) actlst1: TActionList; actClear: TAction; actSave: TAction; actCopyLine2Mem: TAction; sdlgLog: TSaveTextFileDialog; procedure DataModuleCreate(Sender: TObject); procedure actClearExecute(Sender: TObject); procedure actSaveExecute(Sender: TObject); procedure actCopyLine2MemExecute(Sender: TObject); private { Private declarations } public { Public declarations } procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); procedure VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); end; procedure Log(aIsErr: Boolean; AName,AMsg: string); overload; procedure Log(AName,AMsg: string); overload; procedure Log(AMsg: string); overload; var dmVstLog: TdmVstLog; implementation uses uFormMain,ClipBrd; {$R *.dfm} procedure Log(aIsErr: Boolean; AName,AMsg: string); Var Data: PLogData; XNode: PVirtualNode; begin XNode:=FormMain.vstLog.AddChild(nil); FormMain.vstLog.ValidateNode(XNode,False); Data := FormMain.vstLog.GetNodeData(Xnode); Data^.IsErr := aIsErr; if aIsErr then Data^.Name:= DateTimeToStr(Now) + ' ERROR ' + AName else Data^.Name:= DateTimeToStr(Now) + ' INFO ' + AName; Data^.Msg:= AMsg; end; procedure Log(AName,AMsg: string); begin Log(False,AName,AMsg); end; procedure Log(AMsg: string); begin Log(False,'',AMsg); end; // VirtualStringTree Events defined here procedure TdmVstLog.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); var Data: PLogData; begin Data:=Sender.GetNodeData(Node); Finalize(Data^); end; procedure TdmVstLog.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: String); var Data: PLogData; begin Data := Sender.GetNodeData(Node); case Column of 0: CellText := Data^.Name + ' - '+ Data^.Msg; end; end; procedure TdmVstLog.VSTPaintText(Sender: TBaseVirtualTree; const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType); Var Data: PLogData; begin Data := Sender.GetNodeData(Node); if Data^.IsErr then TargetCanvas.Font.Color:=clRed; end; //PopUpMenu Actions defined here! procedure TdmVstLog.actClearExecute(Sender: TObject); begin FormMain.vstLog.Clear; end; procedure TdmVstLog.actCopyLine2MemExecute(Sender: TObject); var Data: PLogData; begin if not Assigned(FormMain.vstLog.FocusedNode) then Exit; Data := FormMain.vstLog.GetNodeData(FormMain.vstLog.FocusedNode); ClipBoard.AsText := Data^.Name + ' - ' + Data^.Msg; end; procedure TdmVstLog.actSaveExecute(Sender: TObject); Var XNode: PVirtualNode; Data: PLogData; ts: TStringList; begin If FormMain.vstLog.GetFirst = nil then Exit; XNode:=nil; if sdlgLog.Execute then begin ts:= TStringList.create; try Repeat if XNode = nil then XNode:=FormMain.vstLog.GetFirst Else XNode:=FormMain.vstLog.GetNext(XNode); Data:=FormMain.vstLog.GetNodeData(XNode); ts.Add(Data^.Name + ' - '+ Data^.Msg); Until XNode = FormMain.vstLog.GetLast(); ts.SaveToFile(sdlgLog.FileName); finally ts.Free; end; end; end; // Datamodule Events defined here procedure TdmVstLog.DataModuleCreate(Sender: TObject); begin with FormMain.vstLog do begin NodeDataSize := SizeOf(TLogData); OnFreeNode := VSTFreeNode; OnGetText := VSTGetText; OnPaintText := VSTPaintText; end; end; end.
…
procedure RemoveSelectedNodes(vst:TVirtualStringTree); begin if vst.SelectedCount = 0 then Exit; vst.BeginUpdate; vst.DeleteSelectedNodes; vst.EndUpdate; end; procedure RemoveAllNodes(vst:TVirtualStringTree); begin vst.BeginUpdate; vst.Clear; vst.EndUpdate; end;