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 [Firemonkey] Maus-Inputs richtig realisieren (https://www.delphipraxis.net/189683-%5Bfiremonkey%5D-maus-inputs-richtig-realisieren.html)

milos 8. Jul 2016 20:29

[Firemonkey] Maus-Inputs richtig realisieren
 
Hi,

ich würde gerne die Maus-Inputs für ein Zeichenprogramm realisieren stecke aber leider bei der Planung fest, weil ich ein paar Probleme habe die OnMouse- Events über jede einzelne Komponente zu steuern. Und zwar ist das Problem das ich nun mehrere Komponente auf einem Panel (Das "Zeichenbrett") liegen habe die der Bearbeitung dienen also kann man damit die gezeichneten Objekte verschieben, vergrössern, rotieren usw.
Und manchmal kann es ja halt vorkommen das die Maus, während dem man z.B. das Objekt rotiert, aus der Komponente fällt weil sich sie sich selbst auch bewegt und somit das OnMouseMove Event ja nicht weitermacht wie sie eigentlich sollte...

Ich dachte am einfachsten wäre es HitTest überall auf false zu setzen und alle möglichen OnMouse Events nur auf dem Zeichenbrett-Panel zu regeln, ist das aber wirklich sinnvoll? Das wäre mein einziger Gedanke aber vielleicht gibt es für mein Problem auch andere, bessere Lösungen.
[added]Ach, und wie würde ich da abfragen ob die Maus im Control ist? Also auch mit RotationAngle/RotationCenter einbezogen ;)[/added]


Freundliche Grüsse

Harry Stahl 9. Jul 2016 00:21

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Habe gerade keinen PC, sondern nur ein iPad zur Verfügung (kann also derzeit keinen Source kopieren), daher im Moment nur ein Verweis, bzw. ein Stichwort für die Lösung:

Falls Du mein XE7 Buch haben solltest, findest unter Rezept 7 "Das Control unter der aktuellen Mausposition ermitteln" ein kleines Beispiel, ansonsten empfehle ich in der Delphi Dokumentation die Lektüre von "ObjectAtPoint" (sorry für den Werbeblock, aber vielleicht ist ja die Investition von 9,99 Euro (Kindle-Version) für den einen oder anderen FMX-Anwender auch eine Option, um solche Standardfragen schnell beantwortet zu bekommen:wink:).

Einen kleinen Bildeditor habe ich mit FMX auch schon mal gemacht (http://www.hastasoft.de/PixPowerEditor.htm), mit FMX geht das im Vergleich zur VCL Recht einfach.

milos 9. Jul 2016 01:50

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Hallo Harry!

Vielen dank für den Tipp, das funktioniert bestens und lässt mich nun Prima alle Events über das Hauptpanel steuern. :)
Ich habe mir schon mal drüber Gedanken gemacht das XE7 Buch zu kaufen. Ich arbeite mittlerweile öfters in FMX als in VCL und hier im Forum kann man bei FMX fragen auch immer auf dich zählen. ;)
Ich werde es mir wohl bei der nächsten Gelegenheit kaufen, kann ja dabei nichts falsch machen. :-D

Freundliche Grüsse

Rollo62 9. Jul 2016 03:14

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Hallo Milos,

In Fmx gibt es TSelectionPoints, die lassen sich eigentlich ganz gut verschieben und als Ankerpunkte benutzen, das ist wohl deren Sinn.

Damit bewege ich die Ankerpunkte und lasse die Objekte entsprechend nachzeichnen.

Das funktioniert ganz gut, ich wollte die aber später auch Ersetzen, so ähnlich wie du das möchtest weil bei vielen Objekten auch zu viele TSelectionPoints erzeugt werden müssten.

Wenn die nicht viele Objekte hast wäre das eine Alternative, es gibt auch ein Demo irgendwo
in den Beispielen.

Rollo

milos 9. Jul 2016 04:42

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Hi Rollo,

Danke für den Hinweis, kannte ich noch nicht und werde mal einen Blick drauf werfen. :thumb:

Ich wollte für das Programm ein einfaches aber effektives handling mit mehreren modis geben und habe es nun so gemacht dass ich die "Tools" (z.b. so ein Rahmen bei PowerPoint zum vergrössen/verkleinern und rotieren) mit Komponenten gebastelt habe, deren HitTest auf false gesetzt habe und nun das ganze über die OnMouse-Events des Parents löse was bisher sehr einfach geht und auch gut zu erweitern sein dürfte wenn man sich ein wenig geschikt anstellt. :D

Sieht dank Firemonkey sehr gut aus, vieles lässt sich einfach "zusammenklicken" und die Events laufen so, wie ich mir das schon von anfang an gewünscht hätte und auch den Cursor kann man ohne Probleme anpassen, auch ohne HitTest ;)

Um abzufragen ob die Koordinaten über eine bestimmte Komponente liegt gibt es Delphi-Referenz durchsuchenFMX.Controls.TControl.PointInObject welches glücklicherweise sogar die Rotation und andere Formen beachtet ^^

Freundliche Grüsse

Rollo62 9. Jul 2016 07:12

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Hallo Milos,

