IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[Tutoriel] Construire une procédure pointant sur une méthode


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut [Tutoriel] Construire une procédure pointant sur une méthode
    Salut

    Le tutoriel Construire une procédure pointant sur une méthode a été annoncé il y a quelques jours.

    Si vous avez des commentaires/remarques, positifs ou négatifs, n'hésitez pas à les indiquer ici. Que vous l'ayez lu ou que vous ayez été découragé avant la fin.
    Cela permettra éventuellement de l'améliorer, et de mieux faire les suivants

    Merci
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  2. #2
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Bien qu'ayant, je pense, les bases pour comprendre le bazar, j'avoue avoir été découragé avant la fin, surtout par manque de temps. A vrai dire, j'ai un peu le sentiment de rater quelque chose, car enfin :

    * soit la procédure callback est commune à tous les appels, et alors une référence explicite à la méthode d'une instance fixe suffit,

    * soit la procédure callback est susceptible de s'adresser à plusieurs instances séparées, mais dans ce cas l'instance concernée est forcément déterminable d'une façon ou d'une autre par bijection à partir des paramètres transmis (sinon, à moi, ça me pose un problème de logique, à moins qu'il y ait une unité oui-ja.pas qui m'ait échappé ! ) ; une simple liste tenue à jour permet alors de choisir le bon objet, au pire en parcourant la liste (en utlisant la propriété Tag pour stocker la valeur en retour dépendante de l'instance, s'il n'est pas possible de simplement transmettre l'adresse de l'instance elle-même, je pense aux fonctions de l'Api de Windows).

    D'ailleurs si tu pouvais nous expliquer - en termes simples - comment tu détermines la bonne instance à partir de paramètres dont la nature, la liste et le contenu sont parfaitement variables, je t'en serais reconnaissant.

    Ou alors, je suis complètement à côté de la plaque, pas hésiter à me le dire aussi, je suis solide !

  3. #3
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par CapJack Voir le message
    j'avoue avoir été découragé avant la fin, surtout par manque de temps.
    C'est l'annexe que tu as "skippée" ou tu t'es arreté encore avant ?
    Citation Envoyé par CapJack Voir le message
    A vrai dire, j'ai un peu le sentiment de rater quelque chose, car enfin :
    Tes deux "soit" ne sont pas "blanc et noir". Qu'entends-tu par "commune à tous les appels" vs "est susceptible de s'adresser à plusieurs instances séparées".
    Citation Envoyé par CapJack Voir le message
    soit la procédure callback est commune à tous les appels, et alors une référence explicite à la méthode d'une instance fixe suffit,
    Si j'ai bien compris la remarque, il est indiqué dans la section L'idée de base que justement :
    Seulement voilà ! Nous ne pouvons pas connaître l'objet sur lequel appeler la méthode. Et à la rigueur, on pourrait même ne pas savoir la méthode à appeler !
    Citation Envoyé par CapJack Voir le message
    soit la procédure callback est susceptible de s'adresser à plusieurs instances séparées, mais dans ce cas l'instance concernée est forcément déterminable d'une façon ou d'une autre par bijection à partir des paramètres transmis (sinon, à moi, ça me pose un problème de logique, à moins qu'il y ait une unité oui-ja.pas qui m'ait échappé ! ) ; une simple liste tenue à jour permet alors de choisir le bon objet, au pire en parcourant la liste (en utlisant la propriété Tag pour stocker la valeur en retour dépendante de l'instance, s'il n'est pas possible de simplement transmettre l'adresse de l'instance elle-même, je pense aux fonctions de l'Api de Windows).
    C'est presque vrai pour les call-back des API qui envoient - parfois - un handle, qui permet de retrouver le bon objet. Mais même cela n'est pas toujours vrai. Imagine un call-back qui envoie un unique paramètre entier, qui n'a rien à voir avec une bijection vers les objets potentiels. Comment fais-tu pour retrouver le bon objet ?
    Citation Envoyé par CapJack Voir le message
    D'ailleurs si tu pouvais nous expliquer - en termes simples - comment tu détermines la bonne instance à partir de paramètres dont la nature, la liste et le contenu sont parfaitement variables, je t'en serais reconnaissant.
    Eh bien en fait je ne détermine pas la bonne instance à partir des paramètres. La bonne instance, on la passe à MakeProcOfXXXMethod via le champ Data du paramètre Method. Ensuite, la valeur de ce champ Data est encodée dans le code exécutable de la procédure qui est produite.
    C'est par exemple le cas dans l'instruction PUSH CallBackObj de stdcall, sauf que CallBackObj est alors enregistré comme valeur immédiate (constante, dans le jargon ASM), et non comme une variable.
    Dans le code de MakeProcOfStdCallMethod, c'est l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjAddress := Method.Data;
    qui s'en charge. Note bien que ObjAddress est ici une partie du code exécutable produit - précédé du $68 qui signifie "PUSH la valeur immédiate sur 4 octets qui suit".

    Si je n'ai pas répondu à ta question, il faut que tu me la reposes plus précisément, parce que je ne suis pas sûr de l'avoir bien comprises
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #4
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    En fait, j'avais lu jusqu'à la construction de la stdcall.

    Bon, du coup, j'ai lu, relu, et re-relu, et finalement, tilt ! J'ai compris ce qui m'échappait : en fait, mon problème, c'est que je ne comprenais pas à quel moment était fabriqué le bloc de redirection. Maintenant je crois que j'ai pigé, et je dois reconnaître que c'est très ingénieux.

    En fait, en tant que naïf dur d'oreille, je me permettrais modestement de te conseiller de rajouter, dès le début de ton tutoriel, un bête exemple d'utilisation de MakeProcOfxxxMethod, avec une routine d'énumération Windows quelconque, parce que sans ça, on reste vraiment dans le vague au début, et même si on comprend toutes les techniques mises en oeuvre, on se demande "mais qu'est-ce que je peux bien faire de ce machin".

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par CapJack Voir le message
    En fait, en tant que naïf dur d'oreille, je me permettrais modestement de te conseiller de rajouter, dès le début de ton tutoriel, un bête exemple d'utilisation de MakeProcOfxxxMethod, avec une routine d'énumération Windows quelconque, parce que sans ça, on reste vraiment dans le vague au début, et même si on comprend toutes les techniques mises en oeuvre, on se demande "mais qu'est-ce que je peux bien faire de ce machin".
    Alors ça, c'est une excellente idée Je n'y avais pas pensé du tout, et maintenant que tu le dis, ça paraît évident qu'un exemple d'utilisation est essentiel.
    Je termine mon "tour de dvp" et je m'y colle
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Voilà ce que j'ai pondu :
    http://sjrd.developpez.com/delphi/tu...troduction#LVI
    Qu'en penses-tu ? Est-ce que cela t'aurait éclairé si tu l'avais lu avant ?
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Oui ! Voilà qui éclaire le début du sujet, en fournissant un mode d'emploi simple !

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    OK

    (je t'ai ajouté dans les remerciements)
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 9
    Points
    9
    Par défaut
    Salut sjrd et CapJack,
    Effectivement ce tutoriel est excellent, et l'ajout de l'exemple permet de mieux maitriser le sujet.
    Cela dit, chez moi, ca n'a pas marché du 1er coup (sjrd, je t'ai envoyé un MP pour essayer de comprendre), et je pense avoir trouvé mon erreur et donc - peut être - un oubli de ta part dans ton exemple:
    Dans l'exemple que tu donnes avec une procedure stdcall, il ne faut surtout pas oublier le stdcall dans la définition de la méthode qui va gérer le callback dans l'objet. Je pense donc qu'il faudrait corriger ton tutoriel sur le bout de code de la page 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function TFormMain.EnumWndCallBack(Handle: HWND; LParam: LPARAM): Boolean; stdcall;
    Chez moi, si on ne mets pas stdcall, l'exemple avec EnumWindows ne marche pas, et on voit bien que les parametres passés à EnumWndCallBack(), dans la pile sont n'importe quoi.

    Am I wrong ??

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Tu as tout à fait raison, il manque le stdcall. En fait c'est parce que quand on écrit une méthode, on ne met le stdcall que dans sa déclaration, et pas dans son implémentation. Du coup je n'ai pas pensé à l'indiquer. J'ai rajouté la déclaration dans mon tuto.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. [9.1] Gérer une FK pointant sur une PK de type SERIAL
    Par Marine_Arctica dans le forum Débuter
    Réponses: 9
    Dernier message: 02/07/2013, 17h40
  2. Appel d'une procédure stockée dans une procédure stockée
    Par MrEddy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/09/2006, 16h17
  3. initialiser une struc pointant sur une struct
    Par gronaze dans le forum C
    Réponses: 5
    Dernier message: 30/03/2006, 16h07
  4. Réponses: 3
    Dernier message: 17/01/2006, 17h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo