有没有人碰巧知道是否有正在准备的流行VirtualTreeView的Firemonkey版本?此外,是否有人收集了一些将自定义控件移植到Firemonkey的经验,并且可以估算将虚拟树视图移植到Firemonkey的工作量?我们需要这个控件,如果我们可以让这个控件工作,切换到Firemonkey只是一个选项.
谢谢!
对于那些自己没有遇到问题的人来说,这个问题似乎是显而易见的.
我需要处理VTV中的选择变化.我有一个平面的节点列表.我需要随时处理所有当前选定的节点
这是最常见和预期的行为,就像Windows资源管理器一样:当您使用鼠标和/或键盘选择文件时,信息面板会显示其属性.我只需要那个.这就是我陷入困境的地方.
我的一些研究如下.
起初我使用OnChange.它似乎工作得很好,但我注意到一些奇怪的闪烁,我发现在最常见的情况下(选择一个节点,用户点击另一个节点)OnChange被触发两次:
这个问题是可谷歌的,所以我发现人们使用OnFocusChange和OnFocusChanging而不是OnChange.但这种方式仅适用于单一选择.通过多个选择,拖动选择和导航键,这不起作用.在某些情况下,Focus事件甚至根本不会触发(例如,通过单击空白区域删除选择).
我做了一些调试输出研究,以了解这些处理程序如何在不同的场景中被解雇.我发现的是一团糟,没有任何明显的感觉或模式.
C OnChange
FC OnFocusChange
FCg OnFocusChanging
- nil parameter
* non-nil parameter
! valid selection
Nodes User action Handlers fired (in order)
selected
0 Click node FCg-* C*!
1 Click same FCg**
1 Click another C- FCg** C*! FC*
1 Ctlr + Click same FCg** C*!
1 Ctrl + Click another FCg** C*! FC*
1 Shift + Click same FCg** C*!
1 Shift + Click another …
Run Code Online (Sandbox Code Playgroud) 我需要填写(黑色)我在下面的图片中突出显示的小白方块.
我试过添加额外的列.我试过扩展PaintInfo.PaintRectangle.我已经尝试了我能想到的Amount列上的每个设置.我没有想法.
任何人对如何做到这一点都有任何想法?
以下是执行自定义标题绘制的代码.(原谅with
声明,不是我原来的代码....)
procedure TWinPOSReceiptPluginForm.ReceiptDisplayTreeAdvancedHeaderDraw(Sender: TVTHeader; var PaintInfo: THeaderPaintInfo;
const Elements: THeaderPaintElements);
var
TempText: string;
begin
with PaintInfo do
begin
// First check the column member. If it is NoColumn then it's about the header background.
if (hpeBackground in Elements) and (Column <> nil) then begin
TempText := Column.Text;
TargetCanvas.Brush.Color := $444444;
TargetCanvas.FillRect(PaintRectangle);
TargetCanvas.Font.Color := clWhite;
TargetCanvas.Font.Style := [];
TargetCanvas.TextOut (PaintRectangle.Left + 3, PaintRectangle.Top + 3, TempText);
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
从1年开始,我们就开始在Delphi7中使用VirtualTreeView v5.5.3,非常喜欢!
我们想充分利用该组件的潜力,但是BeginSynch
帮助文件中只有很少的关于该方法的信息。
什么时候应该BeginSynch + EndSynch
使用BeginUpdate + EndUpdate
?
哪一个应嵌套在另一个中?
在这种情况下可以使用哪些方法?(Sort
,ScrollIntoView
,MoveTo
,NodeHeight
,isVisible[]
,...),以组画的操作,以加快应用程序之前?
Mike Lischke的虚拟树视图在网络上和第三方组件中都很受欢迎.我刚刚在我的机器上下载了4.8.7版本.
我有两个分区的Delphi 2010和Delphi 7.0.
Aftter单击虚拟树视图的安装程序,提示日志文件,说已成功安装.
我检查Delphi 2010,是的,它是在显示3个控件的组件面板上.
但是当我启动Delphi 7.0时,IDE会提示"无法加载VirtualtreesD7.bpl ...".我忽略它,发现虚拟树视图设计时包在列表中,但是UNCHECKED.如果我尝试检查它,它再次承诺"无法加载virtualtreesD7 ......".
我搜索整个磁盘并找到VirtualTreesD7D.bpl,并在设计时包列表中手动添加它.它是带有3个控件的调色板.
我快速测试并退出Delphi 7.0.但是,当我重新启动Delphi 7.0时,它再次提示"无法加载VirtualtreesD7.bpl ...",它再次不在palatte而不是在设计时包列表中检查.
这是一个非常简单的问题.你能告诉我怎么解决吗?非常感谢你提前.
编辑:
感谢您的评论.
我测试了你的评论,但没有成功.
新问题:
如果我通过单击unins000.exe卸载虚拟树视图并仅在Delphi 7.0中重新安装它,安装程序会在最后一个屏幕提示''... completed .."并且没有错误提示.当我启动Delphi 7时,虚拟树视图设计时间包不在包列表中.这比上次更糟糕(上次它在包列表中但未检查).
我仔细检查该日志文件的一行一行,它说:
...
...
VirtualTreesD7.dpk(39)
VirtualTreesD7.dpk(39)
VirtualTreesD7.dpk(41)
VirtualTreesD7.dpk(43)
**VirtualTreesD7D.dpk(32) Fatal: Required package 'VirtualTreesD7' not found**
Run Code Online (Sandbox Code Playgroud)
为什么?为什么它没有成功安装,也没有在上次安装屏幕中提示安装错误.
如何解决这个"致命......未找到"的问题.
谢谢大家的帮助.
新编辑:(这是答案吗?)
首先感谢您的帮助和建议.
我需要2个小时来测试并找到可能的解决方案.它适用于我的机器,可以安装在Delphi 7.0中.
脚步:
1. uninstall virtual treeview by clicking unins000.exe from Delphi 7.0 ( you can separately install virtual treeview in Delphi 2010)
2. clicking newly downloaded VirtualTreeview setup 4.8.7.exe, install it in Delphi …
Run Code Online (Sandbox Code Playgroud) 我使用TVirtualTreeView作为旧TStringgrid的绝佳替代品.
在我遗漏的一个特征上,是可以选择任何单元格区域(除了单个列,行或整个区域).
我找不到任何解决方案,有人有建议吗?
我正在为delphi 2009使用虚拟树列表.我创建了一个包含以下数据的树:
type
PTreeData = ^TTreeData;
TTreeData = record
FCaption: String;
FPath: String;
end;
Run Code Online (Sandbox Code Playgroud)
我想按特定顺序迭代所有元素.我需要获取第一个顶级节点,然后遍历其所有子节点并修改FPath
字段.当我完成它的孩子时,我想获得另一个顶级节点,依此类推.
首先,我不知道如何在顶级节点上进行迭代.
提前感谢您对此提出的任何建议
我正在尝试创建一个TVirtualStringTree
类似于以下内容的视图:
在上面的例子中,我展示了一些我想要达到的可能场景.FolderA具有粗体文本,之后在同一节点中位于其后面的红色非压缩文本.我正在寻找制作这种输出的方法.
但是,如果创建太难或太难,我会对FolderB或FolderC类型的输出感到满意- 这可能是由2列组成的,一列包含文件夹名称,另一列包含内部文件的数量.
FolderD在这里仅作为没有文件的文件夹的示例和该文件夹的输出(文本是非文本的,没有数字).
我正在寻找任何方向如何产生这种效果,因为似乎VirtualTreeView每个节点只能有单色或粗体设置.任何提示或建议如何向FolderA或FolderB或FolderC的方向移动高度赞赏,所以我有一个起点.Delphi或C++ Builder示例都是受欢迎的(最终代码将在C++ Builder中).
我有一个类型的组件TVirtualStringTree
(让我们称之为VST
).它具有列表形式的节点,即所有节点处于同一级别.我想在删除节点后使用该DeleteNode
方法更改焦点并使用OnFreeNode
事件:
procedure TMyForm.VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
NewFocus: PVirtualNode;
begin
NewFocus := VST.GetNext(Node);
if not Assigned(newFocus) then
NewFocus := VST.GetPrevious(Node);
if Assigned(NewFocus) then
begin
VST.FocusedNode := NewFocus;
VST.Selected[NewFocus] := True
end;
end;
Run Code Online (Sandbox Code Playgroud)
我还希望更改引起一些反应,例如设置Enabled
按钮的属性:
procedure TMyForm.VSTFocusChanged(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex);
begin
btn1.Enabled := Assigned(Node);
end;
Run Code Online (Sandbox Code Playgroud)
但是解决方案存在一些问题.例如,当我使用"取消"按钮关闭表单(表单是使用ShowModal
方法打开)时,节点被释放,VSTFocusChanged
被触发,并且由于nil按钮,后者会抛出异常.当然,我可以检查按钮是否已分配,但在删除节点后是否有更优雅的解决方案更改焦点而没有这种不良影响(并且没有其他不良影响)?