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

Delphi Discussion :

Méthodes Anonymes Delphi


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Par défaut Méthodes Anonymes Delphi
    Méthodes Anonymes Delphi : présentation, capture de variables et clôture, Invoke, implémentation et analyse mémoire, exemple profiling, énumérateur filtré, téléchargement et traitement de pages Web dans un thread [226 K, 9 ZIP d'examples, 13 fig]

    http://www.jcolibri.com/articles/vcl...s_methods.html

    john colibri
    jcolibri@jcolibri.com

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 932
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 932
    Par défaut
    Il y a encore la liaison des variables qui n'est pas clairement mentionnée. Ça ressemble au capture de variable, mais... sans variable.

    Pour appliquer ce principe, il faut passer par un constructeur de procédure anonyme. Les paramètres de ce constructeur deviennent des variables préinitialisées pour la procédure créée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    type
      TShowHello = reference to procedure(aText :string);
     
    //Création de la procédure anonyme
    function MakeShowHello(aPrefix: string) :TShowHello;
    begin
      Result := procedure(aText :string)
                begin
                  ShowMessage(aPrefix +' ' +aText);
                end;
    end;
     
    //Appels
    procedure DoShowHello;
    var
      ShowHello :TShowHello;
     
    begin
      ShowHello := MakeShowHello('Hello');
      ShowHello('World');                      //Affiche "Hello World"
      ShowHello('DVP');                        //Affiche "Hello DVP"
     
      ShowHello := MakeShowHello('Bonjour');
      ShowHello('le monde');                   //Affiche "Bonjour le monde"
      ShowHello('DVP');                        //Affiche "Bonjour DVP"
    end;
    Là, c'est bien le contenu de aPrefix qui est lié et non la variable (il n'y en a pas).
    Pour s'en convaincre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure DoShowHello;
    var
      ShowHello :TShowHello;
      Prefix    :string;
     
    begin
      Prefix    := 'Hello';
      ShowHello := MakeShowHello(Prefix);
      ShowHello('World');                      //Affiche "Hello World"
     
      Prefix    := 'Bonjour';
      ShowHello('DVP');                        //Affiche "Hello DVP"
    end;
    mais localement à la procédure anonyme, c'est bien une variable. Elle se comporte qui plus est comme une variable globale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    //Création de la procédure anonyme
    function MakeShowHello(aPrefix: string) :TShowHello;
    begin
      Result := procedure(aText :string)
                begin
                  aPrefix := aPrefix +'.';
                  ShowMessage(aPrefix +' ' +aText);
                end;
    end;
     
    //Appels
    procedure DoShowHello;
    var
      ShowHello :TShowHello;
     
    begin
      ShowHello := MakeShowHello('Hello');
      ShowHello('World');                      //Affiche "Hello. World"
      ShowHello('World');                      //Affiche "Hello.. World"
      ShowHello('World');                      //Affiche "Hello... World"
      ShowHello('World');                      //Affiche "Hello.... World"
    end;

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 53
    Par défaut capture d'environnement
    - merci pour ces précision
    - effectivement j'aurais du plutôt utilser "capture d'environnemnet'
    - j'ai oublié de présenter la modification de la locale après la définition
    de l'anonyme (c'est la dernière valeur qui est capturée)
    - dans votre cas, c'est le paramètre qui est l'énvironnement capturé
    - comme le tout est stocké dans un champ de l'objet sous-jacent,
    ceci explique que l'environnement persiste après la définition de
    la capture. C'est le comportement de tous les générateurs de
    séquence (total:= total + etc)

    John

Discussions similaires

  1. Conversion de C# à vb: méthodes anonymes
    Par AP dans le forum Framework .NET
    Réponses: 1
    Dernier message: 25/11/2008, 20h45
  2. Réponses: 2
    Dernier message: 31/12/2007, 13h50
  3. créer une méthode dynamique delphi
    Par ougueye dans le forum Delphi
    Réponses: 4
    Dernier message: 09/04/2007, 14h33

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