Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt (https://www.delphipraxis.net/168608-onleave-ereignis-prozedur-wird-am-falschen-objekt-ausgefuehrt.html)

suppennudel 30. Mai 2012 23:50

OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Hallo liebe Community,

ich habe einige Foren und Treats nach einem OnLeave Ereignis durchgesucht, weil es soetwas ja z.b. bei einem Image nicht gibt. Ich bin auch fündig geworden und habs in mein Programm eingebaut (von TImage abgeleitete Klassed).

Ich nutze die Prozedur indem ich bei der OnEnter-Prozedur das Image einige Pixel nach oben verschieben und bei OnLeave das Image wieder die Pixel nach unten verschieben lasse.
Außerdem habe ich mehrere solcher modifizierter Images nebeneinander.

Mein Problem ist: Wenn ich nun, während ich auf dem einen Image bin, die Maustaste gedrückt halte, über ein anderes Image fahre, sie dort wieder los lasse und mit der Maus vom Image runtergehe, wird die OnLeave-Prozedur bei dem anderen Image ausgeführt, also nicht bei dem, auf das ich ursprünglich gegangen bin.

Soweit ist das ja auch logisch... Nur, gibt es eine Möglichkeit die OnEnter/OnLeave Prozeduren immer ausführen zu lassen, auch wenn die Maustaste gedrückt ist??? oder mein Problem anderweitig zu lösen?

Über hilfreiche Tips würde ich mich sehr freuen :D

himitsu 31. Mai 2012 00:05

AW: OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Selbst Schuld?
Es gibt einen Grund, warum es keiner implementiert hat. :stupid:

TImage ist, wie auch TLabel und TPaintBox kein eigenständiges WinControl.
Diese nutzen den Canvas des übergeordneten Controls (Parent).
Du bleibst also, aus Sicht vom Windows, dennoch auf dem selben Control (dem Parent) und verläßt es eigentlich nicht.

TImage in je einem eigenständigen Panel (ohne Border) verpacken. (kann man auch über eine Klasse machen, welche man von TPanel abgeleitet und intern ein TImage mit alClient erstellt/verwaltet)

Oder gleich nur direkt TPanel oder Dergleichen verwenden (ohne TImage) und dieses dort über ein eigenens OffscreenBitmap (TBitmap oder TPicture) im WM_PAINT ausgeben.

jaenicke 31. Mai 2012 06:14

AW: OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Suchst du vielleicht so etwas wie mein Open Source Periodensystem? Das ist selbst gezeichnet, ohne mehrere TImages oder ähnlichen Ballast. ;-)
Du kannst ja mal schauen, ob der Weg für dich nicht auch sinnvoller wäre.

ConnorMcLeod 31. Mai 2012 10:37

AW: OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Zitat:

Zitat von suppennudel (Beitrag 1168840)
Mein Problem ist: Wenn ich nun, während ich auf dem einen Image bin, die Maustaste gedrückt halte, über ein anderes Image fahre, sie dort wieder los lasse und mit der Maus vom Image runtergehe, wird die OnLeave-Prozedur bei dem anderen Image ausgeführt, also nicht bei dem, auf das ich ursprünglich gegangen bin.

Soweit ist das ja auch logisch...

Bei MouseDown in einer Variable merken, über welchem Image das MouseDown passiert ist und beim MouseUp entsprechend aufrufen?

suppennudel 31. Mai 2012 17:51

AW: OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Zitat:

Zitat von himitsu (Beitrag 1168844)
Selbst Schuld?
Es gibt einen Grund, warum es keiner implementiert hat. :stupid:

Was soll das heißen... Ich mein, ich kann ja nix dafür, dass des niemand gemacht hat, also muss ich des doch selber iwie hinbasteln. :?
Zum Verständis: Du meinst ich soll jedes TImage auf ein Panel setzen, weil dieses eine solche Funtkion besitzt:?:
Bzw. ein Bild auf einem Panel setzen? Wie geht das:?:

@jaenicke: 1. Was meinst du mit selbst gezeichnet? und 2. ich blick durch deinen Quellcode nicht ganz durch :lol: wie genau hast du das mit dem hovern gelöst? btw: dein programm sieht schick aus :wink:

@ConnorMcLeod: Dein Ansatz leutet mir ein. Vielen Dank! :) Ich werde das bei Zeiten mal ausprobieren...

himitsu 31. Mai 2012 19:30

AW: OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
 
Zitat:

Zitat von suppennudel (Beitrag 1168980)
Du meinst ich soll ...

Jupp, also wenn du jedes Bild einzeln überwachen willst.

Ansonsten könntest du eben ein größeres Bild nehmen, oder eben alle Einzel-TImages als eine gemeinsame große Komponente betrachten.
Dieses große wird dann in logische Einheiten unterteils und du müßtest neben dem OnLeave (nach außen) selbst nochmal das OnLeave intern auslösen, wenn dein Code erkennt, daß die Maus von einer logischen Zelle in eine andere wechselt.


So, du hast ja vergessen zu sagen wie du es nun bisher implementiert hast,
aber du könntest dir erstmal zu jedem Image merken, ob die Maus darin ist.

Im großen OnExit werden alle diese Variablen zurückgesetzt und dort wo was gesetzt war, wird dabei das OnExit des/der entsprechenden Images aufgerufen.
Im OnMouseMove wird nun geprüft, ob die Maus über den Images ist.
- wenn ja, dann
- - war Variable des entsprechenden Images schon True? => mache nichts
- - war Variable False, dann sezte auf True und rufe eventuell ein OnEnter auf (falls es das gibt)
- wenn nein, dann
- - ist Variable schon False, dann laß es so
- - ist Variable True, dann sezte sie auf False und rufe dein ein OnExit auf


Ansonsten:

Irgendwo in der DP findest du bestimmt, wie man auf ein Panel zeichnet.
Man könnte notfalls auch einfach eine TPaintBox mit alClient im Panel erstellen.
Praktisch genauso wie das TImage, wobei die TPaintBox eigentlich nur dafür da ist, um ein Canvas zu bekommen, falls man den anderen Weg (selber ein Canvas erstellen und verbinden) nicht gewollt ist. Oder man nicht direkt über einen selbst erstellten DeviceContext (DC) zeichnen will.
Wie man Komtonenten programmiert findet man bestimmt auch hier irgendwo.
Und wie man im Constructor der Komponente zur Laufzeit weitere Komponenten erstellt und in dem Panel anzeigt, wird man bestimmt auch finden.


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