fliegermichl hat geschrieben:Wenn Dein Programm mit Debuginformationen compiliert wurde, kannst Du GetStackTrace verwenden.
Das das programm immer mit debuginformationen geliefert werden muss halte ich persönlich für eine herzlich beschissene idee. Der debug code in LCL programmen macht größenunterschiede im MB bereich aus. Außerdem schränkt das optimierungen (Namentlich inlining) extrem ein.
Einfach nein!
Es gibt zwar andere möglichkeiten, z.B. könntest du unter den funktionsaufruf ein goto label setzen (damit kann es auch nicht wegoptimiert werden) und dann checken ob die returnaddresse die addresse von dem label ist. Das willst du aber eigentlich nicht machen.
Was man normalerweise macht ist z.B. der Sender Parameter in LCL events. Wenn ein Button geklickt wird wird der Event handler aufgerufen. Damit der weiß welcher button geklick wird, wird ihm die sender variable von TObject übergeben über die er das aufrufende Objekt identifizieren kann.
Wenn du dein programm eh OOP strukturiert hast (was ich bei Object Pascal wohl mal hoffen darf), solltest du die funktion eh aus einem anderen Objet aufrufen.
Beispiel:
Code: Alles auswählen
// UnitA:
TKlasseA = class
public
procedure Foo(Sender: TObject);
end;
...
implementation
uses UnitB;
...
procedureTKlasseA.Foo(Sender: TObject);
begin
if (Sender is TKlasseB) then
// Mach was mit (Sender as TKlasseB)
end;
// Unit B
uses UnitA;
...
TKlasseB = class
public
procedure Bar;
end;
...
...
procedureTKlasseB.Bar;
begin
A.Foo(this);
end;
Andere option, erstell ne struckt die alle infos enthält die du beim aufruf benötigst und übergib die (als const falls möglich, sonst wird sie kopiert, was teuer werden kann).
Aber, du solltest niemals vom unterliegenden Source code ausgehen. Denn wenn der kompilier optimiert gibts keine infos mehr wie der code vorher aussah. Beispiel du hast eine funktion die nur 1 zeile ausführt. Warum sollte der compiler dafür einen funktionsaufruf generieren wenn er einfach die zeile stattdessen reinkopieren kann (inlining). Damit ist nachzuschauen woher ein call kam praktisch unmöglich