記事カテゴリ

ユーザー機能


 2023年1月30日(月) 11:10 JST

[Delphi] フォームの管理を多少楽にする

  • 投稿者:
  • 表示回数
    8,986

くろねこがアプリを作るときには、フォームは毎回生成して破棄するタイプにすることにしている。
基本的に自動生成は使わない。自動生成する対象は、最初に使用するメインフォームとメインのデータモジュールだけと言う構成である。

通常のフォームの表示の場合...

with TXxxFrom.Create(Self) do
  try
    Show;
  finally
  end;

ダイアログフォームの表示の場合...

with TXxxFrom.Create(Self) do
  try
    ShowModal;
  finally
    // 処理内容...
    Release;
  end;

楽にする方法として、フォームで共通になることをテンプレートを作成してそこに記述している。
具体的には、ただのフォームの場合には画面のクローズと同時にそのインスタンスが破棄されるようにしている。
ダイアログの場合には、CALL元でダイアログの内容を参照する可能性が高いから破棄はしていない。

フォームのテンプレートには下記のような処理を追加している。

TXxxFrom.FormCreate(Sender: TObject);
begin
  // Delphiが生成するモード付き画面は、
  // ...Windowsとしては親子関係でないのでこれを設定する
  // ※たまにCALL元画面の裏に隠れてしまう問題を解決
  if (Owner <> nil) and (Owner is TForm) and (fsModal in FormState) then
    SetWindowLong(Handle, GWL_HWNDPARENT, TForm(Owner).Handle);
end;
TXxxFrom.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // ダイアログ(モード付き)の場合には、
  // ...CALL元でダイアログ情報を参照する可能性があるので破棄しない
  if not (fsModal in FormState) then
    Action := caFree;
  // 呼出元(Owner)があれば表示する。しかし、アプリケーションの終了中は除外。
  if (not Application.Terminated) and (Owner <> nil) and (Owner is TForm) then
    TForm(Owner).Show;
end;

ダイアログだけはCALL元で破棄を書かないといけないのは仕方がないな。

蛇足:FormCreate のタイミングで、フォームの Parent プロパティにオーナーフォームへの参照を代入するとMDIみたいで面白いことに...

トラックバック

このエントリのトラックバックURL:
https://www.blackcat.xyz/trackback.php/ProgramingFAQ_del0069

以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。