PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Formular über MDI-Fenster zentrieren



wp
13.10.2004, 13:00
Hallo,

weiß jemand, wie man ein (nicht-MDI) Formular frm über einem MDI-Fenster zentriert?

frm.Position=poOwnerFormCenter funktioniert mit MDI-Fenstern nicht richtig, genausowenig wie meine selbstgeschriebene Prozedur "CenterForm". Ich müsste wissen, wie ich ich die auf den Screen bezogenen Koordinaten des MDI-Fensters erhalte.

<PRE>
procedure CenterForm(frm,parent:TForm);
// Zentriert das Formular "frm" im Formular "parent".
var
P : TPoint;
R : TRect;
begin
if Assigned(frm) and Assigned(parent) then begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
// R = Screen ohne Start-Leiste
if (frm.Width>R.Right-R.Left) or (frm.Height>R.Bottom-R.Top) then
raise Exception.CreateFmt(SFormTooBig, [frm.Name]);
frm.Position := poDesigned;
P.X := Parent.Left + (Parent.Width - frm.Width) div 2;
P.Y := Parent.Top + (Parent.Height - frm.Height) div 2;
// if Parent.FormStyle=fsMDIChild then P := Parent.ClientToScreen(P);
// das geht so nicht!
frm.Left := P.X;
frm.Top := P.Y;
if frm.Left<R.Left
then frm.Left := R.Left;
if frm.Left+frm.Width > R.Right
then frm.Left := R.Right - frm.Width;
if frm.Top<R.Top
then frm.Top := R.Top;
if frm.Top+frm.Height > R.Bottom
then frm.Top := R.bottom - frm.Height;
end;
end;
</PRE>

Gruß, Werner

Mario.Noack
13.10.2004, 13:07
Versuche es mal mit <p>
<i>...<br>
P.X := (Parent.Width - frm.Width) div 2; <br>
P.Y := (Parent.Height - frm.Height) div 2; <br>
...
</i><p>
Zur genaueren Positionierung müsste man noch Frame und Titelleiste abziehen.<p>
Schöne Grüße, Mario Noac

wp
13.10.2004, 14:46
Danke, Mario, aber damit sitzt das Formular zu weit links oben.

Bin eben per Zufall auf die richtige Lösung gestoßen. Die Windowsfunktion GetWindowRect übergibt anscheinend die benötigten Koordinaten auch bei MDI-Formularen. Die folgende Prozedur funktioniert sowohl bei normalen als auch bei MDI-Formularen:

<PRE>
procedure CenterForm(frm,parent:TForm);
// Zentriert das Formular "frm" im Formular "parent".
var
P : TPoint;
R : TRect; // Screen-Rect ohne Start-Leiste
Rp : TRect; // "Parent"-Rect
begin
if Assigned(frm) and Assigned(parent) then begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @R, 0);
GetWindowRect(parent.Handle, Rp);
P.X := Rp.Left + (Parent.Width - frm.Width) div 2;
P.Y := Rp.Top + (Parent.Height - frm.Height) div 2;
pos := frm.Position;
frm.Left := P.X;
frm.Top := P.Y;
if frm.Left<R.Left
then frm.Left := R.Left;
if frm.Left+frm.Width > R.Right
then frm.Left := R.Right - frm.Width;
if frm.Top<R.Top
then frm.Top := R.Top;
if frm.Top+frm.Height > R.Bottom
then frm.Top := R.bottom - frm.Height;
end;
end;
</PRE&gt

wp
14.10.2004, 11:00
Hoppla, da ist ein Fehler reingerutscht: Statt

<PRE>
pos := frm.Position
</PRE>

muss es heißen

<PRE>
frm.Position := poDesigned;
</PRE>

Werne