Почему имя класса потомка TForm имеет значение?
В приведенном ниже приложении VCL Forms Application.MainForm скрыт, а вместо него показан другой потомок TForm. Странно то, что только если имя этого потомка TForm начинается с "TForm", его можно увидеть при нажатии Alt+Tab. Если его имя не начинается с "TForm", его нельзя увидеть, когда Alt+Tab. Выше тестируется с Delphi XE-Berlin на Windows 10 Ann Edition x64.
Не могли бы вы прокомментировать причину, по которой имя класса здесь имеет значение? О_О
Более того, имеет ли значение имя класса потомка 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.