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 Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar!) (https://www.delphipraxis.net/142338-groesse-der-arbeitsflaeche-eines-forms-ermitteln-scrollbar.html)

berens 26. Okt 2009 15:56


Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar!)
 
Hi!

Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar!) macht folgende Probleme:

1) Form1.ClientWidth und ClientHeight geben nur die Werte des aktuell sichtbaren Bereiches an.
2) VertScrollBar.Range oder HorzScrollbar.Range ist nur gültig, wenn die Scrollbar "sichtbar" ist.
3) "Sichtbar" sind die ScrollLeisten nur dann, wenn z.B. HorzScrollbar.Range < ClientWidth ist. ".Visible" hat damit nix zu tun / keinen Einfluß. (AutoScroll = True), bzw. "Range" wird nicht mehr aktualisiert, wenn die Bildlaufleiste nicht von Nöten ist.
4) Button1.Top und Left sind relativ zur linken, oberen FensterEcke, nicht zur linken oberen Ecke des Arbeitsbereiches innerhalb der Form.

Wie kann ich nun genau herausfinden, wie groß aktuell meine Arbeitsfläche ist.

Etwas ist der Richtung von
Delphi-Quellcode:
  if ClientWidth > HorzScrollBar.Range then begin
    BreiteDerArbeitsflache := ClientWidth;
  end else begin
    BreiteDerArbeitsflache := HorzScrollBar.Range
  end;
geht imho garnicht.

Auch wenn ich neu erzeugte Objekte ausrichten will (Left := 10) kann ich nicht jedes Mal Rücksicht auf die Bildlaufleisten nehmen und schauen, ob die Werte stimmten oder noch Pi-Mal-Daumen HorzScrollbar.Position abgezogen werden muss.

Oder mache ich da was falsch?

Danke im vorraus.

Uwe Raabe 26. Okt 2009 16:05

Re: Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar
 
Versuch mal, ein ein client-aligned TPanel in das Form zu setzen. Bevel abschalten und schaun, ob Panel.Width und Panel.Height deinen Wünschen näher kommt.

himitsu 26. Okt 2009 16:32

Re: Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar
 
also in D7 liefert .Range auch die richtigen Ergebnisse (Wenn nichts auf der Form ist, dann natürlich 0)

liefert den belegten ClientBereich
Delphi-Quellcode:
Function GetUsedClientRect(C: TWinControl): TRect;
  Var i: Integer;

  Begin
    i := C.ControlCount - 1;
    While i >= 0 do
      If (C.Controls[i] is TWinControl) and TWinControl(C.Controls[i]).Visible Then Begin
        Result := TWinControl(C.Controls[i]).BoundsRect;
        Break;
      End Else Dec(i);
    If i >= 0 Then Begin
      While i > 0 do Begin
        Dec(i);
        If (C.Controls[i] is TWinControl) and TWinControl(C.Controls[i]).Visible Then
          UnionRect(Result, Result, TWinControl(C.Controls[i]).BoundsRect);
      End;
    End Else ZeroMemory(@Result, SizeOf(TRect));
  End;


R{TRect} := GetUsedClientRect(Form1);
und wenn man es sich etwas abändert, dann sollte es auch den kompletten Client-Bereich zurückgeben können :)
Delphi-Quellcode:
Function GetClientRect(C: TWinControl): TRect;
  Var i: Integer;

  Begin
    Result.Left  := 0;
    Result.Top   := 0;
    Result.Right := C.ClientWidth;
    Result.Bottom := C.ClientHeight;
    i := C.ControlCount;
    While i > 0 do Begin
      Dec(i);
      If (C.Controls[i] is TWinControl) and TWinControl(C.Controls[i]).Visible Then
        UnionRect(Result, Result, TWinControl(C.Controls[i]).BoundsRect);
    End;
  End;

berens 26. Okt 2009 20:36

Re: Größe der Arbeitsfläche eines Forms ermitteln (Scrollbar
 
Der Tip mit alClient funktioniert, und wenn ich nun ein Panel nehme, denke ich, sollten auch die Werte für Top und Left stimmen.

Ursprünglich wollte ich Align komplett vermeiden, aber im Moment scheint es mir die sowohl einfachste, wie auch beste Lösung zu sein.

Danke an die Antworter :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.

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