das funktioniert auch super, die Probleme fangen an wenn man auf Android/iOS Retina,
etc. mit verschiedenen Displays arbeiten muss.

Da ist mir das SceneScale BitmapScale, etc. nicht ganz klar, bzw. wann welche Scales wirken.
Das mustre ich etwas frickeln, aber ich glaube es gibt da auch einfache, saubere Lösungen.

Ich arbeite aber auch mit einem TImageViewer, was die Sache etwas erschwert.
Man muss zuerst das Image darin finden, und die Positionen können sich je nachdem ändern,
darüber habe ich einen LAyer indem ich die Objekte zeichne.

So kann ich alles Zoom, Pan mit dem ImageViewer.
Will ich nochmal überarbeiten und optimieren, aber als Grundlage ist der ImageViewer für mich die Beste Wahl.

Rollo

Harry Stahl 9. Jul 2016 14:09

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Rollo62 (Beitrag 1342292)
Hallo Milos,

In Fmx gibt es TSelectionPoints, die lassen sich eigentlich ganz gut verschieben und als Ankerpunkte benutzen, das ist wohl deren Sinn.

Damit bewege ich die Ankerpunkte und lasse die Objekte entsprechend nachzeichnen.
Rollo

Auch nicht schlecht ist das "TSelection". Da kann man ein Objekt reinlegen, Hittest des Objekts auf False setzen und mit dem TSelection kannst Du dann letztlich das darin liegende Objekt (das alClient hat) bewegen und beliebig skalieren.

Siehe anliegenden Screenshot.

@Milos: Habe mal die Windows-Version des PixPower-Editor-Programms auf meine Devpage geladen, das kannst Du Dir bei Bedarf mal die TSelection-Lösung ansehen, indem Du z.B. eine neue leere Grafik erzeugst und da mal mit dem Textwerkzeug einen Text einfügst (kein Installationsprogramm, nur eine gezippte Exe, ca. 2,5 MB). Dazu nur ein Hinweis, das Programm hatte ich noch mit XE5 als reine MAC-Version entwickelt (letzter Stand Sept. 2014), die Windows-Version ist quasi nur "Abfallprodukt" und enthält einige wenige Funktionen nicht (z.B. Screenshot) und kann man wirklich nur als Demo sehen. Hier der Download-Link: http:\\www.devpage.de\download\PixPowerFMX.zip.

milos 9. Jul 2016 20:04

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Hi,

Interessant... habe beim rumspielen bemerkt das TSelection und TSelectionPoint sogar reagieren wenn man die Maus ausserhalb des Fensters bewegt, was also heissen müsste das sie nicht über die normalen OnMouse-Events gesteuert werden oder? Ich könnt mir denken das es gehen würde einen extra Thread zu machen aber dafür wäre das ja ein wenig too much würde ich mal annehmen oder könnte man da Delphi-Referenz durchsuchenTApplication.OnIdle nehmen?

Danke für das Hochladen für das Programm, wenn man weiss wie es geht kann man mit FMX doch etwas tolles machen :thumb:

Freundliche Grüsse

milos 10. Jul 2016 00:20

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Also ich habe nun alles getestet und bin zum Entschluss gekommen dass ich das so mache:
  • Die Tools (z.B. TSelection nachbau, PerspectiveTransform usw) erstelle ich mit Firemonkey Komponenten und setze jeden HitTest auf False.
  • Das Parent handelt nun die OnMouse-Events wie folgt:
    • OnMouseMove: Überprüft mit TControl.PointInObject ob die Maus auf einem Control liegt.
    • OnMouseDown: Ist die Maus gerade über einem Control welche eine Aufgabe haben soll wird dies nun bemerkt und in OnIdle später berücksichtigt.
    • OnMouseUp: Sollte klar sein ;)
  • TApplication.OnIdle benutze ich um die Mausbewegungen effektiv umzusetzen da man nun auch ausserhalb des Fensters oder auf anderen Controls gehen kann was ziemlich nützlich ist.

Einziges Problem hierbei ist das falls man die Maus ausserhalb des Fensters loslässt, da hier nun OnMouseUp nicht getriggert wird aber das lässt sich leicht beheben. :)

Freundliche Grüsse

Rollo62 10. Jul 2016 02:19

AW: [Firemonkey] Maus-Inputs richtig realisieren
 
Probier aber auch auf allen plattformen aus. Es verhält sich leider nicht überall gleich. Auch wg. Tap und Longtap. Letzteres habe ich in der fmx.platform.ios rausgeschmissen weil es einfach nicht laufen wollte.

Iche habe auch so angefangen und jetzt spagetticode mit vielen kleinen workarlunds. Die werde ich alle mal aufräumen müssen.

Ich habe es für mich so gemöst das ich eine controllerklasse angelegt habe die mir alles zum TImageView richtig einstellt.

Auch das separiert in keygestures draw modul etc.
Das um die gröbsten workarounds abzufangen.

So kann ich ein standard imageviewer reinwerfen und mit dem controller verbi den.
Der kümmert sich um TLauout Timage etc.


Rollo


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