AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt
Thema durchsuchen
Ansicht
Themen-Optionen

OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt

Ein Thema von suppennudel · begonnen am 31. Mai 2012 · letzter Beitrag vom 31. Mai 2012
Antwort Antwort
suppennudel

Registriert seit: 3. Aug 2011
Ort: Stuttgart
2 Beiträge
 
Delphi 7 Personal
 
#1

OnLeave Ereignis/Prozedur wird am falschen Objekt ausgeführt

  Alt 31. Mai 2012, 00:50
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 31. Mai 2012, 01:05
Selbst Schuld?
Es gibt einen Grund, warum es keiner implementiert hat.

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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.649 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 31. Mai 2012, 07:14
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 31. Mai 2012, 11:37
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?
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
suppennudel

Registriert seit: 3. Aug 2011
Ort: Stuttgart
2 Beiträge
 
Delphi 7 Personal
 
#5

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

  Alt 31. Mai 2012, 18:51
Selbst Schuld?
Es gibt einen Grund, warum es keiner implementiert hat.
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 wie genau hast du das mit dem hovern gelöst? btw: dein programm sieht schick aus

@ConnorMcLeod: Dein Ansatz leutet mir ein. Vielen Dank! Ich werde das bei Zeiten mal ausprobieren...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

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

  Alt 31. Mai 2012, 20:30
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:32 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