De la même façon qu'on ne peut pas passer n'importe quoi comme paramètre à une fonction (les types anonymes sont interdits), la déclaration d'un type procédural est nécessaire pour pouvoir passer l'adresse d'une fonction comme paramètre à une autre.
En bref, la fonction appelée a besoin de connaitre comment appeler une fonction et quels paramètres elle doit lui fournir.
En reprenant la signature de la fonction ci-dessus :
type
TErrorNotify = procedure (ErrCode : integr); stdcall;
on peut passer une fonction ayant la même déclaration :
procedure CriticalErrMsg(ErrCode: integer);stdcall;
ou n'importe quelle autre fonction ayant aussi la même signature :
procedure CriticalErrList(NumAvert: integer);stdcall;
Pour bien comprendre la suite, imaginons que CriticalErrMsg ait pour tâche d'afficher les erreurs critiques (ex : > 100 ) dans un message (avec ShowMessage) et que CriticalErrList ait pour rôle de renseigner un TMemo.
Supposons que, selon le contexte d'exécution de l'application, on souhaite appeler l'une ou l'autre des deux fonctions.
Dans ce cas, on passera en paramètre à une fonction appelée l'une ou l'autre des deux fonctions.
Imaginons l'appel à une fonction de vérification quelconque ainsi déclarée :
procedure Verif(Table: TTable; ErrorNotify: TErrorNotify)
begin
Table.First;
while not Table.Eof do
begin
if table.FieldByname('CodeClient').AsInteger > 10000 then
ErrorNotify(table.FieldByname('CodeClient').AsInteger);
Table.Next;
end;
end;
Ce code, complètement farfelu, n'est là que pour illustrer comment le paramètre ErrorNotify peut être exploité et appelé.
La procédure Verif se moque complètement de savoir ce que la fonction appelée va faire du paramètre qu'elle lui passe : l'afficher, l'enregistrer sur disque, l'imprimer ? Là n'est pas son problème.
On veut lister les erreurs ? Alors on appellera :
begin
Verif(Table1, @CriticalErrList);
end;
Ailleurs, on veut afficher une message d'erreur et forcer l'utilisateur à en prendre connaissance et appuyer sur le bouton Ok ?
begin
Verif(Table1, @CriticalErrMsg);
end;
Comme je le disais donc, quand nous appelons la procédure Verif, nous lui passons deux paramètres dont le deuxième sera en fonction de nos besoins : lister les erreurs ou afficher un message.
Le cas souvent utilisé, qui n'est pas un cas d'école, est celui appelant la fonction EnumWindows. Quand on appelle cette fonction que seul Windows connait, elle n'a pas à savoir ce que nous allons faire du résultat. Nous lui demandons juste de nous donner les handles de toutes les fenêtres des applications ouvertes au moment de son appel et de les passer à une autre fonction dite "de rappel" (CallBack).
Comme cette utilisation est illustrée sur le site donné en référence (Marco Cantu est une sommité dans le monde de Delphi) et, qui plus est, en français, je ne développerai pas davantage les explications.
Est-ce plus clair maintenant ?
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.