Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   BottomRight des sichtbaren Bereichs einer ScrollBox? (https://www.delphipraxis.net/178436-bottomright-des-sichtbaren-bereichs-einer-scrollbox.html)

Bjoerk 8. Jan 2014 14:26

BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Ich probier' jetzt schon eine ganze Weils das BottomRight des sichtbaren Bereichs einer ScrollBox zu finden? :gruebel:
Delphi-Quellcode:
  RangeRect.Left := ScrollBox.HorzScrollBar.Position;
  RangeRect.Top := ScrollBox.VertScrollBar.Position;
  RangeRect.Right := f(ScrollBox.HorzScrollBar.Range ?, ScrollBox.HorzScrollBar.Position ?, ScrollBox.ClientRect ?)
  RangeRect.Bottom := f(..);

Blup 8. Jan 2014 15:28

AW: BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Versuch mal so:
Delphi-Quellcode:
RangeRect := ScrollBox.ClientRect;
dx := ScrollBox.HorzScrollBar.Position - RangeRect.Left;
dy := ScrollBox.VertScrollBar.Position - RangeRect.Top;
Inc(RangeRect.Left,  dx);
Inc(RangeRect.Right, dx);
Inc(RangeRect.Top,   dy);
Inc(RangeRect.Bottom, dy);

Bjoerk 8. Jan 2014 19:44

AW: BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Das sieht doch schon mal sehr gut aus. Thanx!

Bjoerk 9. Jan 2014 12:17

AW: BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Heut' nacht ist mir noch das eingefallen:
Delphi-Quellcode:
function ClientRangeRect(Sender: TObject): TRect;
var
  O: TPoint;
begin
  // Sender = Client, Parent = ScrollBox, Result in Client-Koordinaten;
  O := TControl(Sender).ClientToParent(Point(0, 0), TControl(Sender).Parent);
  Result.TopLeft := TControl(Sender).Parent.ClientRect.TopLeft;
  Result.BottomRight := TControl(Sender).Parent.ClientRect.BottomRight;
  Result.Top := Result.Top - O.Y;
  Result.Left := Result.Left - O.X;
  Result.Bottom := Result.Bottom - O.Y;
  Result.Right := Result.Right - O.X;
end;

Sir Rufo 9. Jan 2014 19:35

AW: BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Wenn du mindestens eine Instanz von
Delphi-Quellcode:
TControl
haben musst, warum dann
Delphi-Quellcode:
Sender : TObject
? :gruebel:

So sparst du dir doch das Casten und ersparst dir potentielle Programmier/Laufzeitfehler, und dokumentiert ist das dann auch (ich muss eine
Delphi-Quellcode:
TControl
-Instanz haben)
Delphi-Quellcode:
function ClientRangeRect(Sender: TControl): TRect;
var
  O: TPoint;
begin
  // Sender = Client, Parent = ScrollBox, Result in Client-Koordinaten;
  O := Sender.ClientToParent( Point(0, 0), Sender.Parent );
  Result := Sender.Parent.ClientRect;
  Result.Inflate( O.X, O.Y, -O.X, -O.Y );
end;
Eine Umbenennung von
Delphi-Quellcode:
Sender
in
Delphi-Quellcode:
AControl
würde sich dort auch noch besser machen (Lesbarkeit)

Bjoerk 10. Jan 2014 09:40

AW: BottomRight des sichtbaren Bereichs einer ScrollBox?
 
Sehr schön. Bin eigentlich auch kein Freund von exzessiven Casts und die InflateRect Variante mit 4 Parametern kannte ich nicht. Thanx!

Man kann am Ende der function noch ergänzen (erforderlich, falls keine Scrollbars).
Delphi-Quellcode:
  Result.Bottom := Min(Result.Bottom, Sender.ClientHeight);
  Result.Right := Min(Result.Right, Sender.ClientWidth);


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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