[gelöst] Name der aktuellen Prozedur als String

Für Fragen von Einsteigern und Programmieranfängern...
Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

[gelöst] Name der aktuellen Prozedur als String

Beitrag von Theozh »

gibt es eine Möglichkeit, sich den Namen der aktuellen Prozedur in einen String zurückgeben zu lassen?
So à la:

Code: Alles auswählen

 
procedure TForm1.Hase(Sender: TObject);
begin
 ShowMessage('Mein Name ist: ' + NameOfCurrentProcedure());
end;
 
Ergebnis sollte sein: "Mein Name ist Hase".
Auslöser ist, dass ich viele fast gleichlautende, aber doch verschiedene Buttons bzw. Prozeduren habe.
Absicht ist, aus dem Namen der Prodezur Buchstaben oder Zahlen zu extrahieren, die entsprechend weiterverarbeitet werden sollen.
Zuletzt geändert von Theozh am Mo 12. Aug 2013, 20:03, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5143
Registriert: Fr 8. Apr 2011, 09:01

Re: Name der aktuellen Prozedur als String

Beitrag von wp_xyz »

Das übliche Vorgehen ist bei Mehrfachverwendung von Methoden, den "Sender" auszuwerten - das ist dasjenige Objekt, der das Ereignis ausgelöst hat.

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Name der aktuellen Prozedur als String

Beitrag von Theozh »

Hört sich interessant an, doch komme ich damit leider noch nicht weiter.

Code: Alles auswählen

 
ShowMessage(Sender.ToString);  // gibt mir TToggleBox zurück
ShowMessage(Sender.UnitName);  // gibt mir StdCtrl zurück
 
ShowMessage(Sender.MethodName(address:pointer)); // welche address??? Wo bekomme ich die her?
 

Code: Alles auswählen

 
ShowMessage(Sender.MethodName(MethodAddress(name: shortstring)))); 
 
wenn jetzt name: shortstrig der Name meines Senders sein soll, dann beißt sich die Katze in den Schwanz

Bauer321
Beiträge: 465
Registriert: Sa 21. Aug 2010, 21:30
OS, Lazarus, FPC: Windows 7 Ultimate (L 1.2.2 FPC 2.6.4 32-bit)
CPU-Target: 64-Bit
Wohnort: nahe Bremen
Kontaktdaten:

Re: Name der aktuellen Prozedur als String

Beitrag von Bauer321 »

wenn die Prozeduren überwiegend gleich sind dann kannst du eine draus machen und fragst an den stellen wo nur beim click auf einen bestimmten button was passieren soll folgendes ab:

Code: Alles auswählen

if sender = Button1 then
begin
   ...
end else
if sender = button2 then
  ...
end;
und anschließend dann allen Buttons die eine Prozedur zuweisen

oder wie meinst du das?
www.mcpatcher.net | www.hoeper.me

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Name der aktuellen Prozedur als String

Beitrag von Theozh »

vereinfacht gesagt, habe ich 200 Knöpfe, die z.B. Button001 bis Button200 heissen.
Letztendlich möchte ich mir die Zahl 001-200 zurückgeben lassen.
Wenn ich die Zahl aus dem Namen der extrahieren könnte, dann könnte ich alle Knöpfe bei Betätigung, z.B. Button001.Click die gleiche Prozedur z.B. 'WhichButtonPressed' ausführen lassen und mir die Zahl ausgeben lassen, d.h. dann weiss ich welcher Knopf gedrückt worden ist.
Bei Änderungen in der Prozedur müsste ich nicht alle Ereignisse Button001.Click usw. abändern, sondern nur die Prozedur 'WhichButtonPressed'.
Oder vielleicht geht das Ganze auch noch komplett anders?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Name der aktuellen Prozedur als String

Beitrag von mschnell »

Theozh hat geschrieben:vereinfacht gesagt, habe ich 200 Knöpfe, die z.B. Button001 bis Button200 heissen.
Willst Du die knöpfe denn wirklich grafisch platzieren und alle von Hand benennen ????

Ich würde sie in einer Schleife programmatisch erzeugen und entweder die Caption automatisch erzeugen, oder aus einem Array of String holen, oder aus eine unsichtbaren Memo holen oder aus einem Ini-File lesen.

-Michael

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Name der aktuellen Prozedur als String

Beitrag von Theozh »

das Platzieren der Knöpfe ist kein Problem (sei es durch eine Schleife oder sonstwie. Das ist gelöst), doch geht es jetzt um die Auswertung...

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Name der aktuellen Prozedur als String

Beitrag von mschnell »

Das ist gar nicht egal !

Wenn die Köpfe programmatisch platziert werden ist es leicht, dabei eine Kennung vorzunehmen, an der die Auswerte-Funktion erkennt, welcher Knopf der "Sender" ist (z.B in TButton.Tag eine Zahl oder ein Pointer auf ein zugehöriges Objekt).

Wenn "von Hand" platziert, hilft vermutlich nur RTTI.

-Michael

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Name der aktuellen Prozedur als String

Beitrag von Theozh »

Das glaub ich Dir gerne, dass es sicher schlau wäre, die Knöpfe programmatisch zu erzeugen. Ehrlich gesagt, hab ich mir den "Source-Code" für die Knöpfe mit Perl generiert. Noch besser wäre das sicher mit Lazarus selbst.
Nun sind die Knöpfe eben schon da. Und wenn es jetzt eine simple Funktion zur Ausgabe des Namens gegeben hätte (vielleicht gibt es sie ja doch noch?) dann wäre der Fall für mich erledigt gewesen.
So muss ich mich damit beschäftigen wie ich die Knöpfe zur Laufzeit selbst in einer Schleife generiere und sie entsprechen 'tagge'. Sollte wohl nicht so schwierig sein, doch hat sich mir die Frage gestellt, was schneller geht und weniger Nerven verbraucht...

wp_xyz
Beiträge: 5143
Registriert: Fr 8. Apr 2011, 09:01

Re: Name der aktuellen Prozedur als String

Beitrag von wp_xyz »

Ich finde, du machst hier den zweiten Schritt vor dem ersten. Anstatt mich herumzuplagen, wie man RTTi von Free Pascal so verbiegen kann, dass man den Prozedurnamen herauskriegt, würde ich zuerst die Perl-Routine versuchen zu verstehen. Dann ist es sicher kein Problem mehr, die Buttons per Code in Lazarus zu platzieren und in einem Array zu speichern, und du hast alle Möglichkeiten, sie im Sender abzufragen.

Was Bauer321 oben meint, ist den Code für alle Buttons in einer Methode zu halten und mit Hilfe des Sender-Parameters abzufragen, welcher Button geklickt wurde. Etwa so (setzt voraus, dass die Buttons in einem Array "Buttons" stehen):

Code: Alles auswählen

 
procedure TForm1.AllgemeinesButtonClick(Sender: TObject);
var
  i: Integer;
begin
  for i:=0 to Length(Buttons)-1 do
    if Buttons[i] = Sender then
      ShowMessage(Format('Button %d clicked', [i]));
  end;
end;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Name der aktuellen Prozedur als String

Beitrag von Socke »

Theozh hat geschrieben:vereinfacht gesagt, habe ich 200 Knöpfe, die z.B. Button001 bis Button200 heissen.
Heißen nur die Variablen so? Dann ist dir nicht zu helfen ;-)
Wenn du aber die Eigenschaft Name setzt, ginge das so:

Code: Alles auswählen

TForm1.ButtonClick(Sender: TObject);
begin
  if Sender is TComponent then
    ShowMessage(TComponent(Sender).Name);
end;
Alternativ kannst du auch (wie bereits angemerkt) eine Zahl in der Eigenschaft Tag speichern und diese dann auswerten.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Name der aktuellen Prozedur als String

Beitrag von corpsman »

Warum nutzt du denn nicht das "tag" Property ?

Im Createn deiner Buttons machst du dann

Button.tag := i; // Beim erzeugen wirst du ja wohl hoffentlich wissen welcher Button welche nummer hat.

Im Button onclick gehts dann mit

Code: Alles auswählen

 
showmessage(format('Button %d pressed', [TComponent(sender).tag]));
 
--
Just try it

Theozh
Beiträge: 99
Registriert: So 1. Jul 2012, 10:56

Re: Name der aktuellen Prozedur als String

Beitrag von Theozh »

Mensch, @Socke, das haut mich von den Socken...
Genau das habe ich gesucht! Es gibt sie also doch, die gewünschte Funktion! So "einfach" und doch nicht gefunden.
Wenn ich mal viel Zeit und Nerven habe, dann schaue ich mir die Varianten mit Button-Generierung zur Laufzeit, Arrays, Tags, etc. an.

Groffy
Beiträge: 50
Registriert: Fr 23. Nov 2012, 13:27
OS, Lazarus, FPC: Win10/Linux Mint - Lazarus 2.2/trunk
CPU-Target: 32/64Bit

Re: [gelöst] Name der aktuellen Prozedur als String

Beitrag von Groffy »

Theozh hat geschrieben:gibt es eine Möglichkeit, sich den Namen der aktuellen Prozedur in einen String zurückgeben zu lassen?
Nun ja, die anfangs formulierte Frage bleibt unbeabtwortet. Was unter .Net sehr einfach über Reflections zu lösen ist, ist unter Object Pascal nicht so trivial. Zum Logging wäre es schon interessant zu wissen in welcher Function man sich zur Zeit befindet. Zu alten VB6 Zeiten hab ich in die Logging Meldungen den Funktionsnamen hart kodiert in die Logging Meldung geschrieben, finde ich aber unelegant...

Beste Grüße

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: [gelöst] Name der aktuellen Prozedur als String

Beitrag von corpsman »

@Groffy

Wenn du ohne Optimierungen Kompilierst müsstest du evtl. was mit den Funktionen

get_caller_addr, get_caller_frame oder auch Dump_stack

anfangen können..
--
Just try it

Antworten