Comment Obtenir le Nom de la Fonction/Procédure en Delphi (Comme une Chaîne de caractères)

Est-il possible d'obtenir le nom de la procédure en cours/fonction comme une chaîne de caractères au sein d'une procédure/fonction? Je suppose qu'il y aurait quelques "macro" qui est développée au moment de la compilation.

Mon scénario est le suivant: j'ai beaucoup de procédures qui sont donnés un dossier et ils ont tous besoin de commencer par la vérification de la validité de l'enregistrement, et donc qu'ils passent à l'enregistrement à un "programme de validation de la procédure". Le programme de validation de la procédure (le même pour toutes les procédures) lève une exception si l'enregistrement n'est pas valide, et je veux que le message de l'exception ne comprend pas le nom du programme de validation de la procédure, mais le nom de la fonction/procédure qui a appelé le responsable de la validation de la procédure (naturellement).

Qui est, je l'ai

procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
 if <StructIsInvalid> then
    raise Exception.Create(Sender + ': Structure is invalid.');
end;

et puis

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SomeProc1');
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SomeProcN');
  ...
end;

Il serait un peu moins sujettes à l'erreur si je plutôt écrire quelque chose comme

procedure SomeProc1(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, {$PROCNAME});
  ...
end;

...

procedure SomeProcN(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, {$PROCNAME});
  ...
end;

et à chaque fois que le compilateur rencontre un {$NOMPROC}, il remplace simplement le "macro" avec le nom de la fonction/procédure comme une chaîne littérale.

Mise à jour

Le problème avec la première approche est qu'elle est sujette à erreur. Par exemple, il arrive facilement que vous vous trompez, en raison de copier-coller:

  procedure SomeProc3(const Struct: TMyStruct);
  begin
    ValidateStruct(Struct, 'SomeProc1');
    ...
  end;

ou des fautes de frappe:

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SoemProc3');
  ...
end;

ou temporaire de la confusion:

procedure SomeProc3(const Struct: TMyStruct);
begin
  ValidateStruct(Struct, 'SameProc3');
  ...
end;
  • Ce serait chouette, mais autant que je sache, il n'existe pas - et j'ai fait une recherche pour quelque chose de similaire. La seule solution générique, que je sache, serait d'utiliser les informations de débogage qui est incorporé dans le fichier EXE pour obtenir le nom de la procédure, mais ce serait un grand gain de performance au moment de l'exécution. Quand j'ai besoin de quelque chose de similaire, j'ai écrit un petit programme qui allait porter mes PAS les fichiers et remplacer une certaine expression avec un peu de texte, mais pour moi, nom de fichier + le numéro de ligne est assez, je n'ai pas le nom de la procédure.
  • C'est mon expérience que les fautes de frappe et de confusion ne sont pas une grosse affaire. Aussi longtemps que vos journaux d'identification par nom, il n'a pas d'importance que ce nom est. Si vous n'avez pas vraiment une fonction par son nom, grep et vous trouverez la seule occurrence du nom mal orthographié dans la fonction que vous recherchez, de toute façon.
  • FWIW, il existe des outils qui le fera pour vous. Je suis familier avec CodeSite qui va ajouter de tels appels à des fonctions de journalisation à l'aide de son système.