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/)
-   -   effektive Form.height? (https://www.delphipraxis.net/217412-effektive-form-height.html)

taveuni 25. Jun 2025 11:52


effektive Form.height?
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich möchte etwas ganz einfaches tun. Meine Mainform sollte unter gewissen Umständen mit einer zusätzlichen Form "erweitert" werden. Also dachte ich mir z. B. im Falle von rechtsbündig:

1. positioniere die 2. Form an Form1.left + Form1.Width. Dies ist mit Form1.left + Form1.ClientWidth halbwegs gelungen (wobei auch da 2 Pixel fehlen).
2. Die Höhe ganz einfach an Form1.Top + Form1.Height.

Vor allem beim Punkt zwei aber bin ich am verzweifeln.
- Form1.height ist 500. Form1.
- Form1.clientheight ist 441.
- Das effektive gemessene Mass ist 493.

Wie komme ich an diese Zahl? Vielleicht Form1.height - Titlebar - Menubar? Aber wie? Oder was gibts hier für eine Möglichkeit?
Auch Top stimmt nicht ganz. Bzw. Vermutlich ist noch eine unsichtbare Border vorhanden? Der Masstab legt sich ja über die sichtbare Höhe und Breite. Siehe auch die angehängten Bilder.

Getestet an Windows 10 und Windows 11. Keine Skalierung.

Die DFM:

Delphi-Quellcode:
object FormMain: TFormMain
  Left = 0
  Top = 0
  Caption = 'FormMain'
  ClientHeight = 441
  ClientWidth = 484
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -12
  Font.Name = 'Segoe UI'
  Font.Style = []
  Menu = mnMain
  Position = poDesktopCenter
  TextHeight = 15
  object memo: TMemo
    Left = 88
    Top = 160
    Width = 305
    Height = 145
    ReadOnly = True
    TabOrder = 0
  end
  object mnMain: TMainMenu
    Left = 272
    Top = 104
    object mnShowBrowser: TMenuItem
      Caption = 'Zeige Fenster rechts'
      object rechts1: TMenuItem
        Caption = 'rechts'
        OnClick = rechts1Click
      end
      object links1: TMenuItem
        Tag = 1
        Caption = 'links'
        OnClick = rechts1Click
      end
      object oben1: TMenuItem
        Tag = 2
        Caption = 'oben'
        OnClick = rechts1Click
      end
      object unten1: TMenuItem
        Tag = 3
        Caption = 'unten'
        OnClick = rechts1Click
      end
      object unten2: TMenuItem
        Caption = 'nix'
        OnClick = unten2Click
      end
    end
  end
end

stahli 25. Jun 2025 15:42

AW: effektive Form.height?
 
Grundsätzlich "reserviert" Windows einen transparenten Bereich um die Fenster, um dort einen Schatten zu zeichnen.
Das sieht man auch bei einer Größenänderung eines Fensters mit der Maus.
Aus meiner Sicht ist das ein klarer Konzeptfehler.

Die genauen Bereiche kann ich Dir nicht sagen. Womöglich ist das auch dynamisch geregelt.

Vermutlich ist es am sinnvollsten, mit ClientToScreen(0,0) das Offset des Formularinhalts zu ermitteln und von da aus weiter zu rechnen...

Kas Ob. 25. Jun 2025 15:51

AW: effektive Form.height?
 
Try these and pick your favorite one, or you can mix the result leaving little space for the resizing borders while having the exact size.
Delphi-Quellcode:
procedure TFormMain.Button1Click(Sender: TObject);
var
  Rect: TRect;
begin
  GetWindowRect(Self.Handle, Rect);
  FormBrowser.Width := Rect.Width;
  FormBrowser.Height := Rect.Height;
  FormBrowser.Left := self.Left + Rect.Width;
  FormBrowser.Top := Rect.Top;

  FormBrowser.Visible := True;
  WritePos;
end;

procedure TFormMain.Button2Click(Sender: TObject);
var
  Rect: TRect;
begin
  // need DwmApi in uses clause
  DwmGetWindowAttribute(Self.Handle, DWMWA_EXTENDED_FRAME_BOUNDS, @Rect, SizeOf(Rect));
  FormBrowser.Width := Rect.Width;
  FormBrowser.Height := Rect.Height;
  FormBrowser.Left := self.Left + Rect.Width;
  FormBrowser.Top := Rect.Top;

  FormBrowser.Visible := True;
  WritePos;
end;
https://learn.microsoft.com/en-us/wi...-getwindowrect
https://learn.microsoft.com/en-us/wi...indowattribute

himitsu 25. Jun 2025 16:19

AW: effektive Form.height?
 
Ja, leider ist der Fensterrahmen "unsichtbar", inkl. dem Fensterschatten.
Der Rahmen, zum Vergrößeren der Form, ist auch im transparenten Bereich. (was ich schon als bissl nervig empfinde, wenn man immer etwas "daneben" klicken muß)

Form.BoundsRect vs. Form.ClientRect, allerdings da ohne die Titelleiste

taveuni 25. Jun 2025 16:24

AW: effektive Form.height?
 
Danke Euch.
Morgen ist mein letzter Arbeitstag vor den Sommerferien. Ich werde danach weitermachen und berichten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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-2025 by Thomas Breitkreuz