AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Einem Event zugewiesene Ereignisprozedur ermitteln?
Thema durchsuchen
Ansicht
Themen-Optionen

Einem Event zugewiesene Ereignisprozedur ermitteln?

Ein Thema von freejay · begonnen am 3. Feb 2010 · letzter Beitrag vom 3. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#1

Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 15:09
Ich weise (nach bestimmten nicht weiter wichtigen Kriterien) dem OnClick-Event von MenuItems verschiedene Prozeduren zu, z.B.:

Delphi-Quellcode:
PopupMenu1.Items[1].OnClick := Prozedur3;
PopupMenu1.Items[2].OnClick := Prozedur1;
PopupMenu1.Items[3].OnClick := Prozedur2;
Wie kann ich später im Code herausfinden, welchem MenuItem ich welche Prozedur zugewiesen habe?

So geht das jedenfalls nicht:

Delphi-Quellcode:
for i := 0 to PopupMenu1.Items.Count - 1 do
  
  if PopupMenu1.Items[i].OnClick = Prozedur1 then
    ...
  else if PopupMenu1.Items[i].OnClick = Prozedur2 then
    ...
  else if PopupMenu1.Items[i].OnClick = Prozedur3 then
    ...
Wie mach ich's richtig? Oder geht das nur mit RTTI oder sowas?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 15:21
versuch mal:
if TMethod(PopupMenu1.Items[i].OnClick).Code = TMethod(Prozedur1).Code then Eine Methode besteht ja aus einem Methodenzeiger und dem zugehörigen Objekt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 15:28
TMethod(Prozedur1) kreidet der Compiler als "Ungültige Typumwandlung" an...
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 15:48
Zitat von freejay:
Wie kann ich später im Code herausfinden, welchem MenuItem ich welche Prozedur zugewiesen habe?
[snip]
Wie mach ich's richtig?
Am besten gar nicht. Was für ein Problem willst du denn damit lösen? Da gibt's sicher eine schönere Lösung.
Uli Gerhardt
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:02
Ich baue mir eine Unit, die mir an ein beliebiges bestehendes PopUpMenu ein paar Standardfunktionen anfügt. Das mache ich, indem ich dem PopupMenu zur Laufzeit neue Einträge hinzufüge und sie entsprechend anpasse.

Da ich mir nun nicht extra merken wollte, welche Funktion denn nun auf welchem MenuItem liegt (diese Info brauche ich zum dynamischen Ein- und Ausschalten von Einträgen), wollte ich dafür einfach die verknüpfte Prozedur heranziehen. Scheint aber wohl nicht so einfach zu sein.

Dann muss ich mir halt den Index der jeweiligen Funktion umständlich merken. Umständlich, weil ich entweder für jeden Eintrag extra eine Variable eintragen muss oder - wenn ich ein Array nehme - ich mir wieder extra merken muss, welcher ArrayIndex welcher Funktion entspricht. Da steht dann im Code:

Delphi-Quellcode:
for i := 0 to PopupMenu1.Items.Count - 1 do
  if i = myArray[3] then ... // [3] ist seeehr sprechend...
Sollte es eine einfachere Lösung geben zu einem bestehenden (Popup-) Menü Default-Funktionen hinzuzufügen bin ich ganz Ohr
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:09
Hallo,

schau mal nach RTTI z. B. auf dieser Seite: delphirtti.htm.
Habe schonmal eine entsprechende Routine geschrieben, hab' die Sourcen aber zur Zeit nicht verfügbar.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:12
Zitat von freejay:
Da ich mir nun nicht extra merken wollte, welche Funktion denn nun auf welchem MenuItem liegt (diese Info brauche ich zum dynamischen Ein- und Ausschalten von Einträgen), wollte ich dafür einfach die verknüpfte Prozedur heranziehen. Scheint aber wohl nicht so einfach zu sein.

Dann muss ich mir halt den Index der jeweiligen Funktion umständlich merken. Umständlich, weil ich entweder für jeden Eintrag extra eine Variable eintragen muss oder - wenn ich ein Array nehme - ich mir wieder extra merken muss, welcher ArrayIndex welcher Funktion entspricht. Da steht dann im Code:

Delphi-Quellcode:
for i := 0 to PopupMenu1.Items.Count - 1 do
  if i = myArray[3] then ... // [3] ist seeehr sprechend...
Sollte es eine einfachere Lösung geben zu einem bestehenden (Popup-) Menü Default-Funktionen hinzuzufügen bin ich ganz Ohr
Du scheinst einen festen Satz von Funktionen zu haben. Dann würde ich pro (potentiell) erzeugtem MenuItem eine Variable reservieren. Dann kannst du doch nachher viel besser damit arbeiten. Kein Suchschleifen und so, einfach
Delphi-Quellcode:
if not Frobbering then
  FFrobberItem.Visible := False;
oder so.
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:22
Du kannst doch dem .Tag der Items eine ID zuweisen.
dann brauchst du du dir nur zu merken welche Funktion welche ID besitzt.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:40
Daran habe ich auch schon gedacht. Dann darf aber die Anwendung nicht schon die Tags verwenden und ich habe wieder keinen sprechenden Code:

Delphi-Quellcode:
for i := 0 to PopupMenu1.Items.Count - 1 do
  
  if PopupMenu1.Items[i].Tag = 1 then
    ...
  else if PopupMenu1.Items[i].Tag = 2 then
    ...
  else if PopupMenu1.Items[i].Tag = 3 then
    ...
Natürlich könnte ich noch Konstanten für die Tags anlegen, aber das ist alles so umständlich...

Ich hatte gehofft, dass da vielleicht was mit den erweiterten RTTI-Möglichkeiten von Delphi2010 geht?
  Mit Zitat antworten Zitat
freejay

Registriert seit: 26. Mai 2004
Ort: Nürnberg
272 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: Einem Event zugewiesene Ereignisprozedur ermitteln?

  Alt 3. Feb 2010, 16:52
Zitat von uligerhardt:
...
Du scheinst einen festen Satz von Funktionen zu haben. Dann würde ich pro (potentiell) erzeugtem MenuItem eine Variable reservieren. Dann kannst du doch nachher viel besser damit arbeiten. Kein Suchschleifen und so, einfach
Delphi-Quellcode:
if not Frobbering then
  FFrobberItem.Visible := False;
oder so.
Das scheint mir eine gute Idee. Schön zu schreiben und zu lesen und ich muss mich (noch) nicht stundenlang mit RTTI auseinandersetzen...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:17 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