Почему имя класса потомка 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.

0 ответов

Другие вопросы по тегам