Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund (https://www.delphipraxis.net/216819-formular-zur-laufzeit-erzeugt-bring-die-mainform-den-vordergrund.html)

Hobbycoder 6. Mär 2025 19:24

Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Hi,

ich hab folgendes Problem. Ich erzeuge eine Terminform zur Laufzeit, weil der Benutzer in der Lage sein soll, dass er mehrere Termin gleichzeitig geöffnet halten kann. In diese selbst erzeugten Formularen können Unterformulare angezeigt werden. Da diese aber im Vordergrund bleiben sollen, und die Bearbeitung im Termin erst weitergehen kann, wenn dieses Unterformular geschlossen wird lasse ich die Modal anzeigen.
(Auch diese Unterformulare werden dynamisch erzeugt, wo das schon mein Fehler sein könnte).
Werden nun die erzeugten Unterformulare mit ShowModal aufgerufen, springt die Mainform über das Terminforumlar, das Unterformular wird korrekt angezeigt, und nach Schließen des Unterformulars kommt die Terminform wieder in den Vordergund. Funktioniert einwandfrei, sieht aber bescheiden aus.

Jetzt gerade überlege ich, dass es ja nur ein Modals Fenster in einer Anwendung geben kann. Macht also überhaupt sinn, dass ich es dynamisch erzeuge? Denn sonst könnte ich es ja auch gleich automatisch erzeugen lassen, da es ja eh nur einmal angezeigt werden kann, egal wieviele Terminfenster geöffnet sind.

Es wäre natürlich auch superschick, wenn jedes Terminfenster quasi sein eigenes Modales Unterformular haben könnte, was eben dann den Fokus bekommt, wenn die Terminform selbst auch im Vordergrund wäre. Wobei das möglichweise nicht geht. Ich könnte natürlich auch einen Frame im Terminfenster einblenden/dynamisch erzeugen, was ggf. besser aussehen würde, sofern ich dem einen Rahmen verpasse.
Gibt es da irgendwelche Möglichkeiten, die ich nutzen könnte? Oder irgendeine andere Idee, wir ich das gewünscht realisieren könnte?

jaenicke 6. Mär 2025 19:31

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Du musst kein modales Fenster benutzen, damit ein Fenster vor einem anderen bleibt. Dafür kannst du ganz simpel den HWNDPARENT setzen:
Delphi-Quellcode:
SetWindowLong(SecondForm.Handle, GWL_HWNDPARENT, FirstForm.Handle);
// Das bewirkt, dass SecondForm immer vor FirstForm bleibt.
Das kannst du auch mit mehreren "Fensterduos" parallel machen.

himitsu 6. Mär 2025 20:33

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Delphi-Referenz durchsuchenPopupParent
Delphi-Referenz durchsuchenPopupMode

Hobbycoder 7. Mär 2025 08:42

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Zitat:

Zitat von himitsu (Beitrag 1546887)

Danke, das hilft schon gut.

Zitat:

Zitat von jaenicke (Beitrag 1546886)
Du musst kein modales Fenster benutzen, damit ein Fenster vor einem anderen bleibt. Dafür kannst du ganz simpel den HWNDPARENT setzen:
Delphi-Quellcode:
SetWindowLong(SecondForm.Handle, GWL_HWNDPARENT, FirstForm.Handle);
// Das bewirkt, dass SecondForm immer vor FirstForm bleibt.
Das kannst du auch mit mehreren "Fensterduos" parallel machen.

Danke, das ist mega. Genau das, was ich mir gewünscht habe :thumb:

Hobbycoder 10. Mär 2025 10:13

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Hi,
soweit funktioniert das perfekt, nur ein Problem taucht plötzlich auf: Die Fenstergröße verändert sich von allein.
Das Fenster in der IDE ist Height: 599 und Width: 568.
Nach dem es in der Methode (s.unten) erzeugt und angezeigt wird ist Height: 1014 und Width: 1920.
An keiner Stelle wird die Größe der Form im Code bearbeitet oder sonst was. Lediglich die Position.
Woran könnte das liegen? Ich könnte zwar dann im Code der Zielform die Größe anpassen, jedoch möchte ich ungerne statische Information fest im Code verankern.

Delphi-Quellcode:
  if not Assigned(frmKundendaten) then
  begin
    frmKundendaten:=TfrmKundendaten.Create(self);
    frmKundendaten.OnMoved:=OnKundendatenWindowMoved;
    frmKundendaten.OnFinished:=OnKundendatenWindowsFinished;
    frmKundendaten.lblKundenname.Caption:=edtKundenname.Text;
    SetWindowLong(frmKundendaten.Handle, GWL_HWNDPARENT, Self.Handle);
    frmKundendaten.Show;
    frmKundendaten.Left:=self.Left+grpKundendaten.Left+grpIntern.Left+btnKundendaten.Left;
    frmKundendaten.Top:=self.Top+grpKundendaten.Top+grpIntern.Top+btnKundendaten.top+(btnKundendaten.Height*2);
  end;

jaenicke 10. Mär 2025 10:30

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Du könntest z.B. einen Haltepunkt auf OnResize setzen, um zu sehen, wo die Änderung herkommt.

Wenn das nicht klappt (während csLoading wird das Event noch nicht ausgelöst, aber ich denke nicht, dass das der Fall ist), kannst du SetBounds überschreiben und dort den Haltepunkt setzen.

Du kannst im Haltepunkt in den Eigenschaften als Bedingung die Größe prüfen, damit der Haltepunkt nicht so oft ausgelöst wird, wenn das zu oft ist, um es gut zu debuggen.

Jasocul 10. Mär 2025 10:54

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Prüfe mal im Objektinspektor, was du dort bei der Eigenschaft "Position" stehen hast. Vermutlich musst du das auf poDesigned umstellen.

Hobbycoder 10. Mär 2025 11:17

AW: Formular (Zur Laufzeit erzeugt) bring die Mainform in den Vordergrund
 
Zitat:

Zitat von Jasocul (Beitrag 1546946)
Prüfe mal im Objektinspektor, was du dort bei der Eigenschaft "Position" stehen hast. Vermutlich musst du das auf poDesigned umstellen.

Danke, das war es. Ich hatte es auf poDefault stehen und dachte in meinem jugendlichem Leichtsinn, dass würde reichen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz