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 FMX Scrollbareigenschaften berechnen (https://www.delphipraxis.net/189986-fmx-scrollbareigenschaften-berechnen.html)

Sherlock 17. Aug 2016 14:44

FMX Scrollbareigenschaften berechnen
 
Ich sitze hier seit einiger Zeit und breche mir beide Ohren an diesem "Problem". Gegeben sei ein TLayout, dem ich ein Paar von Images mit jeweils einem untergeordneten Image zuordne. Das erste Image jedes Pärchens beinhaltet eine Skala, die ich einmalig berechne. Das zweite Image bekommt eine Kurve, die zur Laufzeit befüllt wird. Damit ich dann den kompletten Kurvenverlauf sehen kann, auch wenn das Layout kleiner ist als die Images (es geht hierbei nur um die Breite, von ausreichender Höhe darf ausgegangen werden), habe ich unter das Layout eine TScrollbar gesetzt. Verschieben des Anfassers soll bewirken, daß die untergeordneten Images, also die mit den Kurven, entsprechend verschoben werden. Die Images mit den Skalen sollen stehen bleiben - darum keine allumfassende TScrollBox.

So, jetzt artet das für mich langsam zu höherer Mathematik aus :oops: vermutlich weil ich schon zu lange darüber nachdenke. Was habe ich bis jetzt getan? Der folgende Code ist reduziert, die zweite Kurve richtet sich ohnehin exakt nach der ersten, spielt also keine Rolle. Im Resize-Event der Form errechne ich ein bis zwei ScrollBar-Eigenschaften:
Delphi-Quellcode:
procedure TFReader.CalcScrollBarProps;
begin
  if GridLayout.Width < TraceImage.Width then
  begin
    ScrollBar.ViewportSize := ScrollBar1.Width / (TraceImage.Width / GridLayout.Width);
    ScrollBar.Max := ScrollBar1.ViewportSize * (TraceImage.Width / GridLayout.Width);
  end
  else
    ScrollBar1.ViewportSize := ScrollBar1.Width;
end;
Das Change Event der Scrollbar ist dann wie folgt:
Delphi-Quellcode:
procedure TFReader.ScrollBarChange(Sender: TObject);
begin
  TraceImage.Position.X := TraceImage.Width * ScrollBar.Value / GridLayout.Width;
end;
Es ergeben sich folgender Unterschied zwischen Wunsch und Wirklichkeit:
Wunsch: Wenn das ScanImage (die Kurve) nicht komplett ins GridLayout passt, soll es möglich sein durch scrollen jeden Teil der Kurve zu sehen.
Wirklichkeit: Ich kann zwar scrollen, aber ich kann nur die Kurve nach rechts "aus dem Bild scrollen". Kurvenbereiche weiter rechts bekomme ich nicht ins Bild gescrollt.

Was mache ich falsch? Bitte zur Beachtung: FMX-TScrollBars unterscheiden sich selbstverständlich von VCL-TScrollBars, wieso auch nicht? ;)

Sherlock

Rollo62 18. Aug 2016 05:58

AW: FMX Scrollbareigenschaften berechnen
 
Hast du das schonmal mit TImageViewer probiert statt Image und Scrollbar selber zusammenzubauen ?

Rollo

Sherlock 18. Aug 2016 07:07

AW: FMX Scrollbareigenschaften berechnen
 
Hmmm, eventuell habe ich mich unklar ausgedrückt, als ich schrieb, daß sowas wie eine ScrollBox (TImageViewer ist eine solche) nicht in Frage kommt. Ich möchte zwei bewegliche Images, die wiederrum auf zwei statischen Images liegen gleichzeitig mit einer Scrollbar bewegen. Falls das auch mit TImageViewer geht, bitte ich um eine Erklärung wie.

Problematisch erscheint mir im Übrigen auch noch dieser Hinweis in der Doku: "Rotating an (TImageViewer) on mobile platforms might produce unexpected results." :?

Sowas könnten meine Anwender aber vorhaben, diese Schlingel.

Sherlock

Rollo62 18. Aug 2016 09:17

AW: FMX Scrollbareigenschaften berechnen
 
Ich verstehe doch richtig das d ein TImage hast was Überbreite hat, und du willst es innerhalb eines "Viewports" scrollen ?
Was spricht da gegen ScrollBox u. Derivate ?

Oder willst du mit ScrollMar das TImage neu erzeugen, mit anderen PArameters ?

Aber du drehst an der Breite rum, da denke ich Scrollen ist das Ziel.

Wo findest du den Hinweis das TImageViewer ein Rotate-Problem hat, also bei mir klappt das super.

Rollo

Sherlock 18. Aug 2016 10:59

AW: FMX Scrollbareigenschaften berechnen
 
OK, ich habs probiert, und es geht gar nicht. Zum einen ist der TImageViewer nicht transparent und verdeckt somit mein Koordinatengrid, und zu anderen nimmt die beabsichtigte horizontzale Scrollbar mir Platz weg, und es wird eine unerwünschte vertikale Scrollbar eingeblendet. Ich kann aber nicht den ImageViewer vergrößern, weil ich sonst Probleme mit der Übereinstimmung von Punkten und Koordinatensystem bekomme.

Mein Ansatz die Kurve vor dem Koordinatensystem zu verschieben ist mir dann doch deutlich lieber, einfacher und komfortabler. Es fehlt ja nicht mehr viel, Es müsste "lediglich" eine Möglichkeit geben, das Position.X auch einen negativen Wert bekommen kann, so daß ich auch das rechte Ende der Kurve in einem kleinen Sichtbereich anzeigen kann. Ich setz mich jetzt wieder ran, und experimentiere mit den Verhältnissen und Koordinaten. Eigentlich sollte ja die Viewport-Position die Position des Bildes innerhalb des Anzeigebereichs wiederspiegeln... hmmm.

Sherlock

Sherlock 18. Aug 2016 13:27

AW: FMX Scrollbareigenschaften berechnen
 
So, jetzt hab ichs. Alles bleibt wie gehabt, nur das ScrollBarChange muss so aussehen:
Delphi-Quellcode:
procedure TFReader.ScrollBarChange(Sender: TObject);
begin
  TraceImage.Position.X := GridLayout.Width + (TraceImage.Width * ScrollBar.Value / GridLayout.Width) - TraceImage.Width;
end;
Dadurch verschiebt sich der sichtbare Bereich des TraceImages absolut synchron zum ViewPort der ScrollBar. Traumhaft.

Sherlock


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