如何让主要表单背后的Delphi二级表单

时间:2010-11-22 00:32:47

标签: delphi forms delphi-2010 delphi-xe

如果在Delphi 2010或XE Application.MainFormOnTaskbar中设置为true,则所有辅助表单始终位于主窗口的前面。 Popupmode或PopupParent属性设置为什么并不重要。但是我有辅助窗口,我希望能够在主窗体后面显示。

如果我将MainFormOnTaskbar设置为false,则可以正常工作,但Windows 7功能会被破坏(Alt-tab,Windows栏图标等)。

如何保持Windows 7功能正常工作,同时仍允许辅助表单隐藏在主表单后面?

3 个答案:

答案 0 :(得分:4)

基本上你不能。 MainFormOnTaskBar的重点是拥有Vista兼容性。如果你没有设置它,兼容性就会消失..,如果你设置它,z-order就完成了。以下摘录来自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的article,了解可能涉及的内容。

答案 1 :(得分:0)

我原以为一种方法就是有一个"幕后花絮#34;主要形式仅用于以下目的:

  1. 选择并显示其他形式之一作为主要形式,然后永久隐藏自己(可见:= FALSE),就像好老式的" flash"屏幕。

  2. 当选择作为主窗体的表单时,将其作为应用程序终止符(只需连接相应的OnClose事件)。

  3. 代表指定的伪主表单打开其他表单,使隐藏的真正主表单为" owner"其他形式,而不是"伪主形式"。如果您的所有其他表单都有“非”形式,则无论如何都会发生这种情况。弹出式样,通过Show调用而不是ShowModal可见。

  4. 这种对应用程序行为的小规模重组可能会让您获得正在寻找的用户交互。

    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.
    

答案 2 :(得分:0)

我找到了解决此问题的方法。

*.dpr

更改   Application.MainFormOnTaskbar := true; 至   Application.MainFormOnTaskbar := false;

这将使您的子表单位于主表单的后面。