AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[FMX] Image mit Scrollfunktion

Ein Thema von Peter666 · begonnen am 13. Mär 2016 · letzter Beitrag vom 17. Mär 2016
Antwort Antwort
Peter666

Registriert seit: 11. Aug 2007
357 Beiträge
 
#1

[FMX] Image mit Scrollfunktion

  Alt 13. Mär 2016, 10:53
Hi,

es ist mir etwas peinlich nur mit Fragen hier beizusteuern, aber auch diesmal hab ich eine ebensolche. Mein Konkretes Problem ist dass ich sowas wie ein Gantt Diagramm erstelle und die dahinter liegenden Datensätze gigantisch sind. Wunsch ist das auch auf mobilen Geräten zu erstellen. Meine Idee war also folgende: Ich erstelle eine Komponente die ein Bitmap mit dem Bildausschnitt beinhaltet. Ich möchte nun eine virtuelle Scrollbox erstellen und mit den relativen Koordinaten die der horizontale und vertikale Scroller liefert den Ausschnitt neu rendern. Das geht zwar mit der Maus, wenn man auf die Scrollbars klickt, aber mit Touchpad oder Touchdisplay geht das nicht. Hat jemand schon so etwas in der Art gemacht?

Peter
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#2

AW: [FMX] Image mit Scrollfunktion

  Alt 14. Mär 2016, 12:03
Uff, die sauberste Variante ist wahrscheinlich wenn Du TAniCalculations zu verwenden. Da bin ich aber ehrlich gesagt dran verzweifelt. Ich hab dann für mein Problem einfach folgendes gemacht:

Delphi-Quellcode:
const
 BOUNDS_WIDTH = 10000;
 BOUNDS_HEIGHT = 10000;

TMyClass = class(TCustomScrollBox)
protected
 ..
function DoCalcContentBounds: TRectF; override;
    procedure ViewportPositionChange(const OldViewportPosition,
      NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
      override;
    function GetDefaultStyleLookupName: string; override;
..

function TMyClass.GetDefaultStyleLookupName: string;
begin
  result := 'framedscrollboxstyle';
end;

function TMyClass.DoCalcContentBounds: TRectF;
begin
  result := RectF(0, 0, BOUNDS_WIDTH, BOUNDS_HEIGHT);
end;

procedure TMyClass.ViewportPositionChange(const OldViewportPosition,
  NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
begin
  FImage.Position.Point := NewViewportPosition; //FImage ist mein Bild mit den Maßen der TMyClass (ohne Scrollbars)
  //virtual_x = NewViewportPosition.x/BOUNDS_WIDTH*RealXVal <- damit kannst du dann die Werte virtualisieren
...
Glücklich bin ich mit der Lösung nicht. Vielleicht hat jemand ja eine bessere Idee. :Wub:

Christian
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.093 Beiträge
 
Delphi 12 Athens
 
#3

AW: [FMX] Image mit Scrollfunktion

  Alt 16. Mär 2016, 12:51
Ich benutze ein TImageView (basiert auf TScrollBox), mit einem Hintergrundbild und lege
ein Layout darein in das ich die Elemente in OnPaint selber zeichne.

Das funktioniert ganz gut, allerdings ist es schon sehr tricky das ans Laufen zu bekommen.
Die Koordinaten, die TAniCalculations, die Mouse/TouchEvents um jeweils Pan/Zoom als auch Drag and Drop
schön sauber zu selektieren (auf Phones/Tablets) ist eine Herausforderung.

Was ich vermute ist das es bei vielen Objekten sehr oft komplett neugezeichnet wird, deshalb müsstest
du wahrscheinlich deine eigene ViewPort Filterung einbauen, und nur das zeichnen was gerade sichtbar ist.

Wenn du alles in einem Bitmap vorzeichen willst solltest du daran denken das die Bitmaps nicht unendlich groß werden können, und je nach Platform anders sein werden. Ich hatte schon des öfteren Probleme damit, insbesondere bei Screenshots.

Rollo
  Mit Zitat antworten Zitat
CHackbart

Registriert seit: 22. Okt 2012
267 Beiträge
 
#4

AW: [FMX] Image mit Scrollfunktion

  Alt 17. Mär 2016, 19:57
Ich poste mal eine etwas aufgeräumte Variante von meinem Ansatz:

Delphi-Quellcode:
type
  TVirtualScrollBox = class(TCustomScrollBox)
  private
    FContentSize: TPointF;
  protected
    procedure DoPaint; override;
    function DoCalcContentBounds: TRectF; override;
    function GetDefaultStyleLookupName: string; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

constructor TVirtualScrollBox.Create(AOwner: TComponent);
begin
  inherited;
  FContentSize := PointF(10000, 10000);
end;

procedure TVirtualScrollBox.DoPaint;
begin
  inherited;
  canvas.Fill.Color := $FF000000;
  canvas.FillText(ClipRect, format('%0.2f/%0.2f',
    [HScrollBarValue / FContentSize.X, VScrollBarValue / FContentSize.Y]),
    false, 1, [], TTextAlign.Center, TTextAlign.Center);
end;

function TVirtualScrollBox.DoCalcContentBounds: TRectF;
begin
  result := RectF(0, 0, FContentSize.X, FContentSize.Y);
end;

function TVirtualScrollBox.GetDefaultStyleLookupName: string;
begin
  result := 'framedscrollboxstyle';
end;
Im Prinzip muss man nur DoPaint überschreiben mit seiner eigenen Logik. Mir gefällt das Basiskonstrukt in der Form nicht wirklich, aber es läuft recht passabel. Eventuell kann das ja jemand auch nutzen

Christian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 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