Delphi-PRAXiS
Seite 1 von 3  1 23      

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/)
-   -   Form über anderer Form zentrieren (https://www.delphipraxis.net/191883-form-ueber-anderer-form-zentrieren.html)

striderx 27. Feb 2017 21:07

Form über anderer Form zentrieren
 
folgende Situation:

Form1 ruft Form2 auf, die wiederum ruft Form3 auf, jeweils mit ShowModal. Form2 ist dabei nicht immer dieselbe Form.

Form 3 soll über Form 2 zentriert werden. Ich hätte gedacht, dass das mit Position = poOwnerFormCenter geht; allerdings wird Form3 damit immer über Form1 zentriert.
Um das Zentrieren 'zu Fuß' zu machen, habe ich versucht, mit GetParentForm(Self) an die Top- und Left-Werte der aufrufenden Form2 zu kommen, die sind jedoch immer 0.

Hat jemand eine Idee?

DeddyH 27. Feb 2017 21:49

AW: Form über anderer Form zentrieren
 
Berechne doch in Form2 die Position von Form3, bevor Du es anzeigst.
Delphi-Quellcode:
Form3.Left := (Width - Form3.Width) div 2;
Form3.Top := (Height - Form3.Height) div 2;
Form3.ShowModal;
Ungetestet, sollte aber ungefähr so funktionieren.

striderx 27. Feb 2017 21:53

AW: Form über anderer Form zentrieren
 
Das geht leider nicht, weil die Größe von Form3 bei jedem Aufruf von Form3 neu ermittelt wird.

himitsu 27. Feb 2017 21:54

AW: Form über anderer Form zentrieren
 
Da fehlt jeweils noch eine Addition der Fensterposition.

DeddyH 27. Feb 2017 22:00

AW: Form über anderer Form zentrieren
 
Stimmt, aber das Prinzip bleibt gleich. Und was spricht dagegen, erst die Größe zu berechnen, bevor man das Formular positioniert?

striderx 27. Feb 2017 22:11

AW: Form über anderer Form zentrieren
 
Zur Erläuterung:

Form3 ist meine Alternative zum Windows Message-Dialog. Je nach Aufruf werden in Form3 die Anzahl der Buttons und der angezeigte Text festgelegt und daraus dann die Größe des Dialogs ermittelt.

Ich habe es jetzt mal so probiert:

Delphi-Quellcode:
  F := GetParentForm(Self);
  dlgShowMsg.Top := F.Top + Trunc((F.Height - dlgShowMsg.Height) / 2);
  dlgShowMsg.Left := F.Left + Trunc((F.Width - dlgShowMsg.Width) / 2);
edit: Aber damit erscheint der Dialog immer in der oberen linken Ecke.

himitsu 27. Feb 2017 22:19

AW: Form über anderer Form zentrieren
 
GetParentForm?
Bzw. was ist Self?

Also als Subkomponente genutzt (Parent gesetzt) und nicht als eigenständige Form?
Dann natürlich ohne die Addition der Position des äußeren Fensters, da hier das Offset 0 ist.

striderx 27. Feb 2017 22:22

AW: Form über anderer Form zentrieren
 
Zitat:

Zitat von himitsu (Beitrag 1362833)
GetParentForm?

Also als Subkomponente genutzt (Parent gesetzt) und nicht als eigenständige Form?

Doch, das ist eine eigenständige Form. Self müsste Form3 sein.

DeddyH 27. Feb 2017 22:24

AW: Form über anderer Form zentrieren
 
Spontan fallen mir 2 Möglichkeiten ein:
- Form3 bekommt eine öffentliche Methode, die die Größenberechnung anstößt
- Form3 bekommt eine Property vom Typ TForm, in der sich das aufrufende Formular einträgt und berechnet seine Position anhand dieser Property dann selbst

striderx 27. Feb 2017 22:34

AW: Form über anderer Form zentrieren
 
Zitat:

Zitat von DeddyH (Beitrag 1362835)
Spontan fallen mir 2 Möglichkeiten ein:
- Form3 bekommt eine öffentliche Methode, die die Größenberechnung anstößt
- Form3 bekommt eine Property vom Typ TForm, in der sich das aufrufende Formular einträgt und berechnet seine Position anhand dieser Property dann selbst

Form3 hat bereits eine öffentliche Methode, in der die Form zusammengebastelt wird und die das ModelResult zurück liefert.

Delphi-Quellcode:
function ShowMsg(MsgText, HeaderText: String; mButtons, mIcon: Word): Integer;


Ich könnte die Werte der aufrufenden Form noch als Parameter aufnehmen, das wäre aber nicht besonders elegant.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.
Seite 1 von 3  1 23      

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