标签: virtualtreeview

VirtualStringTree CellPaint

好吧,我有以下问题:

我根据一些布尔变量绘制了不同颜色的树状单元格.例:

  • isProcessService,
  • isProcessInDebugger,
  • isProcessService,
  • isProcessElevated,
  • isProcessNet,
  • isProcessOwner,
  • isProcessinJob,
  • isProcessPacked,
  • isProcessMarkedForDeletion,
  • isProcessMarkedForCreation:Boolean;

因此,在BeforeCellPaint中,我将基于那些布尔值绘制单元格背景颜色,如:

procedure TMainForm.ProcessVstBeforeCellPaint(Sender: TBaseVirtualTree;
  TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
  CellPaintMode: TVTCellPaintMode; CellRect: TRect; var ContentRect: TRect);
var
  NodeData: PProcessData;
begin
 if Node = nil then
    Exit;

  NodeData := Sender.GetNodeData(Node);

  if NodeData = nil then
    Exit;

  if (NodeData^.isProcessOwner) then
  begin
    TargetCanvas.Brush.Color := $00AAFFFF;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  end;

  if (NodeData^.isProcessInDebugger) then
  begin
    TargetCanvas.Brush.Color := $00E5A5A5;
    TargetCanvas.FillRect(TargetCanvas.ClipRect);
  end;

    if (NodeData^.pProcessID = 0) or (NodeData^.pProcessID = 4) then
  begin
    TargetCanvas.Brush.Color := $00FFCCAA;
    TargetCanvas.FillRect(TargetCanvas.ClipRect); …

delphi virtualtreeview tvirtualstringtree

5
推荐指数
1
解决办法
2518
查看次数

VirtualStringTree - 在使用对象时更正/处理子节点/子节点的正确方法?

我正在使用Delphi2010并尝试使用VirtualStringTree.

我一直试图让它与对象一起工作,并且在我遵循Philipp Frenzel的Virtual TreeView教程之前没有运气,我在soft-gems.net网站上找到了该教程.到目前为止我提出的工作原理,但我认为我没有正确处理子节点(即子节点).

我唯一能够工作的就是为每个孩子再次链接整个对象,然后只显示我需要的字段 - 但它只是感觉错了.

建议/反馈非常感谢.


我有一些对象列表,我正在尝试与VirtualStringTree连接,我正在尝试实现这样的事情,其中​​一个字段将作为父项的标签,其余字段显示为子节点.

  • 罗伯特莱恩
    • 35
    • 洛杉矶
    • 褐发
  • 简·多伊
    • 19
    • 丹佛
    • 红发

这就是我班级的设置方式.

type
  PTreeData = ^TTreeData;
  TTreeData = record
    FObject : TObject;
  end;

  TCustomerNode = class(TObject)
  private
    fName: string;
    fSex: string;
    fAge: integer;
    fHair: string;
    //...
  public
    property Name: string read fName write fName;
    //...
  end;
Run Code Online (Sandbox Code Playgroud)

一旦我填充了对象,我就将它们添加到另一个基于TList的类(CustomerObjectList),如下所述.

这是我将VirtualStringTree与我的对象列表连接的地方

procedure TfrmMain.btnLoadDataClick(Sender: TObject);
var
  i, j : integer;
  CustomerDataObject: TCustomerNode;
  RootXNode, XNode: PVirtualNode;
  Data: PTreeData;
begin
  vstree.NodeDataSize := SizeOf( TTreeData );

  vstree.BeginUpdate;
  for i …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview delphi-2010 tvirtualstringtree

5
推荐指数
1
解决办法
6466
查看次数

VirtualTreeview拖放以排列列表中的节点

我有一个节点列表.我想添加一个拖放到重新排列的功能,但我不知道该怎么做.

我尝试使用TVirtualStringTree的OnDragDrop事件,但我无法理解.我查看了文档,遗憾的是没有用于普通节点拖放的最小示例代码.

请注意,它只是一个单级列表.没有层次.:)

delphi drag-and-drop virtualtreeview

5
推荐指数
1
解决办法
6167
查看次数

如何构建数据库以进行快速节点访问

我正在寻找一种方法来构建数据库与VirtualTreeView和SQLite数据库,以便快速检索数据.使用VirtualTreeView有一个OnNodeInit事件,但它并不总是适用于此目的.

数据从Usenet新闻组中获取,需要进行线程化.对线程有用的数据是post id(int64,也是主键),引用(引用线程中先前帖子的字符串).

程序在引用中搜索字符串并确定它应该在哪个postid.因此,例如post id = 1234,则下一篇文章可能是1235,然后1236可能是对1234的回复.

这是一个可能的数据库示例:

post id    references    parent id
  1234      .... ....       0
  1235      .... ....       0
  1236      .... ....      1234
Run Code Online (Sandbox Code Playgroud)

所以现在这就是它现在的样子.

现在,问题是如何构建此数据以加快检索速度.如果只有一个根节点,我可以根据数据库条目分配RootNodeCount,然后在OnNodeInit中按要求逐个读取它们.当有子节点时,我需要以某种方式重新排列数据库,以便它知道如何更快地获取子节点,具体取决于打开哪个节点.

我正在考虑分配附加字段"has_subnodes",其中包含以下子节点的ID.单击节点时,它将读取该节点和每个链接节点.

你将如何组织这个数据库,以便在OnNodeInit中很好地阅读它,或者你会使用那个事件吗?也可以使用AddChildNoInit()方法启动节点.欢迎任何想法或指示.

更新(以及我如何解决)

这里提供了一些非虚拟视图相关信息: 在数据库中实现分层数据结构

我最终做的是使用Modified Preorder Tree Traversal在数据库中存储有关节点的信息,并且每次首先请求某个节点时:

a)在内部缓存中查找它基本上与VirtualTreeView结构保持相同的结构.

b)如果在缓存中找到,则删除此缓存条目(它永远不会超过100个项目)

c)如果未找到,则在缓存中添加额外的100个项目(从请求的节点向上50个,向下50个).如果需要,此课程数可以修改为500或1000个项目.还有一些额外的检查可以查看需要读取多少上/下来以避免读取过多的重复条目.

d)如果我需要更高的速度,我可以应用额外的技术 - 根据用户滚动虚拟视图的数量从数据库加载节点 - 类似于std :: vector如何分配内存 - 首先我只加载100个节点,然后如果用户滚动了很多,我加载200,然后400等...越多的用户滚动加载整个树的速度越快,但如果他/她从不滚动,仍然不加载它.

这样,永远不会从数据库加载从未见过的节点.(当它经过点高速缓存为空,从盘需要更多的数据,偶尔短的延迟)和用于与箭头按钮/键滚动它工作正常用于与鼠标滚轮滚动.将滚动条拖动到某个位置(例如从底部到中间)时速度会慢一些,但由于无法立即从磁盘中获取数据,因此可以预期.

最好是我在加载之前预先确定要用于缓存/项目的内存量,滚动速度越快但当然如果数据从未显示则会占用更多内存.

delphi sqlite c++builder hierarchical-data virtualtreeview

5
推荐指数
1
解决办法
2650
查看次数

如何为尚不存在的节点显示虚拟树视图网格线?

我在Delphi 7中使用SoftGem的VirtualStringTree.

有没有办法启用完整的网格线(就像在TListView中一样)?我只能找到toShowHorzGridLines,它只显示当前节点的行,而不是下面空白空间中的任何内容,并且toShowVertGridLines只显示垂直线.

如何在添加项目之前在空白区域中显示它们?

delphi gridlines virtualtreeview

5
推荐指数
1
解决办法
2291
查看次数

如何在自动调整大小时调整Virtual TreeView列的缩进?

我想在VirtualStringTree中使我的列在自动调整列大小时在内容的左侧和右侧具有相同的缩进.

看一下我的样本VST,打开Header Option hoDblClickResize.

VST样本图像

在这张图片中,我双击列标题以自动调整"时间"列的大小.我强调了列的左侧和右侧之间的缩进差异.

如何调整VST,使右缩进与左缩进的大小相同?我是否必须破解VST源代码?如果是这样,有人能指出我在代码中的正确位置吗?

delphi virtualtreeview

5
推荐指数
1
解决办法
948
查看次数

VirtualStringTree - 指针存储<>指针检索!我的编码方法有误吗?

我正在使用TVirtualStringTree来存储指向记录的指针.

最初有一个包含记录列表的TList.

我正在使用OnInitNode事件迭代TList并将每个记录的数据分配给树的节点.

但是,在检索与OnNewText事件处理程序中的节点关联的数据时,返回的指针具有与最初存储在树中的指针不同的地址.

此外,我可以通过调试从节点中检索到的指针(该记录的数据)是看一样最初存储在该节点的一个.我需要将更改的数据保存到数据库,并需要使用更改的数据引用记录.引用指针应该很简单,但问题是指针不一样.

我不确定我做错了什么,希望有人可以帮我解决这个问题.

提前致谢.

这是我的代码:

