以下の VCL フォーム アプリケーションでは、Application.MainForm が非表示になり、代わりに別の TForm の子孫が表示されます。奇妙なことに、この TForm の子孫の名前が「TForm」で始まる場合にのみ、Alt+Tab を押したときに表示されます。その名前が「TForm」で始まらない場合、Alt+Tab を押しても表示されません。上記は、Windows 10 Ann Edition x64 上の Delphi XE-Berlin でテストされています。
ここでクラス名が重要な理由についてコメントしていただけませんか? O_O
さらに、TForm の子孫のクラス名は別の場所で重要ですか?
プログラム
program Strange;
uses
Forms,
uHiddenMainForm in 'uHiddenMainForm.pas' {HiddenMainForm},
uActualMainForm in 'uActualMainForm.pas' {FormActualMainForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(THiddenMainForm, HiddenMainForm); // Note: WRONG ! Still, interesting strangeness.
Application.ShowMainForm := False;
Application.MainFormOnTaskbar := True;
// Application.CreateForm(THiddenMainForm, HiddenMainForm); // Note: CORRECT
with TFormActualMainForm.Create(HiddenMainForm) do
begin
Show;
Update;
end;
Application.Run;
end.
メイン フォームのユニット (つまり、Application.MainForm)
unit uHiddenMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
THiddenMainForm = class(TForm)
end;
var
HiddenMainForm: THiddenMainForm;
implementation
{$R *.dfm}
end.
実際の「メイン」フォームの単位
unit uActualMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TFormActualMainForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
protected
procedure CreateParams(var Params: TCreateParams) ; override;
end;
implementation
{$R *.dfm}
{ TFormActualMainForm }
procedure TFormActualMainForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
procedure TFormActualMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate;
end;
end.
この問題If its name does not start with "TForm", it can not be seen when Alt+Tab.
は、次のコードで明らかになります。唯一の違いは、クラス名が TFormActualMainForm から TXFormActualMainForm に変更されたことです。
プログラム
program Strange;
uses
Forms,
uHiddenMainForm in 'uHiddenMainForm.pas' {HiddenMainForm},
uActualMainForm in 'uActualMainForm.pas' {XFormActualMainForm};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(THiddenMainForm, HiddenMainForm);
Application.ShowMainForm := False;
Application.MainFormOnTaskbar := True;
with TXFormActualMainForm.Create(HiddenMainForm) do
begin
Visible := True;
end;
Application.Run;
end.
実際の「メイン」フォームの単位
unit uActualMainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
type
TXFormActualMainForm = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
protected
procedure CreateParams(var Params: TCreateParams) ; override;
end;
implementation
{$R *.dfm}
{ TXFormActualMainForm }
procedure TXFormActualMainForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
procedure TXFormActualMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate;
end;
end.