Fonctions callback [Résolu]

duduffr 3 Messages postés mardi 11 février 2003Date d'inscription 22 novembre 2004 Dernière intervention - 18 nov. 2004 à 16:32 - Dernière réponse : duduffr 3 Messages postés mardi 11 février 2003Date d'inscription 22 novembre 2004 Dernière intervention
- 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
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 20 nov. 2004 à 09:26
3
Merci
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.

Merci cs_Delphiprog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
cs_Delphiprog 4580 Messages postés samedi 19 janvier 2002Date d'inscription 9 janvier 2013 Dernière intervention - 18 nov. 2004 à 23:32
0
Merci
Jette donc un oeil sur le site de Marco CANTU. Vers le bas de la page, il y a une partie sur les fonctions de rappel et un exemple simple à dispo.
Il n'est pas interdit de faire le tour de ce site qui regorge de choses intéressantes pour ceux qui veulent apprendre par eux-même.
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
duduffr 3 Messages postés mardi 11 février 2003Date d'inscription 22 novembre 2004 Dernière intervention - 19 nov. 2004 à 08:36
0
Merci
:) merci pour lea référence. mais c'est la déclaration de "type" qui me chagrine, pourquoi pas simplement déclarer la procédure ?
Commenter la réponse de duduffr
duduffr 3 Messages postés mardi 11 février 2003Date d'inscription 22 novembre 2004 Dernière intervention - 22 nov. 2004 à 09:47
0
Merci
Merci bien Delphiprog. Je crois que maintenant je peux m'en sortir.
PS. J'ai bien cliqué sur Réponse acceptée
Commenter la réponse de duduffr

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.