AGB  ·  Datenschutz  ·  Impressum  







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

TGrid in FM mit Daten füllen

Ein Thema von Peter-Pascal · begonnen am 18. Jan 2014 · letzter Beitrag vom 27. Jan 2014
Antwort Antwort
Seite 2 von 3     12 3      
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
199 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: TGrid in FM mit Daten füllen

  Alt 22. Jan 2014, 19:42
Hallo Volker,

Dein Listing funktioniert perfekt auch bei TListbox. Mit der Maus. Aber merkwürdigerweise nicht mit dem Finger. Ich versteh das nicht, bewege ich die Scrollbalken per Maus, bewegt sich die angeschlossenen Listbox im Gleichschritt.

Aber per Touch nicht.

Ich habe versucht das Ereignis zu finden. OnGesture offenbar nicht. Delphi unterscheidet zwischen Standardgesten und interaktiven Gesten. OnGesture wird nur bei interaktiven Gesten ausgeführt, soweit ich das begriffen habe.

Weißt Du welches Ereignis ausgelöst wird, wenn die ListBox per Touch gescrollt wird? Dann kann ich vielleicht dort auch die andere ListBox synchronisieren?

Danke nochmal für Deine Hilfe.

Hat man ein Problem gelöst öffnet sich das nächste. So langsam bin ich etwas enttäuscht von FM.

Mit den ListBox wollte ich einen Zeitstrahl aufbauen. Jedes Ereignis ein Listboxitem, welches abhängig von der Zeit seine Größe zugewiesen bekommt.

Ich schreibe das unter Win 8.1 mit Metropolis UI. Mir gefällt die Oberfläche und ich finde das Design sehr edel. Zumal ich einen Touch-Screen Monitor habe. Aber leider bin ich bislang nur auf Probleme gestoßen.

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#12

AW: TGrid in FM mit Daten füllen

  Alt 22. Jan 2014, 22:21
Hallo,

Zitat:
[...] funktioniert [...] Mit der Maus [...] Aber per Touch nicht
Wie habe ich mir das vorzustellen? Du ziehst mit dem Finger den Scrollbalken nach unten/oben: die Liste scrollt, der Balken ändert seine Position aber die zweite Liste ändert ihre Position nicht. Oder machst Du etwas anderes? Stichwort: Gesten.

Ich kann es leider nicht nachbilden und testen - Grund: fehlendes Finger-Fummel-Gerät.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#13

AW: TGrid in FM mit Daten füllen

  Alt 22. Jan 2014, 23:33
Hallo,

ich sehe gerade, dass die TScrollBox zwar das MouseWheel verarbeitet und die Position des vertikalen Scrollbars neu setzt, aber kein OnVScrollChange getriggert wird .

Mit:
Delphi-Quellcode:
procedure TForm1.ListBox1MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
  ListBox2.VScrollBar.Value := ListBox1.VScrollBar.Value - ListBox1.VScrollBar.SmallChange * WheelDelta / 120
end;
solltest Du das synchronisiert bekommen. Vielleicht ergibt sich dabei auch etwas in Sachen Touchproblem.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
199 Beiträge
 
Delphi 11 Alexandria
 
#14

AW: TGrid in FM mit Daten füllen

  Alt 23. Jan 2014, 10:09
Hallo Volker,

nochmals vielen Dank, dass Du Dich meinen Problemen so annimmst. Dabei hilfst Du mir FM besser zu verstehen. Wobei ich sagen muss, dass mir vieles nicht so ganz einleuchtet.

Nun denn: mit den Fingern mache ich in der Tat etwas anderes. Ich bewege nicht den Scrollbalken, sondern direkt mit einem Finger mitten auf die Liste und bewege so die Liste selber. Wenn ich den Scrollbalken mit den Fingern bewege, funktioniert die Synchronisation mit dem anderen Scrollbalken.

Mit den Fingern direkt auf der Liste verschiebe ich in die andere Richtung als ich den Scrollbalken mit der Maus verschiebe. Wenn ich die Liste nach rechts scrollen will, verschiebe ich den Slider vom Scrollbalken auch nach rechts. Mit dem Finger bewege ich die ganze Liste nach links. Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.

So weit so gut. Aber wie auch immer es wird auch der Scrollbalken bewegt. Ich verstehe nicht, warum dann die Synchronisation nicht funktioniert. Offensichtlich wird OnHScrollChange nicht aufgerufen.

Wo hast Du gefunden, wie die einzelnen Methoden getriggert sind?

Gruß Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#15

AW: TGrid in FM mit Daten füllen

  Alt 23. Jan 2014, 15:36
Hallo,

Zitat:
[...] Dabei hilfst Du mir FM besser zu verstehen. Wobei ich sagen muss, dass mir vieles nicht so ganz einleuchtet.
Ich muss gestehen, dass ich bisher noch nicht wirklich mit FM gearbeitet habe. Ist für mich eine gute Gelegenheit mich da mal ein bisschen einzuarbeiten .

