![]() |
AW: TGrid in FM mit Daten füllen
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 |
AW: TGrid in FM mit Daten füllen
Hallo,
Zitat:
Ich kann es leider nicht nachbilden und testen - Grund: fehlendes Finger-Fummel-Gerät. Gruß |
AW: TGrid in FM mit Daten füllen
Hallo,
ich sehe gerade, dass die TScrollBox zwar das MouseWheel verarbeitet und die Position des vertikalen Scrollbars neu setzt, aber kein OnVScrollChange getriggert wird :wall:. Mit:
Delphi-Quellcode:
solltest Du das synchronisiert bekommen. Vielleicht ergibt sich dabei auch etwas in Sachen Touchproblem.
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; Gruß |
AW: TGrid in FM mit Daten füllen
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 |
AW: TGrid in FM mit Daten füllen
Hallo,
Zitat:
Zitat:
Zitat:
Ich kann es zwar nicht mit Wischen, aber ich habe mal versucht das mit der Maus nachzubilden:
Delphi-Quellcode:
das Wischverhalten nachbilden und die beiden Scrollboxen synchronisieren.
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; Vielleicht hilft Dir das Beispiel Deine Listboxen (die sind ja letztlich von TScrollBox abgeleitet) zu synchronisieren. Zitat:
Gruß |
AW: TGrid in FM mit Daten füllen
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 |
AW: TGrid in FM mit Daten füllen
Hallo,
Zitat:
Gruß |
AW: TGrid in FM mit Daten füllen
Es ist mir peinlich, aber bei mir funktioniert es in Metropolis FMX nicht. Unter "Normal-" FMX schon.
Delphi-Quellcode:
Ich habe eine neue Anwendung erstellt: Firemonkey-Anwendung für Metropolis UI Delphi - anschließend Leere Metropolis-UI Anwendung.
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. Den Gesturemanager habe ich bei der Scrollbox eingehakt. Gruß |
AW: TGrid in FM mit Daten füllen
Hallo,
Zitat:
Ich konnte Dein Problem mal nachstellen (vermute ich mal). Wenn die Metropolis UI Anwendung mit der Eigenschaft
Delphi-Quellcode:
(Standardeinstellung, hatte ich geändert :oops:) läuft, dann werden die Gesten offenbar nicht getriggert.
FullScreen := True
Abhilfe schafft
Delphi-Quellcode:
. Wo der Unterschied genau liegt und was es für Auswirkungen hat muss ich erst noch untersuchen.
BorderStyle := bsNone
Gruß |
AW: TGrid in FM mit Daten füllen
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 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 by Thomas Breitkreuz