くろねこがアプリを作るときには、フォームは毎回生成して破棄するタイプにすることにしている。
基本的に自動生成は使わない。自動生成する対象は、最初に使用するメインフォームとメインのデータモジュールだけと言う構成である。
通常のフォームの表示の場合...
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みたいで面白いことに...
コメント (0件)