Zitat:
Nun denn: mit den Fingern mache ich in der Tat etwas anderes [...]
Habe ich mir fast gedacht. Wie schon gesagt: Das mit dem Wischen, Tippen und Finger-Fummeln kann ich nicht testen. Aber mit dem Ansatz Gesten solltest Du schon richtig liegen.

Zitat:
[...] Delphi unterscheidet zwischen Standardgesten und interaktiven Gesten. OnGesture wird nur bei interaktiven Gesten ausgeführt, soweit ich das begriffen habe.
Nö. Die Standardgesten werden schon getriggert, wenn Du einen GestureManager nutzt, den jeweiligen Komponenten zuweist und die entsprechenden Standardgesten (im OI: Touch -> Gestures -> Standard) einhängst.

Ich kann es zwar nicht mit Wischen, aber ich habe mal versucht das mit der Maus nachzubilden:
  • Aufs Form eine ScrollBox (ScrollBox1), in diese Scrollbox ein Panel gelegt.
  • Das Panel: Position (0, 0), Höhe und Breite so eingestellt, dass es die Grenzen der Scrollbox (deutlich) überschreitet.
  • Dieses Konstrukt kopiert und aufs Form geklatscht.
  • Ein GestureManager auf Form und an die ScrollBox1 gehängt (OI Eigenschaft Touch.GestureManager), als Standardgesten [Left,Right,Up,Down] und der ScrollBox1 ein OnGesture spendieren.
Dann kann ich mit:
Delphi-Quellcode:
type
  TScrollBox = class (FMX.Layouts.TScrollBox)

  end;
  
  TForm1 = class(TForm)
    ScrollBox1 : TScrollBox;
    Panel1: TPanel;
    GestureManager1: TGestureManager;
    ScrollBox2: TScrollBox;
    Panel2: TPanel;
    procedure ScrollBox1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
    procedure FormCreate(Sender: TObject);
  private
    procedure SyncHScrollBars (Sender : TObject);
    procedure SyncVScrollBars (Sender : TObject);
  end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ScrollBox1.OnHScrollChange := SyncHScrollBars;
  ScrollBox1.OnVScrollChange := SyncVScrollBars
end;

procedure TForm1.ScrollBox1Gesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
  case EventInfo.GestureID of
    sgiDown : ScrollBox1.ScrollTo (0, -40);
    sgiLeft : ScrollBox1.ScrollTo (-40, 0);
    sgiRight : ScrollBox1.ScrollTo (40, 0);
    sgiUp : ScrollBox1.ScrollTo (0, 40);
  end
end;

procedure TForm1.SyncHScrollBars (Sender : TObject);
begin
  ScrollBox2.HScrollBar.Value := ScrollBox1.HScrollBar.Value
end;

procedure TForm1.SyncVScrollBars (Sender : TObject);
begin
  ScrollBox2.VScrollBar.Value := ScrollBox1.VScrollBar.Value
end;
das Wischverhalten nachbilden und die beiden Scrollboxen synchronisieren.

Vielleicht hilft Dir das Beispiel Deine Listboxen (die sind ja letztlich von TScrollBox abgeleitet) zu synchronisieren.

Zitat:
Wo hast Du gefunden, wie die einzelnen Methoden getriggert sind?
FMX Sourcen anschauen.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
199 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: TGrid in FM mit Daten füllen

  Alt 23. Jan 2014, 21:34
Heureka,

das funktioniert soweit bei FMX mit HD. Und dann sieht es auch ganz gut aus.

Vielen Dank.

Ich bin jetzt auch angefangen, mir die Sourcen anzuschauen. Ich glaube dadurch bekomme ich dann doch vielleicht mehr Verständnis von FMX. Ob es die richtige Entscheidung ist Metropolis UI zu verwenden, weiß ich nicht. Bislang hat mich allein nur herauszufinden, welche Komponente für die Darstellung einer Zeitleiste in Betracht kommt, ein paar Wochenenden gekostet.

Leider ist das bei Metropolis offenbar alles anders. Die Standardgesten funktionieren in Metropolis nicht. In FMX bekomme ich das alles sauber hin.

Gruß Peter
Peter Niemeier

Geändert von Peter-Pascal (23. Jan 2014 um 23:04 Uhr)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#17

AW: TGrid in FM mit Daten füllen

  Alt 24. Jan 2014, 00:31
Hallo,

Zitat:
Leider ist das bei Metropolis offenbar alles anders. Die Standardgesten funktionieren in Metropolis nicht. In FMX bekomme ich das alles sauber hin.
Was hakt denn da genau? Ich habe das Beispiel aus Post #15 als FireMokey-Anwendung für Metropolis-UI Delphi (Leere Metropolis-UI-Anwendung) erstellt. Machst Du noch was im FormGesture?

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
199 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: TGrid in FM mit Daten füllen

  Alt 24. Jan 2014, 10:29
Es ist mir peinlich, aber bei mir funktioniert es in Metropolis FMX nicht. Unter "Normal-" FMX schon.

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Ani, FMX.Layouts, FMX.Gestures,
  FMX.StdCtrls;

