Delphi 如何修复VirtualTreeView中的EStackOverflow?
有时我在项目中遇到EStackOverflow异常。我使用Delphi2010和最新版本的VirtualTreeView。 Eurekalog生成的报告包含如下无限循环: (这是bugreport“调用堆栈”部分的一部分) 所有这些行都位于VirtualTrees.pas中,它是VirtualTreeView的内部模块 附加到控件的事件处理程序包括:Delphi 如何修复VirtualTreeView中的EStackOverflow?,delphi,stack-overflow,virtualtreeview,Delphi,Stack Overflow,Virtualtreeview,有时我在项目中遇到EStackOverflow异常。我使用Delphi2010和最新版本的VirtualTreeView。 Eurekalog生成的报告包含如下无限循环: (这是bugreport“调用堆栈”部分的一部分) 所有这些行都位于VirtualTrees.pas中,它是VirtualTreeView的内部模块 附加到控件的事件处理程序包括: 树换 树木崩塌 树焦点改变 树形电极 树根 树亚目 我不能复制这个错误,但它有时会在几个网站上发生 如何修复或解决此问题?在TBaseVi
- 树换
- 树木崩塌
- 树焦点改变
- 树形电极
- 树根
- 树亚目
如何修复或解决此问题?在
TBaseVirtualTree.setNodeHight()
中,只有当Node.NodeHight值为时,才会输入函数体。只有在每次在OnMeasureItem
事件处理程序中为一个节点提供不同的值时,才能进入此循环。作为第一个测试,在这里使用一个常量值,看看堆栈溢出是否消失。如果是这样,请为计算出的项目高度生成调试输出,并仔细检查它们对于节点是否具有确定性。如果不是,这就是问题的根源。然后降低OnMeasureItem
事件处理程序中代码的复杂性,以找到罪魁祸首。循环之前是什么?在它之前的电话可能会提示是什么触发了它…现在还不清楚到底发生了什么。窗口包含树对象(导航)和嵌入式浏览器(显示信息)。在多次单击或关闭表单后,用户出现错误。我无法重现这个问题,信息是基于错误报告和用户请求的。您的代码(例如事件处理程序中的代码)是否在这个无限递归中执行?若有,我们能看到那个段代码吗?对不起,调用堆栈部分的大小是有限的,所以我并没有关于无限循环源的信息。但在正常情况下似乎反应不够。您为VT实现了哪些事件处理程序?关闭时出现的错误建议查看FreeNode上的,,单击某些绘制或焦点更改事件可能会搞乱某些内容。。。
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
procedure TTrainingForm.TreeMeasureItem(Sender: TBaseVirtualTree;
TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer);
begin
inherited;
if Sender.MultiLine[Node] then
begin
try
TargetCanvas.Font := Sender.Font;
NodeHeight := TVirtualStringTree(Sender).
ComputeNodeHeight(TargetCanvas, Node, 0) + 4;
except
NodeHeight := 24;
end;
end
end;