![]() |
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:
geht imho garnicht.
if ClientWidth > HorzScrollBar.Range then begin
BreiteDerArbeitsflache := ClientWidth; end else begin BreiteDerArbeitsflache := HorzScrollBar.Range end; 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. |
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.
|
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:
und wenn man es sich etwas abändert, dann sollte es auch den kompletten Client-Bereich zurückgeben können :)
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);
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; |
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 16:28 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 by Thomas Breitkreuz