Как разрешить Delphi вторичные формы за основной формой - PullRequest
4 голосов
/ 22 ноября 2010

Если в Delphi 2010 или XE Application.MainFormOnTaskbar установлено значение true, то все вторичные формы всегда находятся перед главным окном.Не имеет значения, какие свойства установлены в Popupmode или PopupParent.Однако у меня есть вторичные окна, которые я хочу показать за основной формой.

Если я установил для MainFormOnTaskbar значение false, это сработает, но функции Windows 7 будут нарушены (Alt-tab, значок панели Windows и т. Д.).

Как сохранить работоспособность функций Windows 7, при этом позволяя вторичным формам скрываться за основной формой?

Ответы [ 2 ]

4 голосов
/ 22 ноября 2010

В принципе, вы не можете.Весь смысл MainFormOnTaskBar в том, чтобы иметь совместимость с Vista.Если вы не установите его, совместимость исчезнет, ​​если вы установите его, z-порядок будет выполнен.Следующая выдержка из readme D2007:

The property controls how Window's TaskBar buttons are handled by VCL. This property can be applied to older applications, but it affects the Z-order of your MainForm, so you should ensure that you have no dependencies on the old behavior.


Но посмотрите этот отчет о контроле качества , который описывает точно такую ​​же проблему (и закрыт как AsDesigned ).В отчете представлен обходной путь, включающий переопределение CreateParams формы для установки WndParent в «0».Также описаны некоторые проблемы, которые вызывает этот обходной путь, и возможный обход этих проблем.Остерегайтесь, было бы нелегко / невозможно найти и обойти все осложнения.См. Статью Стива Трефетена , чтобы понять, что может быть в этом замешано.

0 голосов
/ 08 ноября 2016

Я бы подумал, что одним из подходов будет иметь «закулисную» главную форму, которая служит только следующим целям:

  1. Чтобы выбрать и показать один издругие формы в качестве основной формы и затем постоянно скрываются (Visible: = FALSE), как старые добрые «флеш» экраны.

  2. Чтобы действовать как терминатор приложения при создании формывыбран, поскольку основная форма закрыта (просто подключите соответствующие события OnClose).

  3. Чтобы открыть другие формы от имени назначенной псевдо-главной формы, чтобы скрытая реальная основная форма была«владелец» других форм, а не «псевдо-основная форма».Похоже, что это произойдет в любом случае, если все другие формы имеют всплывающий стиль «не» и будут видны через вызовы Show, а не ShowModal.

Эта небольшая перестройка поведения приложенияможет затем получить вам доброе взаимодействие с пользователем, которое вы ищете.

unit FlashForm;
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;

type
  TFlash = class(TForm)
    lblTitle: TLabel;
    lblCopyright: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  public
    procedure CloseApp;
  end;

var
  Flash: TFlash;

implementation

{$R *.dfm}

uses Main;

procedure TFlash.CloseApp;  // Call this from the Main.Form1.OnClose or CanClose (OnFormCloseQuery) event handlers
begin
   close
end;

procedure TFlash.FormCreate(Sender: TObject);  // You can get rid of the standard border icons if you want to
begin
   lblCopyright.Caption := 'Copyright (c) 2016  AT Software Engineering Ltd';
   Refresh;
   Show;
   BringToFront;
end;


procedure TFlash.Timer1Timer(Sender: TObject);
begin
   Application.MainFormOnTaskBar := FALSE;  // This keeps the taskbar icon alive
   if assigned(Main.MainForm) then
   begin
       visible := FALSE;
       Main.MainForm.Show;
       Timer1.Enabled := FALSE;
   end else Timer1.Interval := 10;  // The initial time is longer than this (flash showing time)
end;

end.

// Finally, make this the FIRST form created by the application in the project file.
...