1

プロジェクトで EStackOverflow 例外が発生することがあります。Delphi 2010 と最新バージョンの VirtualTreeView を使用しています。Eurekalog によって生成されたレポートには、次のような無限ループが含まれています。

(これは、バグレポートの「コール スタック」セクションの一部です)

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

この行はすべて、VirtualTreeView の内部モジュールである VirtualTrees.pas にあります。

スクリーンショット

コントロールにアタッチされたイベント ハンドラーは次のとおりです。

  • ツリーチェンジ
  • ツリーの崩壊
  • TreeFocusChanging
  • TreeFreeNode
  • 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;  

バグを再現することはできませんが、複数のサイトで発生することがあります。

この問題を修正または回避するにはどうすればよいですか?

4

1 に答える 1

3

関数の本体にTBaseVirtualTree.SetNodeHeight()のみ入力されif Node.NodeHeight <> Valueます。OnMeasureItemこのループに入るには、イベント ハンドラーで毎回異なる値を 1 つのノードに指定する場合にのみ可能と思われます。最初のテストとして、ここで定数値を使用して、スタック オーバーフローが消えるかどうかを確認します。その場合は、計算されたアイテムの高さのデバッグ出力を作成し、それらがノードに対して決定論的であるかどうかを注意深く確認してください。そうでない場合、これが問題の原因です。OnMeasureItem次に、イベント ハンドラーのコードの複雑さを軽減して、原因を見つけます。

于 2013-08-01T07:08:16.663 に答える