Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktionsname im COde nutzen (https://www.delphipraxis.net/203768-funktionsname-im-code-nutzen.html)

t2000 21. Mär 2020 18:30

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:
function MachWas( input: string): integer;
begin
  ShowMessage( 'Die Funktion heißt: '+ function_name);
end;
Anzeigen soll die Funktion dann: "Die Funktion heißt: MachWas"

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

DieDolly 21. Mär 2020 19:11

AW: Funktionsname im COde nutzen
 
Guck mal da.
How To Get the Name of the Current Procedure/Function in Delphi (As a String)

Rollo62 21. Mär 2020 19:16

AW: Funktionsname im COde nutzen
 
Mit Assert, würde ich aber nicht empfehlen (sondern abraten).
https://stackoverflow.com/questions/...tion-without-u

Dennis07 22. Mär 2020 05:03

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.

himitsu 22. Mär 2020 07:28

AW: Funktionsname im COde nutzen
 
Zitat:

Zitat von Dennis07 (Beitrag 1460294)
nur ist die in der Release-Konfiguration beispielsweise nicht verfügbar.

doch

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.
https://docs.microsoft.com/en-us/win...help-functions > Symbol Handler
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.

dummzeuch 22. Mär 2020 09:31

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.

Uwe Raabe 22. Mär 2020 09:49

AW: Funktionsname im COde nutzen
 
TObject.UnitName

dummzeuch 22. Mär 2020 10:38

AW: Funktionsname im COde nutzen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1460303)

Ja, das war's. Danke.

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.

himitsu 22. Mär 2020 11:52

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.
https://www.delphipraxis.net/59965-s...__-delphi.html

Einzige Möglichkeit
Weg von Delphi und wechseln zum C++Builder, aber da gibt es bestimmt besserere C++-Compiler.
http://docwiki.embarcadero.com/RADSt...defined_Macros

t2000 22. Mär 2020 13:20

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.

mensch72 22. Mär 2020 18:26

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

himitsu 22. Mär 2020 22:25

AW: Funktionsname im COde nutzen
 
Zitat:

__DATE__ und __TIME__
Dieses wird bereits im PE-Header einkompiliert und seit paar Jahren von Delphi sogar an der richtigen Stelle.

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.

jaenicke 23. Mär 2020 05:06

AW: Funktionsname im COde nutzen
 
Zitat:

Zitat von t2000 (Beitrag 1460309)
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.

Es gibt aber auch schon fertige Tools für den Zweck, die auch gleich den ganzen Stacktrace loggen und die Fehler auch verschicken können usw., so z.B. Eurekalog oder madExcept.

t2000 23. Mär 2020 08:18

AW: Funktionsname im COde nutzen
 
Zitat:

Zitat von jaenicke (Beitrag 1460340)
Zitat:

Zitat von t2000 (Beitrag 1460309)
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.

Es gibt aber auch schon fertige Tools für den Zweck, die auch gleich den ganzen Stacktrace loggen und die Fehler auch verschicken können usw., so z.B. Eurekalog oder madExcept.

Ich habe MadExcept seit über 15 Jahren im Einsatz (Delphi 7 Projekt, von dem ich lebe). Es ist/war ok, aber bei meinem neuen Projekt werde ich solche Tools nicht mehr nutzen. Und in diesem speziellem Fall geht es um eine Fehlermeldung, die von einer REST-API im JSON-Format zurückgegeben werden soll.
Trotzdem Danke


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