6

Delphi2010またはXEApplication.MainFormOnTaskbarがtrueに設定されている場合、すべてのセカンダリフォームは常にメインウィンドウの前にあります。PopupmodeまたはPopupParentプロパティが何に設定されているかは関係ありません。ただし、メインフォームの背後に表示できるようにしたいセカンダリウィンドウがあります。

MainFormOnTaskbarをfalseに設定すると機能しますが、Windows 7の機能(Alt-tab、Windowsバーアイコンなど)が機能しなくなります。

セカンダリフォームをメインフォームの背後に隠したまま、Windows 7の機能を機能させ続けるにはどうすればよいですか?

4

3 に答える 3

4

基本的にはできません。の要点MainFormOnTaskBarは、Vistaとの互換性を持つことです。設定しないと互換性がなくなります。設定するとz-orderになります。次の抜粋は、D2007のreadmeからのものです。

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レポートを参照してください。このレポートには、まったく同じ問題が記載されています(AsDesignedとして閉じられています)。CreateParamsレポートには、フォームをオーバーライドWndParentして「0」に設定することを含む回避策が記載されています。また、この回避策が引き起こすいくつかの問題と、それらの問題の考えられる回避策についても説明します。注意してください、すべての合併症を見つけて回避することは簡単/可能ではありません。何が関係しているのかを理解するには、SteveTrefethenの記事を参照してください。

于 2010-11-22T01:03:43.580 に答える
0

私は、1つのアプローチは、次の目的のみに役立つ「舞台裏」のメインフォームを持つことだと思っていたでしょう。

  1. 他のフォームの1つを選択してメインフォームとして表示し、古き良き「フラッシュ」画面のように永続的に非表示にします(Visible:= FALSE)。

  2. メインフォームとして選択したフォームが閉じられたときにアプリケーションターミネーターとして機能します(適切なOnCloseイベントを配線するだけです)。

  3. 指定された疑似メインフォームに代わって他のフォームを開き、非表示の実際のメインフォームが他のフォームの「所有者」であり、「疑似メインフォーム」ではないようにすること。他のすべてのフォームが「非」ポップアップスタイルであり、ShowModalではなくShow呼び出しを介して表示される場合、これはとにかく発生するようです。

アプリケーションの動作のこの小さな再構築により、探している親切なユーザーインタラクションが得られる可能性があります。

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.
于 2016-11-08T02:46:46.090 に答える
0

私はこの問題を解決する方法を見つけました。

の上*.dpr

Application.MainFormOnTaskbar := true; に 変更 Application.MainFormOnTaskbar := false;

これにより、メインフォームの後ろに子フォームが作成されます。

于 2019-10-04T03:03:37.150 に答える