虚拟树视图垂直滚动的像素,不同的方式,标准德尔福网格,TListView和TTreeView(或大部分我所知道的其他此类管制的)滚动一行,并保持全线可见在任何时候控制的顶部.当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的.使用鼠标滚动时无论如何都没有对齐.
例如,使用Delphi 2007和2009中的Structure窗口可以观察到此行为.
有没有办法设置许多属性以具有标准Windows控件的行为?或者是否有一组补丁来实现这一目标?
如何使用每行上的按钮创建列表视图(或类似文件)?按钮需要能够根据需要在每行上具有不同的文本/颜色.
我确信Virtual Treeview对此非常完美,但我有点迷失它.
谢谢
-Brad
从辅助线程更改VirtualTreeView数据是否安全?如果是,我应该使用关键部分(甚至是Synchronize方法)吗?
我担心当我从另一个线程写入VT的数据记录时,主线程同时调用它的重绘,这个刷新将导致同时读取相同的记录.我补充说我在应用程序中只使用了2个线程.
就像是 ...
type
PSomeRecord = ^TSomeRecord;
TSomeRecord = record
SomeString: string;
SomeInteger: integer;
SomeBoolean: boolean;
end;
...
var FCriticalSection: TRTLCriticalSection; // global for both classes
...
procedure TMyCreatedThread.WriteTheTreeData;
var CurrentData: PSomeRecord;
begin
EnterCriticalSection(FCriticalSection); // I want to protect only the record
CurrentData := MainForm.VST.GetNodeData(MainForm.VST.TopNode);
with CurrentData^ do // I know, the ^ is not necessary but I like it :)
begin
SomeString := 'Is this safe ? What if VT will want this data too ?';
SomeInteger := …Run Code Online (Sandbox Code Playgroud) delphi multithreading synchronization critical-section virtualtreeview
我一直在使用virtualstringtree一段时间了.我将它用于两个不同的东西,首先是作为选择的普通树,显示数据,其次是作为显示SQL语句输出的网格.
加载到树中的所有数据都来自数据库.对于树示例,我有一个parentId字段来区分层次结构,对于网格示例,我只使用带有每个树的自定义记录的SQL语句(这是唯一的).
我的问题与填充树的首选/最佳方式有关.我从VST文档中读到,您应该使用onInitNode事件和rootnodecount.但是我发现使用AddChild()方法非常相似,即使不鼓励它.
让我展示一些(简化的)示例:
Heirarchy
type PData = ^rData;
rData = packed record
ID : Integer;
ParentID : Integer;
Text : WideString;
end;
procedure Loadtree;
var Node : PVirtualNode;
Data : PData;
begin
Q1 := TQuery.Create(Self);
try
Q1.SQL.Add('SELECT * FROM Table');
Q1.Open;
Q1.Filter := 'ParentID = -1'; //to get the root nodes
Q1.Filtered := True;
while not Q1.Eof do
begin
Node := VST.AddChild(nil);
Data := VST.GetNodeData(Node);
Data.ID := Q1.Fields[fldID].AsInteger;
Data.ParentID := Q1.Fields[fldParentID].AsInteger;
Data.Text := Q1.Fields[fldText].AsString;
//now filter the query again …Run Code Online (Sandbox Code Playgroud) 我在哪里可以获得Delphi XE2的VirtualTreeView组件?
我可以在这里看到VirtualTreeView的下载链接:http://www.soft-gems.net/index.php? option = com_content&task = view&id = 30& Itemid = 35
但是没有Delphi XE2的软件包,安装程序也不支持XE2.
仅源代码包仅支持Delphi 2007(前Unicode).
启用toThemeAware时,VirtualTrees.pas 5.0.0版中的复选框处理显示已损坏.csUncheckedNormal的节点被绘制为checked + hot.
要使用DrawElement正确绘制未经检查的主题复选框,Details记录必须为:Element = teButton,Part = 3,State = 5.但是,当节点设置为csUncheckedNormal时,VirtualTrees.pas最终调用DrawElement,State = 1 .
似乎在VirtualTrees中声明了大量的间接和额外的常量,所以我不确定如何最好地解决这个问题.想法欢迎......
(甚至在屏幕上获取TVirtualStringTree并填充一些数据的最小代码在这里发布也有点冗长.除了基础知识之外,重现这一点所需要的只是在TreeOptions.MiscOptions中启用toCheckSupport,并设置Node.CheckType: = InitNode回调中的ctTriStateCheckBox.)
delphi virtualtreeview delphi-xe2 tvirtualstringtree vcl-styles
我在 Delphi XE2 中使用 Virtual TreeView V5.0.1(2012 年 9 月 6 日)。设置CheckBox := True在标题栏属性不启用复选框,所以这里的问题,我该如何启用列标题复选框?

默认情况下使用VirtualTreeView拖动操作时[doCopy,doMove].移动操作由带有小方框的箭头指针指示,复制操作由相同的指针图标指示,但旁边添加了[+].
默认情况下,VT使用复制操作,如果按下修改键(SHIFT键),则会修改操作以移动,从而从指针中删除[+].
这就是我需要的:
任何指向正确方向的指标都值得赞赏.
有一棵树:ROOT - VirtualStringTree(你看不到它,TVirtualStringTree.RootNode)
我可以Drag'n'Drop"我的根节点3"到任何可见节点,但我不能将它返回到defaut位置,到树的根级别.
我试着这样:
//Part of code from OnDragDrop Event of VirtualStringTree
if (Sender.DropTargetNode = Sender.RootNode) then
begin
for i := 0 to high(Nodes) do
begin
LinksTree.MoveTo(Nodes[i], Sender.DropTargetNode, Attachmode, False);
end;
end;
Run Code Online (Sandbox Code Playgroud)
我把鼠标放到了无处,但没有任何反应.在DragOver中,如果DropTarget是VST.RootNode,则接受drop to root.
谁知道,如果我将鼠标拖动到组件的空白区域,如何将节点删除到VST.RootNode?
delphi virtualtreeview delphi-xe tvirtualstringtree delphi-xe4
我目前在我的树的OnBeforeCellPaint事件中使用此代码:
if Node.Index mod 2 = 0 then
begin
TargetCanvas.Brush.Color := clBlack;
TargetCanvas.FillRect(CellRect);
end
else
begin
TargetCanvas.Brush.Color := clPurple;
TargetCanvas.FillRect(CellRect);
end;
Run Code Online (Sandbox Code Playgroud)
为我的节点着色.但是对于隐藏节点,这不起作用,因为索引保持不变.是否有可见的索引或简单的解决方法?
提前致谢.
delphi ×10
virtualtreeview ×10
delphi-xe2 ×3
c++builder ×1
delphi-xe ×1
delphi-xe4 ×1
performance ×1
vcl-styles ×1