Delphi で初期フォームを非表示にして、次のフォームをメインウィンドウみたいにする

Delphi で初期フォームを非表示にして、次のフォームをメインウィンドウみたいにする

タスクトレイへ常駐したりするアプリケーションでよくあるパターン
TForm1 へトレイアイコンなどを配置して非表示とし
TForm2 をメインウィンドウ的にタスクバーへ表示させる

TForm2 を初期フォームとして、非表示起動させて、そちらへトレイアイコンを配置してもいいような感じがしますが、TForm2 を初期ウィンドウとするとそのフォームを閉じるとアプリが終了してしまいます。
それを阻止しようとして OnCloseで閉じるをキャンセルして隠す処理をしてしまうと、アプリケーションを明確に終了する場合は問題ないのですが、OS終了時にサインアウトが阻止されてしまうという面倒な事につながってしまいます

プロジェクトのフォームで自動生成フォームの順序を
Form1 ←隠すフォーム
Form2 ←メインとして動作させるフォーム
としておき

各フォームのプロパティを
TForm1.Visible = False
TForm2.Visible = False
とします

プロジェクトのソース
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.ShowMainForm := False;
Form2.Visible := True; // 起動時に表示する場合
Application.Run;

Form2へ
public
    procedure CreateParams(var Params: TCreateParams); override;


procedure TForm2.CreateParams(var Params: TCreateParams);
begin
    inherited;
    Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
    Params.WndParent := GetDesktopWindow;
end;
とします

あらかじめ Form2 かタスクトレイ等でアプリケーションを終了する手段を作成しておきましょう
Form1.Close; でアプリケーションは通常終了されます

同様に他のフォームへも CreateParams の記載を行うと、それぞれタスクトレイへ追加することが可能です

コメント