![]() |
Delphi-Version: 10.3 Rio
Funktionsname im COde nutzen
Gibt es eine Möglichkeit, in einer function/procedure den Namen der function/procedure im Code zu nutzen?
Folgendes Beispiel:
Delphi-Quellcode:
Anzeigen soll die Funktion dann: "Die Funktion heißt: MachWas"
function MachWas( input: string): integer;
begin ShowMessage( 'Die Funktion heißt: '+ function_name); end; Gibt es sowas? Grund: Ich habe bei ganz ganz vielen Funktionen für den Fehlerfall Results, die die Location mitliefern. Z.B. 'Unitname.Class.Methodenname' Klar. Ich kann das als String 'MachWas' reinschreiben. Ab für ein vielfaches Cut'n Copy wäre soetwas nicht schlecht. ;-) VG Thomas |
AW: Funktionsname im COde nutzen
|
AW: Funktionsname im COde nutzen
Mit Assert, würde ich aber nicht empfehlen (sondern abraten).
![]() |
AW: Funktionsname im COde nutzen
Kurz und knackig: Es geht allgemein betrachtet nicht. Du kannst über die Debug-Info beispielsweise so etwas machen, nur ist die in der Release-Konfiguration beispielsweise nicht verfügbar.
|
AW: Funktionsname im COde nutzen
Zitat:
Niemand verbietet dir in dieser Config die MAP-Datei, die externen Debuginfos und/oder Delphi-Debuginfos zu aktivieren. Es gibt auch einige MAP zu DBG Converter, womit dann auch die Debug-API von Windows zurecht kommt. ![]() Es wäre natürlich viel zu einfach, wenn Delphi auch die Internen Debug Infos erzeugen würde, so wie jeder andere normale Windows PE-erzeugende Compiler. |
AW: Funktionsname im COde nutzen
Gibt es nicht seit einer der neuern Delphi-Versionen sowas wie TClass.ImplementationUnit und ähnliche Funktionen? Mein Gedächtnis lässt mich da gerade im Stich, aber irgendwas in der Richtung war da.
|
AW: Funktionsname im COde nutzen
|
AW: Funktionsname im COde nutzen
Zitat:
Hilft aber bei der Frage des OP leider auch nicht weiter. Ich hatte in Erinnerung, dass es noch weitere solcher Funktionen gab, aber das scheint nicht so zu sein. |
AW: Funktionsname im COde nutzen
"neuere" ... seit bestimmt schon mindestens über einem dutzend Jahren findet man die Unit und das Modul (EXE/DLL/BPL) in der Typinfo, also von dort wo es deklariert wurde.
Aber Infos der Implementation (Aufrufer/Ersteller und die Position) gibt es nicht. In uralten Delphis vor D7 war es noch bedingt möglich sich ins PreCompile reinzuhängen und sowas wie eine Makro-Funktion nachrüsten, aber das war einmal. Jemand hier aus dem Forum hatte da mal das __FILE__, __LINE__, und __FUNCTION__ vom PHP nachgebaut. ![]() Einzige Möglichkeit Weg von Delphi und wechseln zum C++Builder, aber da gibt es bestimmt besserere C++-Compiler. ![]() |
AW: Funktionsname im COde nutzen
:-)
Da habe ich ja eine interessante Diskussion losgetreten. Ich werde für mich jetzt die Namen einfach reinschreiben. Sooo wichtig/dringend ist es für mich nicht. Habe einfach in meinem ErrorMessage-System eine "Location"-String Variable drin, die mir die Position mitteilt. Ist bei einem größeren System mit Error-Klassen sehr hilfreich. |
AW: Funktionsname im COde nutzen
Die "Idee" ist recht einfach umsetzbar... "C++Like" mit einem eigenem kleinen PreProzessor :)
Also man schreibe sich fix ein kleines Programm, welches man in der IDE unter "RunBeforeCompile" und "RunAfterCompile" konfiguriert. Neben __FILE__, __LINE__, __FUNCTION__ sind auch __DATE__ und __TIME__ für als CompileTimeStamp sehr nützlich... also: - schauen, ob zum PasFile KEINE BackupDatei (z.B. "?.pas.pre") da ist - das PAS File zeilenweise im einfachsten Fall in eine "Stringlist" einlesen und diese "zeilenweise" durchlaufen - zeilenweie bei "procedure" und "function" das was dahinter kommt, also bis zur KlammerAuf bzw dem Semikolon für "__FUNCTION__" merken - zeilenweie 5x "StringReplace" für '__FILE__', '__LINE__', '__FUNCTION__', '__DATE__', '__TIME__" - wenn durch, org. PasFile umbenennen(z.B. "?.pas.pre") sowie StringList als PasFile abspeichern und den "PreProzessor" beenden - Delphi übersetzt nun den Code mit den "eingesetzten RealStrings" - anschließend wird der "PreProzessor" ein zweites mal gestartet, und benennt das PasFile z.b: in "?.pas.txt" um, und anschließend das gesicherte "?.pas.pre" wieder in "?.pas" (man könnte das auch als zweites sepatates "Restore&CleanUp" Programm schreiben) Zur Optimierung sollte man das Tool via geeignetem DirectoryFilter davon abhalten fremden Source also Komponenten,Libs,RTL,VCL,FMX,... zu bearbeiten:) |
AW: Funktionsname im COde nutzen
Zitat:
Einen echten Preprozessor wie für Makros nötig sind, gibt es leider nicht, k.A. warum sich der Hersteller so dermaßen seit Jahrzehnten so dermaßen dagegen wehrt, bzw. es so penetrant ignoriert. Im Inlinecompilier kann man versuchen sich reinzuhängen, denn dort verwendet der Compiler auch geänderte Inhalte geladener Dateien, aber spätestens beim DCC war es dass, außer man manipuliert direkt die Quellcodedateien. Siehe z.B. deine Idee, wobei man da extrem aufpassen muß nichts kaputt zu machen, wenn es mittendrin abkratzt, und die auch nicht __history bzw. ein VCS bis zur Unbenutzbarkeit durcheinander bringt. Es gibt leider kein Event (mehr), wo man "sicher" Dateiinhalte, ohne zu speichern, zwischen Laden und Compilieren manipulieren kann. |
AW: Funktionsname im COde nutzen
Zitat:
|
AW: Funktionsname im COde nutzen
Zitat:
Trotzdem Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz