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 Firemonkey: Scrollbox mit skaliertem Inhalt (Paintbox) (https://www.delphipraxis.net/205943-firemonkey-scrollbox-mit-skaliertem-inhalt-paintbox.html)

idontknow 2. Nov 2020 11:58


Firemonkey: Scrollbox mit skaliertem Inhalt (Paintbox)
 
Hallo Community,

ich stehe gerade etwas auf dem Schlauch. Ich habe ein FMX-Projekt mit einer Scrollbox, in der eine Paintbox liegt (1000 x 1000 Pixel).
In die Paintbox male ich ein Rechteck und ein Kreuz:

Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas);
begin
  Canvas.Stroke.Kind := TBrushKind.Solid;
  Canvas.DrawRect(RectF(10, 10, 990, 990), 0.0, 0.0, [], 1.0);
  Canvas.DrawLine(PointF(10, 10), PointF(990, 990), 1.0);
  Canvas.DrawLine(PointF(10, 990), PointF(990, 10), 1.0);
end;
Das ist nach dem Start sichtbar und kann prima gescrollt werden. Jetzt skaliere ich den Inhalt, indem ich

Delphi-Quellcode:
PaintBox1.Scale.Point := PointF(2.0, 2.0);
ausführe. Prima. Der Inhalt wird doppelt so groß, die Scrollbars verändern sich jedoch nicht und ich kann nur noch bis zur Mitte scrollen.

Das geht doch aber sicher irgendwie, oder?

Ich hoffe, jemand hat einen Tipp für mich, schon mal vielen Dank im voraus...

idontknow 2. Nov 2020 16:32

AW: Firemonkey: Scrollbox mit skaliertem Inhalt (Paintbox)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mein Testprojekt hier mal angehängt.

idontknow 2. Nov 2020 17:15

AW: Firemonkey: Scrollbox mit skaliertem Inhalt (Paintbox)
 
Nach langem Rumgefummel und erfolglosem googeln habe ich die Lösung selbst rausgefunden, vielleicht hilft es ja jemandem mit demselben Problem in Zukunft:

Die ScrollBox ruft, getriggert durch Skalieren ihres Inhalts, TScrollBox.OnCalcContentBounds() auf.

Mit
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.OnCalcContentBounds := CalcContentBounds;
end;

procedure TForm1.CalcContentBounds(Sender: TObject; var ContentBounds: TRectF);
begin
  ContentBounds.Width := PaintBox1.Scale.X * PaintBox1.Width;
  ContentBounds.Height := PaintBox1.Scale.Y * PaintBox1.Height;
end;
verhält sich die Scrollbox so, wie ich will (und wie ich eigentlich defaultmäßig erwartet habe). Bin mir nicht sicher, ob das der richtige Weg ist (erscheint mir fummelig), aber es funktioniert.


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