delphi – 从ListView切换到VirtualStringTree

前端之家收集整理的这篇文章主要介绍了delphi – 从ListView切换到VirtualStringTree前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用VirtualStringTree而不是Listview来构建我的项目,因为速度差异巨大.事情是,即使在通过演示之后,我也无法弄清楚我将如何将其用作ListView.比如,添加,删除,基本上只是使用ListView项目是如此简单,但是当我看到VT时,它变得非常复杂.

我正在寻找的是一个看起来像ListView的VT,子项目等.

以下是使用ListView的一些例程,我想与VT一起使用(这只是一个伪示例:

  1. procedure Add;
  2. begin
  3. with ListView.Items.Add do
  4. Begin
  5. Caption := EditCaption.Text;
  6. SubItems.Add(EditSubItem.Text):
  7. End;
  8.  
  9. end;
  10.  
  11. Procedure ReadItem(I : Integer);
  12. begin
  13.  
  14. ShowMessage(ListView.Items[I].Caption);
  15. ShowMessage(ListView.Items[I].SubItems[0]);
  16.  
  17. end;

当然,还有删除功能,但由于那就像1行,我没有打扰:P

任何人都可以将上面的例子翻译成使用ListView风格的VT吗?

谢谢!

解决方法

  1. procedure Add;
  2. Var
  3. Data: PLogData;
  4. XNode: PVirtualNode;
  5. begin
  6. with vst do
  7. Begin
  8. XNode := AddChild(nil);
  9. ValidateNode(XNode,False);
  10. Data := GetNodeData(Xnode);
  11. Data^.Name:= EditCaption.Text;
  12. Data^.Msg := EditSubItem.Text;
  13. End;
  14.  
  15. end;
  16.  
  17. Procedure ReadItem(I : Integer);
  18. var
  19. Data: PLogData;
  20. begin
  21. if not Assigned(vst.FocusedNode) then Exit;
  22.  
  23. Data := vst.GetNodeData(vst.FocusedNode);
  24. ShowMessage(Data^.Name);
  25. ShowMessage(Data^.Msg);
  26.  
  27. end;

基本上这就是你需要做的,但是VirtualStringTree有很多其他的东西需要一起工作才能完全理解它.一旦你“得到它”,VST就变得简单而有力.以下网页将为您提供帮助:http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus

以下我将添加更多用于简单VST日志显示代码.我将所有代码保存在datamodule中,只需使用Log程序显示信息并将FormMain.vstLog更改为您的…

  1. unit udmVstLog;
  2.  
  3. interface
  4.  
  5. uses
  6. SysUtils,Windows,Forms,Classes,Graphics,VirtualTrees,ActnList,Dialogs,ExtDlgs;
  7.  
  8. type
  9. PLogData = ^TLogData;
  10. TLogData = record
  11. IsErr : Boolean;
  12. Name: String;
  13. Msg : String;
  14. end;
  15.  
  16. type
  17. TdmVstLog = class(TDataModule)
  18. actlst1: TActionList;
  19. actClear: TAction;
  20. actSave: TAction;
  21. actCopyLine2Mem: TAction;
  22. sdlgLog: TSaveTextFileDialog;
  23. procedure DataModuleCreate(Sender: TObject);
  24. procedure actClearExecute(Sender: TObject);
  25. procedure actSaveExecute(Sender: TObject);
  26. procedure actCopyLine2MemExecute(Sender: TObject);
  27. private
  28. { Private declarations }
  29. public
  30. { Public declarations }
  31. procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
  32. procedure VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  33. Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  34. procedure VSTPaintText(Sender: TBaseVirtualTree;
  35. const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  36. TextType: TVSTTextType);
  37. end;
  38.  
  39. procedure Log(aIsErr: Boolean; AName,AMsg: string); overload;
  40. procedure Log(AName,AMsg: string); overload;
  41. procedure Log(AMsg: string); overload;
  42.  
  43. var
  44. dmVstLog: TdmVstLog;
  45.  
  46. implementation
  47.  
  48. uses uFormMain,ClipBrd;
  49.  
  50. {$R *.dfm}
  51. procedure Log(aIsErr: Boolean; AName,AMsg: string);
  52. Var
  53. Data: PLogData;
  54. XNode: PVirtualNode;
  55. begin
  56. XNode:=FormMain.vstLog.AddChild(nil);
  57. FormMain.vstLog.ValidateNode(XNode,False);
  58. Data := FormMain.vstLog.GetNodeData(Xnode);
  59. Data^.IsErr := aIsErr;
  60. if aIsErr then
  61. Data^.Name:= DateTimeToStr(Now) + ' ERROR ' + AName
  62. else
  63. Data^.Name:= DateTimeToStr(Now) + ' INFO ' + AName;
  64. Data^.Msg:= AMsg;
  65. end;
  66.  
  67. procedure Log(AName,AMsg: string);
  68. begin
  69. Log(False,AName,AMsg);
  70. end;
  71.  
  72. procedure Log(AMsg: string);
  73. begin
  74. Log(False,'',AMsg);
  75. end;
  76.  
  77.  
  78.  
  79. // VirtualStringTree Events defined here
  80. procedure TdmVstLog.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
  81. var
  82. Data: PLogData;
  83. begin
  84. Data:=Sender.GetNodeData(Node);
  85. Finalize(Data^);
  86. end;
  87.  
  88. procedure TdmVstLog.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  89. Column: TColumnIndex; TextType: TVSTTextType; var CellText: String);
  90. var
  91. Data: PLogData;
  92. begin
  93. Data := Sender.GetNodeData(Node);
  94. case Column of
  95. 0: CellText := Data^.Name + ' - '+ Data^.Msg;
  96. end;
  97. end;
  98.  
  99. procedure TdmVstLog.VSTPaintText(Sender: TBaseVirtualTree;
  100. const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  101. TextType: TVSTTextType);
  102. Var
  103. Data: PLogData;
  104. begin
  105. Data := Sender.GetNodeData(Node);
  106.  
  107. if Data^.IsErr then
  108. TargetCanvas.Font.Color:=clRed;
  109.  
  110. end;
  111.  
  112. //PopUpMenu Actions defined here!
  113. procedure TdmVstLog.actClearExecute(Sender: TObject);
  114. begin
  115. FormMain.vstLog.Clear;
  116. end;
  117.  
  118. procedure TdmVstLog.actCopyLine2MemExecute(Sender: TObject);
  119. var
  120. Data: PLogData;
  121. begin
  122. if not Assigned(FormMain.vstLog.FocusedNode) then Exit;
  123.  
  124. Data := FormMain.vstLog.GetNodeData(FormMain.vstLog.FocusedNode);
  125. ClipBoard.AsText := Data^.Name + ' - ' + Data^.Msg;
  126. end;
  127.  
  128. procedure TdmVstLog.actSaveExecute(Sender: TObject);
  129. Var
  130. XNode: PVirtualNode;
  131. Data: PLogData;
  132. ts: TStringList;
  133. begin
  134. If FormMain.vstLog.GetFirst = nil then Exit;
  135. XNode:=nil;
  136. if sdlgLog.Execute then begin
  137. ts:= TStringList.create;
  138. try
  139. Repeat
  140. if XNode = nil then XNode:=FormMain.vstLog.GetFirst Else XNode:=FormMain.vstLog.GetNext(XNode);
  141. Data:=FormMain.vstLog.GetNodeData(XNode);
  142. ts.Add(Data^.Name + ' - '+ Data^.Msg);
  143. Until XNode = FormMain.vstLog.GetLast();
  144. ts.SaveToFile(sdlgLog.FileName);
  145. finally
  146. ts.Free;
  147. end;
  148. end;
  149.  
  150. end;
  151.  
  152. // Datamodule Events defined here
  153. procedure TdmVstLog.DataModuleCreate(Sender: TObject);
  154. begin
  155. with FormMain.vstLog do begin
  156. NodeDataSize := SizeOf(TLogData);
  157. OnFreeNode := VSTFreeNode;
  158. OnGetText := VSTGetText;
  159. OnPaintText := VSTPaintText;
  160. end;
  161. end;
  162.  
  163. end.

  1. procedure RemoveSelectedNodes(vst:TVirtualStringTree);
  2. begin
  3. if vst.SelectedCount = 0 then Exit;
  4. vst.BeginUpdate;
  5. vst.DeleteSelectedNodes;
  6. vst.EndUpdate;
  7. end;
  8.  
  9. procedure RemoveAllNodes(vst:TVirtualStringTree);
  10. begin
  11. vst.BeginUpdate;
  12. vst.Clear;
  13. vst.EndUpdate;
  14. end;

猜你在找的Delphi相关文章