数据结构和声明:

  TTherapData = record
    TherapID: Integer;
    TherapName: String[120];
    TherapInstr: String[120];
    Selected_DB: Byte;
    Selected: Byte;
  end;

  PTherapData = ^TTherapData;

  FTherapDataList: TList<PTherapData>;

  FTherapDataListAsg_Iter: Integer;

  vstRxList_Asg: TVirtualStringTree;
Run Code Online (Sandbox Code Playgroud)

将数据加载到TList中,然后加载到树中:

procedure TfmPatient_Conslt.LoadTherapList(const ADBLoad: Boolean = False);
var
  TherapData: PTherapData;
  d, x: Integer;
begin
    datamod.uspLKTHERAP_S.First;
    while not datamod.uspLKTHERAP_S.Eof do
    begin
      New(TherapData);

      TherapData^.TherapID := datamod.uspLKTHERAP_SROW_ID.AsInteger;
      TherapData^.TherapName := datamod.uspLKTHERAP_SIMPRTHERAP.AsString;
      TherapData^.TherapInstr := EmptyStr;
      TherapData^.Selected := 0;
      TherapData^.Selected_DB := 0;

      FTherapDataList.Add(TherapData);

      datamod.uspLKTHERAP_S.Next;
    end;


    datamod.uspCONSLT_RX_S.First;
    while not datamod.uspCONSLT_RX_S.Eof do
    begin
      d …
Run Code Online (Sandbox Code Playgroud)

delphi virtualtreeview tvirtualstringtree

5
推荐指数
1
解决办法
271
查看次数

不调用初始化部分

我正在为Delphi和C++ Builder维护VirtualTreeView组件.使用Delphi一切都很好但是当我使用C++ Builder编译软件包时,Delphi单元初始化部分中的代码不会被调用.有任何想法吗?

delphi linker initialization c++builder virtualtreeview

5
推荐指数
1
解决办法
383
查看次数

如何在Virtual Treeview中隐藏展开/折叠按钮?

我使用VirtualStringTree(VST)来显示分组的数据,标题详细信息.我需要有一个选项允许用户展开,折叠标题以查看详细信息,在某些情况下我需要将数据显示为静态视图,在这里他们无法展开,折叠,只能看到完整展开的树:

以下是用户可以展开的示例,使用子节点折叠节点:

在此输入图像描述

这是一个示例,当我想阻止用户展开/折叠节点并始终看到所有展开(或显示的任何内容):

在此输入图像描述

在此测试中,我通过'允许展开/折叠/复选框控制.

我通过添加以下内容来防止展开,折

Allowed:=CheckBox1.Checked;
Run Code Online (Sandbox Code Playgroud)

进入OnCollapsing/OnExpanding:

procedure TMainForm.VSTCollapsing(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
begin
  Allowed:=CheckBox1.Checked;
end;

procedure TMainForm.VSTExpanding(Sender: TBaseVirtualTree;
  Node: PVirtualNode; var Allowed: Boolean);
begin
  Allowed:=CheckBox1.Checked;
end;
Run Code Online (Sandbox Code Playgroud)

我还基于复选框显示/隐藏TreeLines

procedure TMainForm.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    VST.TreeOptions.PaintOptions:=VST.TreeOptions.PaintOptions + [toShowTreeLines]
  else
    VST.TreeOptions.PaintOptions:=VST.TreeOptions.PaintOptions - [toShowTreeLines];
end;
Run Code Online (Sandbox Code Playgroud)

当我想阻止用户展开,折叠节点时,如何隐藏这个小加号.有什么建议?


编辑:

为了清除与表单图标的混淆,这是来自Virtual Treeivew 5演示库的演示项目.IDE中的表单具有Delphi XE7图标,在运行项目时会出现这个旧图标.不知道为什么.只是想确保我使用XE7而不是任何旧的Delphi版本,其中相同的解决方案可能不适用.

在IDE中,图标如果为XE7图标:

在此输入图像描述

delphi virtualtreeview delphi-xe7

5
推荐指数
1
解决办法
1215
查看次数

如何进行虚拟Treeview控制以始终按行滚动?

虚拟树视图垂直滚动的像素,不同的方式,标准德尔福网格,TListViewTTreeView(或大部分我所知道的其他此类管制的)滚动一行,并保持全线可见在任何时候控制的顶部.当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的.使用鼠标滚动时无论如何都没有对齐.

例如,使用Delphi 2007和2009中的Structure窗口可以观察到此行为.

有没有办法设置许多属性以具有标准Windows控件的行为?或者是否有一组补丁来实现这一目标?

delphi virtualtreeview

4
推荐指数
2
解决办法
2648
查看次数