![]() |
Scrollen zu einer absoluten Position innerhalb einer FMX.TScrollbox
Hallo,
ich habe ein FMX-Form mit einer TScrollbox. Breite der Scrollbox ist z. B. 1000, die Höhe 7000. Meine Position in der Scrollbox ist z. B. 1300 vertical. Nun möchte ich zur vertikalen Position 5000 scrollen. Ein ScrollBy mit 3700 funktioniert nicht, da komme ich nicht exakt bei 5000 raus. Es gibt ein ScrollTo, das ist aber deprecated und laut Hilfe solld as was mit Viewport-Koordinaten rechnen, wenn man sich aber den Code ansieht dann macht das nichts anderes als ein ScrollBy aufzurufen. Wie setze ich also die Scrollbox-Position EXAKT auf einen vorgegebenen Wert? Stefan |
AW: Scrollen zu einer absoluten Position innerhalb einer FMX.TScrollbox
Ich hatte mir mal sowas gebastelt, ich weiss nicht ob das in Deinem Fall für dich auch funktioniert.
Man muss an allem möglichen Internas rumschrauben, auch sowas wie Targets und AniCalculations, aber das lief dann bei mir.
Delphi-Quellcode:
procedure TCustomScrollBox_Helper.Viewport_ScrollTo(const AX, AY: Single);
var LVp : TPointF; LTracking : TTouchTracking; begin //04.03.21 Keep last Tracking LTracking := Self.AniCalculations.TouchTracking; // Make space for the VK-Board Self.AniCalculations.TouchTracking := [ ttVertical ]; // Rx10: Stop Tracking Animation, since no Enable here ? LVp := Self.ViewportPosition; if ( AX < LVp.X ) or ( AY < LVp.Y ) then begin // Scroll downwards, needs to clear the Min WORKAROUND Targets_Reset_Min( 0.0, 0.0 ); end else if (AX > ( LVp.X + Self.Width )) or (AY > ( LVp.Y + Self.Height )) then begin // Scroll uüwards, needs to grow the Max WORKAROUND Targets_Reset_Max( AX, AY ); end; Self.ViewportPosition := PointF( AX, AY ); //Self.ViewportPosition.X + AX, Self.AniCalculations.TouchTracking := []; Self.AniCalculations.TouchTracking := LTracking; // 04.03.21 Reset last tracking end; procedure TCustomScrollBox_Helper.Targets_Reset_Min(const AX, AY: Single); var LTargets : array of TAniCalculations.TTarget; I : Integer; begin // Make space SetLength(LTargets, Self.AniCalculations.TargetCount); Self.AniCalculations.GetTargets(LTargets); for I := 0 to Length(LTargets)-1 do begin if LTargets[I].TargetType = TAniCalculations.TTargetType.Min then begin // Force MinTarget to new min setting WORKAROUND SCROLLBOX LTargets[I].Point := PointF(AX, AY); end; end; Self.AniCalculations.SetTargets(LTargets); // Reset Targets end; procedure TCustomScrollBox_Helper.Targets_Reset_Max(const AX, AY: Single); var LTargets: array of TAniCalculations.TTarget; LCnt : Integer; LTgt : TAniCalculations.TTargetType; LIdxMin : Integer; LIdxMax : Integer; I: Integer; begin // Make space LCnt := Self.AniCalculations.TargetCount; if LCnt < 2 then begin //18.02.22 Need at Least Min/MaxTarget = 2 LCnt := 2; end; SetLength(LTargets, LCnt ); for I := 0 to Length( LTargets )-1 do begin LTargets[ I ].TargetType := TAniCalculations.TTargetType.Other; // Preset Array end; Self.AniCalculations.GetTargets( LTargets ); //18.02.22 Check if Min/MaxTargets needs to be added LIdxMin := -1; LIdxMax := -1; for I := 0 to Length( LTargets )-1 do begin LTgt := LTargets[ I ].TargetType; if ( LTgt <> TAniCalculations.TTargetType.Other ) then begin if ( LTgt = TAniCalculations.TTargetType.Min ) then begin LIdxMin := I; end; if ( LTgt = TAniCalculations.TTargetType.Max ) then begin LIdxMax := I; end; Continue; //<== WAS ALREADY AVAILABLE =============================== end; if ( LIdxMax < 0 ) then begin LIdxMax := I; // First Max continue; //<== CONTINUE ===================================== end; if ( LIdxMin < 0 ) then begin LIdxMin := I; // First Min continue; //<== CONTINUE ===================================== end; end; if ( LIdxMin < 0 ) and ( LIdxMax < 0 ) then begin // Something wrong end else begin LTargets[ LIdxMin ].TargetType := TAniCalculations.TTargetType.Min; LTargets[ LIdxMin ].Point := PointF( 0.0, 0.0 ); LTargets[ LIdxMax ].TargetType := TAniCalculations.TTargetType.Max; LTargets[ LIdxMax ].Point := PointF( AX, AY ); end; Self.AniCalculations.SetTargets( LTargets ); // Reset Targets end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:46 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