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