フォームを最小化して起動するには
|
(1)メインフォームの場合
メインフォームのWindowStyleをwsMinimizedに設定しておくと自分で起動するときは、最小化されタスクバーに入ります。
しかし、他のAPPから起動する時やAPIのShowWindowやショートカットやタスクトレイなどで起動する時はちょっとやっかいです。
これは、Application(変数)のフォームとメインフォームの同期がとれないからです。これはメインフォームに送られてくるスタイルフラッグに合わせて、Applicationのスタイルを合わせてやる必要があります。
この方法は、MLではいくつも紹介されています。[Delphi-ML:13173] [Delphi-ML:13185]
(混乱ということでは、古いバージョンでは、GetStartupInfoで取得できるwShowWindow値が、CmdShowと必ずしも一致しないという問題や、D2→D3で仕様が変わっているということもあります。)
以下のコードはどうでしょうか。
procedure TForm1.FormCreate(Sender: TObject);
var
SI : TStartupInfo ;
begin
// D4では、常にCmdShow = SI.wShowWindowですが念のため
GetStartupInfo( SI ) ;
CmdShow := SI.wShowWindow ;
// 最小化に関係するスタイルフラッグにすべて対応
case cmdShow of
SW_SHOWMINIMIZED,
SW_MINIMIZE,
SW_SHOWMINNOACTIVE :
Application.Minimize ;// 同期させる
end ;
end;
(2)子フォームの場合
子フォームは、最小化すると、DeskTpo上の左下にタイトルバー風アイコン化されます。これは、子フォームの印みたいなものですが、仕様によっては、タスクバーに入れたい時もあります。市販のソフトでもありますね。このように、タスクバーに入れたいときは、CreateParamsをオーバーライトします。これは、フォームのスタイルをよりApplivationに近づける手法です。
ただし、OnCloseイベントのAction := caFreeと終了の仕方を書かないと閉じられません。
ということで、この子フォームの呼び出しは、
procedure TForm1.Button2Click(Sender: TObject);
begin
if Form2 = nil then Form2 :=TForm2.Create(Application);
ShowWindow(Form2.handle, SW_SHOWMINNOACTIVE);
end;
TForm3 = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
params.ExStyle := params.ExStyle or WS_EX_APPWINDOW;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
Form2 := nil;
end;
とします。[Delphi-ML:7921]
また、タスクバーにも入れたくないときは、
Application.OnMinimize := AppMinimize;
を設定し、
procedure TForm2.AppMinimize(Sender: TObject);
begin
ShowWindow(Form1.Handle, SW_HIDE);
end;
ですね。
|
|