Announcement

Collapse
No announcement yet.

Formular über MDI-Fenster zentrieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Formular über MDI-Fenster zentrieren

    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

  • #2
    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
    Schöne Grüße, Mario

    Comment


    • #3
      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

      Comment


      • #4
        Hoppla, da ist ein Fehler reingerutscht: Statt

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

        muss es heißen

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

        Werne

        Comment

        Working...
        X