4

以下のコードは、Toolbar2000 から複製したものです。INI ファイルからツールバーの位置とドックの状態を読み取るルーチンの一部です。初期化中にこのルーチンを呼び出します。以下のコードは、メイン フォーム (OwnerComponent) のすべてのコンポーネントを繰り返し処理し、見つかったツールバーの設定を読み込みます。

for I := 0 to OwnerComponent.ComponentCount-1 do begin
  ToolWindow := OwnerComponent.Components[I];  //  <------------------------
....

この繰り返しには時間がかかり (数秒 - フォーム上に 1500 個の奇数のコンポーネントがあります)、示されているポイントで範囲エラーが発生します。このループの実行中に、メイン フォームのコンポーネントから 1 つ以上のアイテムが取り除かれていることを確認したので、最終的にループは、これが発生すると、配列の末尾を超えて 1 つにアクセスしようとします (おそらく、これを次のようにコーディングする方がよいでしょう)。これを防ぐための「downto」for ループ)。

とにかく、メインフォームがコンポーネントを失っている場所を見つける必要があります。これを行う方法について、Delphi 2006 のデバッグのヒントを教えてもらえますか? プログラムのこの時点で、メイン フォーム コンポーネントが解放されることは期待できません。

アップデート

設計時にツールバーのデフォルトのドック位置を再配置したときに、別のツールバーがあったドック サイトではなく、別のツールバーに誤ってドッキングしてしまったことがわかりました。ドッキングして、代わりにドックに追加します。したがって、問題を引き起こした配置は次のとおりです。

Dock 
  Toolbar 1
    Control 1
    Control 2
    Toolbar 2
      Control 3
      Control 4

そして、修正はそれらを次のように配置することでした:

Dock 
  Toolbar 1
    Control 1
    Control 2
  Toolbar 2
    Control 3
    Control 4

ただし、これはまだ TB2k コードのバグを示しています。ネストされたツールバーを処理できるはずだと思われます。

4

2 に答える 2

6

Lieven の回答に加えて、デバッグ dcu を使用して、ループに入る直前に TComponent.Destroy にブレークポイントを設定することもできます。

どちらの場合も、コール スタックを調べて、count への呼び出し/変更がどこから来ているかを確認する必要があります。

ブレークポイントに関する非常に興味深い記事が Cary Jensen によって書かれました: http://caryjensen.blogspot.com/2010/08/breakpoints-with-side-effects.html

于 2011-04-28T06:27:35.490 に答える
3

カウントが変化するたびに中断するには、データ ブレークポイントを追加する必要があります。@Self.FComponents.FCount

  • ComponentCountから値を返すプロパティです。GetComponentCount
  • GetComponentCount戻りますFComponents.Count
  • FComponentsTListプライベートFCount変数を持つインスタンスです。
于 2011-04-28T06:07:53.403 に答える