gpt4 book ai didi

delphi - 如何修复 VirtualTreeView 中的 EStackOverflow?

转载 作者:行者123 更新时间:2023-12-03 19:41:56 25 4
gpt4 key购买 nike

有时我的项目中出现 EStackOverflow 异常。我使用 Delphi 2010 和最新版本的 VirtualTreeView。
Eurekalog 生成的报告包含这样的无限循环:

(这是错误报告的“调用堆栈”部分的一部分)

SetNodeHeight            
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect
InvalidateToBottom
SetNodeHeight
MeasureItemHeight
GetNodeHeight
GetDisplayRect

所有这些行都在 VirtualTrees.pas 中,VirtualTreeView 的内部模块

screenshot

附加到控件的事件处理程序是:
  • 树变
  • 树折叠
  • TreeFocusChanging
  • 树自由节点
  • TreeGetHint
  • TreeMeasureItem

  • 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;

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

    如何修复或解决此问题?

    最佳答案

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

    关于delphi - 如何修复 VirtualTreeView 中的 EStackOverflow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17965911/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com