Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#15

AW: AlwaysOnTop mit mehreren Formularen

  Alt 14. Mai 2020, 08:30
OK, nachdem ich wieder etwas Luft habe, hab mir das jetzt im Detail angeschaut. Leider musste ich an mehreren Stellen drehen, um einige Nebeneffekte zu unterbinden.


Lösung:
Und statt OnActivate, ist sowieso CreateWnd besser. (auch wenn Beides geht)
Wenn man die Fenster immer OnTop setzen will, dann mag das besser sein. Wenn man dem Nutzer die Wahl lassen will, ist das ungeeignet, denn CreateWnd wird vor dem FormCreate gefeuert, so dass man gar keine Möglichtkeit hat, etwas zu setzen. CreateWnd wird zwar offenbar vor dem OnShow nochmals gerufen, aber ich mag Eindeutigkeit (und werde daher beim OnActivate bleiben).

Zitat:
Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
begin
  PopupMode := TPopupMode(9);
end;
Wenn ich das richtig verstehe, zwingt das die Routine im TCustomForm.CreateParams dazu, keinen speziellen Code zur Bearbeitung des Window Parent auszuführen. Was bedeutet das genau?

Dummerweise hat das zur Folge, dass die Form2 im Beispiel einen eigenen Button in der Taskleiste bekommt. Das kann ich gar nicht brauchen.

Nach einigen Versuchen hab ich eine Lösung gefunden, aber ich frag lieber nach, ob das eine saubere Variante ist.

Unit1:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
    if bShowForm2 then begin
        Fform2:= TForm2.Create(nil);
        Fform2.BorderStyle:= bsNone;
        Fform2.PopupParent:= Self;
    end;
end;
Restliche Funktionen der Unit wie gehabt.

Unit2:
Delphi-Quellcode:
procedure TForm2.FormCreate(Sender: TObject);
begin
    Self.PopupMode:= TPopupMode(99);
end;
---

Eine andere Variante kam mir gerade aufgrund eines anderen Projektes in den Sinn.
Unit1: wie im OP.
[EDIT]Der Aufruf von TForm2.Create muss natürlich etwas anders aussehen, aber der Rest bleibt gleich.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
    if bShowForm2 then begin
        Fform2:= TForm2.Create(nil, Self.Handle);
        Fform2.BorderStyle:= bsNone;
    end;
end;
[/EDIT]

Unit2:
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
    FWndParent: HWND;
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    constructor Create(AOwner: TComponent; AWndParent: HWND); reintroduce; overload;
  end;
  
implementation
  
constructor TForm2.Create(AOwner: TComponent; AWndParent: HWND);
begin
    Self.FWndParent:= AWndParent;
    inherited Create(AOwner);
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
    inherited;
    Params.WndParent:= Self.FWndParent;
end;

procedure TForm2.FormActivate(Sender: TObject);
begin
    uGUIHelper.AlwaysOnTop(True, Self.Handle);
end;
Vorteil: Kein Button erscheint für Form2 in der Taskleiste und ein Setzen des PopupMode entfällt, was den Nebeneffekt hat, dass es sogar im Delphi 5 funktioniert .

Meinungen zu den beiden Lösungsvarianten? Ist eine besser geeignet als die andere? Und wenn ja, warum?

Grüße
Dalai

Geändert von Dalai (14. Mai 2020 um 20:46 Uhr) Grund: Aufruf TForm2.Create angepasst
  Mit Zitat antworten Zitat