有时,我的项目中出现了EStackOverflow异常。我使用Delphi2010和最新版本的VirtualTreeView。Eurekalog生成的报告包含如下无限循环:
(这是bugreport的“调用堆栈”部分的一部分)
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; 我不能复制bug,但有时会在几个站点中发生。
我如何解决或解决这个问题?
发布于 2013-08-01 07:08:16
在TBaseVirtualTree.SetNodeHeight()中,函数的主体将只输入if Node.NodeHeight <> Value。只有在每次在OnMeasureItem事件处理程序中为一个节点提供不同的值时,才有可能进入这个循环。作为第一个测试,在这里使用一个常量值,看看堆栈溢出是否消失。如果是的话,为计算出的项高度进行调试输出,并仔细检查它们对于节点是否具有确定性。如果不是,这就是问题的根源。然后,降低OnMeasureItem事件处理程序中代码的复杂性,以找到罪魁祸首。
https://stackoverflow.com/questions/17965911
复制相似问题