type

 TScrollBox = class (FMX.Layouts.TScrollBox)

   end;

  TForm1 = class(TForm)
    StyleBook1: TStyleBook;
    ToolbarHolder: TLayout;
    ToolbarPopup: TPopup;
    ToolbarPopupAnimation: TFloatAnimation;
    ToolBar1: TToolBar;
    ToolbarApplyButton: TButton;
    ToolbarCloseButton: TButton;
    ToolbarAddButton: TButton;
    ScrollBox1: TScrollBox;
    Panel1: TPanel;
    GestureManager1: TGestureManager;
    procedure ToolbarCloseButtonClick(Sender: TObject);
    procedure FormGesture(Sender: TObject;
      const EventInfo: TGestureEventInfo; var Handled: Boolean);
    procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char;
      Shift: TShiftState);
    procedure ScrollBox1Gesture(Sender: TObject;
      const EventInfo: TGestureEventInfo; var Handled: Boolean);
  private
    FGestureOrigin: TPointF;
    FGestureInProgress: Boolean;
    { Private-Deklarationen }
    procedure ShowToolbar(AShow: Boolean);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin
  if Key = vkEscape then
    ShowToolbar(not ToolbarPopup.IsOpen);
end;

procedure TForm1.ToolbarCloseButtonClick(Sender: TObject);
begin
  Application.Terminate;
end;

procedure TForm1.FormGesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
  DX, DY : Single;
begin
showmessage('Hello World');
  if EventInfo.GestureID = igiPan then
  begin
    if (TInteractiveGestureFlag.gfBegin in EventInfo.Flags)
      and ((Sender = ToolbarPopup)
        or (EventInfo.Location.Y > (ClientHeight - 70))) then
    begin
      FGestureOrigin := EventInfo.Location;
      FGestureInProgress := True;
    end;

    if FGestureInProgress and (TInteractiveGestureFlag.gfEnd in EventInfo.Flags) then
    begin
      FGestureInProgress := False;
      DX := EventInfo.Location.X - FGestureOrigin.X;
      DY := EventInfo.Location.Y - FGestureOrigin.Y;
      if (Abs(DY) > Abs(DX)) then
        ShowToolbar(DY < 0);
    end;
  end
end;

procedure TForm1.ScrollBox1Gesture(Sender: TObject;
  const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
showmessage('Hello World');
case EventInfo.GestureID of
     sgiDown : ScrollBox1.ScrollTo (0, -40);
     sgiLeft : ScrollBox1.ScrollTo (-40, 0);
     sgiRight : ScrollBox1.ScrollTo (40, 0);
     sgiUp : ScrollBox1.ScrollTo (0, 40);
   end;
end;

procedure TForm1.ShowToolbar(AShow: Boolean);
begin
  ToolbarPopup.Width := ClientWidth;
  ToolbarPopup.PlacementRectangle.Rect := TRectF.Create(0, ClientHeight-ToolbarPopup.Height, ClientWidth-1, ClientHeight-1);
  ToolbarPopupAnimation.StartValue := ToolbarPopup.Height;
  ToolbarPopupAnimation.StopValue := 0;

  ToolbarPopup.IsOpen := AShow;
end;

end.
Ich habe eine neue Anwendung erstellt: Firemonkey-Anwendung für Metropolis UI Delphi - anschließend Leere Metropolis-UI Anwendung.
Den Gesturemanager habe ich bei der Scrollbox eingehakt.

Gruß
Peter Niemeier
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 4. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#19

AW: TGrid in FM mit Daten füllen

  Alt 24. Jan 2014, 14:30
Hallo,

Zitat:
Es ist mir peinlich, aber bei mir funktioniert es in Metropolis FMX nicht. Unter "Normal-" FMX schon.
Peinlich muss da gar nix sein. Sieht so aus, als ob es ein paar nette kleine Unterschiede zwischen Metropolis UI und FM Desktop Anwendungen gibt.

Ich konnte Dein Problem mal nachstellen (vermute ich mal). Wenn die Metropolis UI Anwendung mit der Eigenschaft FullScreen := True (Standardeinstellung, hatte ich geändert ) läuft, dann werden die Gesten offenbar nicht getriggert.

Abhilfe schafft BorderStyle := bsNone . Wo der Unterschied genau liegt und was es für Auswirkungen hat muss ich erst noch untersuchen.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Peter-Pascal

Registriert seit: 18. Feb 2007
Ort: 32139 Spenge
199 Beiträge
 
Delphi 11 Alexandria
 
#20

AW: TGrid in FM mit Daten füllen

  Alt 24. Jan 2014, 14:57
Es ist unfassbar. Ich habe nur Fullscreen auf false gesetzt und die Routine onGesture von der Scrollbox wird ausgeführt.

So langsam muss ich aber mal Dir gegenüber meine Bewunderung zum Ausdruck bringen. Ich habe gestern bis fast Mitternacht an diesem Problem gerätselt und Du hast es in recht kurzer Zeit gefunden. Respekt!

Beste Grüße
Peter
Peter Niemeier
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:48 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