Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何修复VirtualTreeView中的EStackOverflow?_Delphi_Stack Overflow_Virtualtreeview - Fatal编程技术网

Delphi 如何修复VirtualTreeView中的EStackOverflow?

Delphi 如何修复VirtualTreeView中的EStackOverflow?,delphi,stack-overflow,virtualtreeview,Delphi,Stack Overflow,Virtualtreeview,有时我在项目中遇到EStackOverflow异常。我使用Delphi2010和最新版本的VirtualTreeView。 Eurekalog生成的报告包含如下无限循环: (这是bugreport“调用堆栈”部分的一部分) 所有这些行都位于VirtualTrees.pas中,它是VirtualTreeView的内部模块 附加到控件的事件处理程序包括: 树换 树木崩塌 树焦点改变 树形电极 树根 树亚目 我不能复制这个错误,但它有时会在几个网站上发生 如何修复或解决此问题?在TBaseVi

有时我在项目中遇到EStackOverflow异常。我使用Delphi2010和最新版本的VirtualTreeView。 Eurekalog生成的报告包含如下无限循环:

(这是bugreport“调用堆栈”部分的一部分)

所有这些行都位于VirtualTrees.pas中,它是VirtualTreeView的内部模块

附加到控件的事件处理程序包括:

  • 树换
  • 树木崩塌
  • 树焦点改变
  • 树形电极
  • 树根
  • 树亚目

我不能复制这个错误,但它有时会在几个网站上发生


如何修复或解决此问题?

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;