AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Prozedur als Ereignis

Ein Thema von idefix2 · begonnen am 21. Okt 2013 · letzter Beitrag vom 21. Okt 2013
Antwort Antwort
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

Prozedur als Ereignis

  Alt 21. Okt 2013, 20:17
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 20:47
Wie ist das Ereignis denn deklariert?

Davon hängt es ab, ob Methode oder Prozedur ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 20:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.177 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 20:53
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 20:55
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:

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

Warum verfrachtest du nicht einfach deine Prozeduren in eine Klasse?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.177 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 21:21
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Prozedur als Ereignis

  Alt 21. Okt 2013, 22:19
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

@NamenLozer
Hier interessiert mich "sender" nicht, und kommt auch nirgends vor.
  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 +1. Es ist jetzt 07:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf