1

有时我的项目中出现 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;  

我无法重现错误,但有时会在多个站点中发生。

如何修复或解决此问题?

4

1 回答 1

3

TBaseVirtualTree.SetNodeHeight()函数体中只会被输入if Node.NodeHeight <> Value。如果您每次在OnMeasureItem事件处理程序中为一个节点提供不同的值,似乎只有可能进入这个循环。作为第一个测试,在这里使用一个常量值,看看堆栈溢出是否消失。如果是这样,请为您计算的项目高度进行调试输出,并仔细检查它们是否对节点具有确定性。如果不是,这就是问题的根源。然后降低OnMeasureItem事件处理程序中代码的复杂性以找到罪魁祸首。

于 2013-08-01T07:08:16.663 回答