0

以下の 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.
4

0 に答える 0