2010-11-22 3 views
4

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

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

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

ответ

4

В принципе вы не можете. Весь смысл MainFormOnTaskBar заключается в совместимости с Vista. Если вы его не установили, совместимость не исчезла .., если вы ее установили, выполняется z-порядок. Следующий отрывок из ридх 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.


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

+2

вышеуказанная статья теперь [здесь] (http://www.stevetrefethen.com/blog/the-new-vcl-property-tapplication-mainformontaskbar-in-delphi-2007). –

0

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

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

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

  3. Чтобы открыть другие формы от имени обозначенной псевдо-основной формы, так что скрытая реальная основная форма является «владельцем» других форм, а не «псевдо-основной формой». Похоже, что это произойдет в любом случае, если все ваши другие формы имеют «не» всплывающий стиль и отображаются через Show calls, а не 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.