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/)
-   -   Prozedur als Ereignis (https://www.delphipraxis.net/177166-prozedur-als-ereignis.html)

idefix2 21. Okt 2013 19:17

Prozedur als Ereignis
 
Hallo,
ich habe mehrere Prozeduren (keine Klassenmethoden), die ich gerne dynamisch zur Laufzeit einem Onklick-Ereignis eines TImage zuordnen würde.
Geht das irgendwie, oder ist das nur mit einer Methode möglich?
Natürlich ginge es mit Hilfe einer Prozedurvariablen, die dann in einer fixen Onclick-Methode aufgerufen wird, aber da müsste ich die dann auch noch als Parameter übergeben, das würde ich mir lieber sparen.

Sir Rufo 21. Okt 2013 19:47

AW: Prozedur als Ereignis
 
Wie ist das Ereignis denn deklariert?

Davon hängt es ab, ob Methode oder Prozedur ...

Namenloser 21. Okt 2013 19:52

AW: Prozedur als Ereignis
 
Geht meiner Meinung nach nur mit einem Wrapper-Objekt und einer Prozedurvariablen.

Bei „of object“ wird ja der Self-Pointer im eax-Register übergeben, da müsste man schon einiges umbiegen.

jaenicke 21. Okt 2013 19:53

AW: Prozedur als Ereignis
 
OnClick eines TImage ist ein TNotifyEvent, also ein Methodenzeiger, da kann ohne Tricks keine Prozedur rein.

Du kannst allerdings eine Methode (TMethod) erstellen und dabei den Zeiger auf das Objekt der Methode auf nil setzen. Dann kannst du diesen erzeugten Methodenzeiger dem OnClick zuweisen.

Namenloser 21. Okt 2013 19:55

AW: Prozedur als Ereignis
 
Zitat:

Zitat von jaenicke (Beitrag 1232667)
Du kannst allerdings eine Methode (TMethod) erstellen und dabei den Zeiger auf das Objekt der Methode auf nil setzen. Dann kannst du diesen erzeugten Methodenzeiger dem OnClick zuweisen.

Wie ich bereits schrieb, geht das nicht so einfach, da Self im eax-Register übergeben wird. Kann zufällig klappen, kann aber auch böse daneben gehen, vor allem, wenn auf den Parameter „Sender“ zugegriffen wird – der wird nämlich immer nil sein. Wenn dann müsste man einen Dummy-Parameter einfügen:

Delphi-Quellcode:
procedure Callback(_Self: TObject; Sender: TObject);
Aber das ist echt dirty.

Warum verfrachtest du nicht einfach deine Prozeduren in eine Klasse?

jaenicke 21. Okt 2013 20:21

AW: Prozedur als Ereignis
 
Zitat:

Zitat von NamenLozer (Beitrag 1232668)
Wie ich bereits schrieb, geht das nicht so einfach, da Self im eax-Register übergeben wird. Kann zufällig klappen, kann aber auch böse daneben gehen, vor allem, wenn auf den Parameter „Sender“ zugegriffen wird – der wird nämlich immer nil sein.

Klar ist der nil, aber böse ist an dem Vorgehen gar nichts. Ein normaler Methodenzeiger ist auch nichts anderes und genau TMethod ist genau das was die Übergabe von Self im korrekten Register bewirkt.

Sinnvoller wäre aber in der Tat objektorientiert zu arbeiten.

idefix2 21. Okt 2013 21:19

AW: Prozedur als Ereignis
 
Zitat:

Zitat von jaenicke (Beitrag 1232667)
OnClick eines TImage ist ein TNotifyEvent, also ein Methodenzeiger, da kann ohne Tricks keine Prozedur rein.

Du kannst allerdings eine Methode (TMethod) erstellen und dabei den Zeiger auf das Objekt der Methode auf nil setzen. Dann kannst du diesen erzeugten Methodenzeiger dem OnClick zuweisen.

Danke, das ist die Lösung :-D

@NamenLozer
Hier interessiert mich "sender" nicht, und kommt auch nirgends vor.


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