有时我的项目中出现 EStackOverflow 异常。我使用 Delphi 2010 和最新版本的 VirtualTreeView。Eurekalog 生成的报告包含这样的无限循环:
(这是错误报告的“调用堆栈”部分的一部分)
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
所有这些行都在 VirtualTrees.pas 中,VirtualTreeView 的内部模块
附加到控件的事件处理程序是:
- 树变
- 树倒塌
- 树焦点改变
- 树自由节点
- 树获取提示
- 树测量项
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;
我无法重现错误,但有时会在多个站点中发生。
如何修复或解决此问题?