5

これは私の最初の投稿ですが、ここに来て、すでに回答された質問の解決策を見つけることで、問題の解決策を何度も見つけたので、コミュニティに感謝したいと思います.

ということで、本題に入りたいと思います。私は Code Gear の Delphi 2007 IDE で作業しています。私はまだ Delphi での作業にかなり慣れていないため、正確には 3 か月も経っていないため、ここで基本的なものが欠落している可能性があるため、これを覚えておいてください。

最初に、問題を取り巻く状況を少し説明したいと思います。特定の時間にタスクを実行するためのスケジューリング ユーティリティを作成しています。使用可能なタスクごとに、そのタスクに関連付けられた 2 つの関連する Delphi フレームがあります。最初のフレームは、そのタスクに固有の詳細を編集するためのもので、2 番目のフレームは、タスクの実行時にランタイム情報を表示するためのものです。

実行中のタスクのリストが保持され、ユーティリティのスクロール ボックスに、ランタイム情報に対応するフレームのリストが表示されます。これらのランタイム フレームは、タスクの開始時と終了時に作成および破棄されます。それが私の問題につながります。

仮想クラス マネージャーを使用して、各タスクで使用可能な表示フレームと編集フレームのリストを保持し、必要に応じてオンザフライで作成します。実行時にすべてが適切に動作します。アプリケーションが実際に閉じられたときに、問題が発生しています。

プログラムは終了時に EAccessViolation 例外を発生させます。IDE を使用して問題を追跡しようとすると、問題に対応する行またはアクションが実際にはコードに存在しません。したがって、バックグラウンドで実行されているクリーンアップ機能の一部である必要があります。

仮想クラス フレームをオンザフライで作成するコードに絞り込みました。そのコードをコメント アウトすると問題なく終了するからです。したがって、このタイプのクラス作成の使用に関連するアクションを実行していないと私は信じています。

var
  tmpCCI: TComponentClassInfExt;
  tmpS: String;
  tc: TComponent;
  bf: TBaseactionedit;
...
begin
...
tc := tmpCCI.fComponentClass.Create(nil);
if tc is TBaseactionedit then
begin
  bf := TBaseActionEdit(tc);
  bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount);
  bf.Visible := False;
  bf.parent := pnlActionEdit;
  bf.Align := alClient;
  bf.Visible := True;
end;
...

これは、仮想クラス マネージャーを使用してフレームを作成する方法の抜粋です。不要になったインスタンスを FreeAndNil で解放しています。アプリケーションを閉じる前にインスタンスを適切に解放したことを確認するために、できる限りトレースしましたが、明らかに何かが欠けています。

では、このようなものをデバッグするためにここからどこへ行くべきかについてのアイデアはありますか?

PS もう一度言いますが、私は新しいので、見逃したもの、見落としたもの、または追加するのを忘れたものがある場合はお知らせください。私の投稿を読んでくれてありがとう!

4

1 に答える 1

2

Destroy 中に含まれているすべてのコントロールを解放するのは、おそらく親です。

于 2011-11-04T14:26:30.513 に答える