AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

[Firemonkey] Maus-Inputs richtig realisieren

Ein Thema von milos · begonnen am 8. Jul 2016 · letzter Beitrag vom 10. Jul 2016
Antwort Antwort
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
486 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

[Firemonkey] Maus-Inputs richtig realisieren

  Alt 8. Jul 2016, 21:29
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
Milos

Geändert von milos ( 8. Jul 2016 um 21:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.176 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 01:21
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).

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.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
486 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 02:50
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.

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.216 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 04:14
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
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
486 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 05:42
Hi Rollo,

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

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.

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
Milos

Geändert von milos ( 9. Jul 2016 um 05:48 Uhr)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.216 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 08:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.176 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 15:09
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.
Miniaturansicht angehängter Grafiken
selection.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
486 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 9. Jul 2016, 21:04
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

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
486 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 10. Jul 2016, 01:20
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
Milos
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
3.216 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: [Firemonkey] Maus-Inputs richtig realisieren

  Alt 10. Jul 2016, 03:19
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 06:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf