Fonctions callback

Résolu
duduffr Messages postés 3 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 22 novembre 2004 - 18 nov. 2004 à 16:32
duduffr Messages postés 3 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 22 novembre 2004 - 22 nov. 2004 à 09:47
une bibliothèque m'indique une syntaxe que je ne comprends pas !

"type TErrorNotify = procedure (ErrCode : integr); stdcall; "

Je suis autodidacte et je ne vois pas comment utiliser cette "callback function".

Merci de m'aider,

georges
A voir également:

4 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 33
20 nov. 2004 à 09:26
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.
3
Rejoignez-nous