Delphi2007で記述されたMDIアプリケーションがあります。
コードの実行中にユーザーがフォームを終了すると、例外が発生します。これは、コードがコンポーネントを更新しようとしている、またはフォームで解放されたオブジェクトを使用しようとしているためです。
とにかく、終了イベントでコードが実行されているかどうかを知ることができますか、それともこの状況に対処するための標準的な方法がありますか?
より多くの情報で更新
例外は通常、次の状況で発生します。
子mdiフォームのボタンを押すと、フォーム内の関数がアクティブになります。関数はデータベースに移動してデータを取得し、再フォーマットしてフォームのビジュアルコンポーネント(TListViewを使用可能)に表示します。 )。
コードの実行に時間がかかる場合(処理するデータが多い場合など)、ユーザーは興味を失い、閉じるボタンをクリックします(これを回避するためにコードの速度が調整されています)。
関数内のコードは、それが属するフォームが解放されていても(コードはフォームのプライベートセクションにあります)、ビジュアルコンポーネントを更新しようとすると、存在しなくなります(解放されたため)。フォーム)そしてそれは例外をスローします。
子フォームのコードは、これが発生したときに通常はループ内にあり、レコードを循環させ、それに応じてリストビューを更新します。ループには、次のようなコードが含まれています。
inc(i);
if (i mod 25) = 0 then
begin
StatusPnl.Caption := 'Loading ' + intToStr(i) + ', Please wait';
application.ProcessMessages;
end;
その他のコードサンプル
fromCloseイベントは次のようになります
//Snip
if (Not (Owner = nil)) then
with (Owner as IMainForm)do
begin
//Snip
DoFormFree(Self,Self.Name);
end
else
//Snip
DoFormFreeは、メインのmdi親フォームの関数であり、次のようになります。
//Snip
(G_FormList.Objects[x] as TBaseForm).Release;
G_FormList.Objects[i] := nil;
G_FormList.Delete(i);
//Snip
さまざまな理由から、すべてのフォームはリストに格納され、すべての子フォームはTBaseFormクラスを拡張します。
理想的には、フォーム内のコードが実行されているかどうかを確認し、ユーザーがフォームを閉じないようにするか、コードが終了するまで非表示にする方法が必要です。場合によっては、レポートが生成され、ステータスパネルとして更新されることがあります。例外が発生します。その場合、レポートは不完全になります。
すべてのフォームはTbaseのサブクラスであるため、これを行うためのグローバルな方法が理想的であるため、コードをベースフォームに追加して、すべての子孫フォームで機能させることができます。