Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Nicht-modales Fenster im Hintergrund


Tastaro - Di 09.02.21 16:32
Titel: Nicht-modales Fenster im Hintergrund
Hallo,

ich habe in meinem Programm u.a. ein nicht-modales Fenster, das mit show angezeigt wird.
Wenn sie dann sichtbar sind und ich wieder auf das Hauptfenster klicke, dann kommt das Hauptfenster in den Vordergrund und das nicht-modale Fenster verschwindet nach hinten.

Das wollte ich nun auch in einer anderen Anwendung machen. Leider bin ich dabei auf ein Problem gestoßen
Das nicht-modale Fenster wird angezeigt. Wenn ich dann das Hauptfenster anklicke bekommt dieses zwar den Eingabefokus, aber es kommt nicht in den Vordergrund. Statt dessen bleibt es hinten und wird weiterhin von dem nicht-modalen Fenster verdeckt.

Ich habe wild gesucht was der Unterschied zwischen meinen beiden Anwendungen ist, bin aber leider nicht fündig geworden.
Habt ihr zufällig eine Idee woran es liegen könnte, dass das Fenster vorne bleibt?

Beste Grüße


Gausi - Di 09.02.21 16:47

Um das Verhalten zu ändern (d.h. andere Fenster können hinter das Hauptfenster rutschen), kann man entweder in der Projektdatei entweder
Application.MainFormOnTaskBar := False; setzen (das war in älteren Delphi-Versionen standard). Das hat aber ggf. noch andere Nebeneffekte.

Eine andere Möglichkeit ist es, die CreateParams überschreiben, per

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TMyOtherForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := Application.Handle;
end;


Tastaro - Di 09.02.21 16:55

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Um das Verhalten zu ändern (d.h. andere Fenster können hinter das Hauptfenster rutschen), kann man entweder in der Projektdatei entweder
Application.MainFormOnTaskBar := False; setzen (das war in älteren Delphi-Versionen standard). Das hat aber ggf. noch andere Nebeneffekte.

Eine andere Möglichkeit ist es, die CreateParams überschreiben, per

Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TMyOtherForm.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := Application.Handle;
end;


Danke schonmal!

Ich guck mal ob ich eins davon in meiner anderen Applikation finde. Mich macht ja verrückt, dass es da geht und ich nicht weiß warum.


Ralf Jansen - Di 09.02.21 20:39

Bin mittlerweile völlig unbewandert in der VCL aber im allgemeinen kommt es drauf an ob der Parent einer Form gesetzt ist oder nicht.
Mit Parent wird diese Form immer vor seinem Parent angezeigt ohne Parent ist die Stapelreihenfolge frei änderbar.


Tastaro - Mi 10.02.21 08:05

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Bin mittlerweile völlig unbewandert in der VCL aber im allgemeinen kommt es drauf an ob der Parent einer Form gesetzt ist oder nicht.
Mit Parent wird diese Form immer vor seinem Parent angezeigt ohne Parent ist die Stapelreihenfolge frei änderbar.


Auch dir vielen Dank für den Hinweis.
Wenn ich Parent des Fensters auf nil setze, dann geht es in der Hintergrund. Auch die Methode von user profile iconGausi mit dem Überschreiben von CreateParam funktioniert.

Korrektur: Parent auf nil geht doch nicht. Hatte noch zusätzlich das CreateParams drin. :roll:


Das "alte Programm" in dem das schon seit ein paar Jahren klappt enthält aber keines von beiden. Ich habe auch die Properties der Fenster verglichen und keinen Unterscheid gefunden.
Ich HASSE es wenn etwas funktioniert und ich nicht weiß warum.
Für weitere Fenster kann ich jetzt natürlich auf eure Tipps zurückgreifen. Aber ich glaube ich werde heute trotzdem nochmal Zeit in die "Forschung" investieren, um herauszubekommen warum das in der anderen Software geht. Verf*ckt nochmal! :)