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 :

Cherche tuto sur les variables contenant des procedures/fonctions


Sujet :

Delphi

  1. #1
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut Cherche tuto sur les variables contenant des procedures/fonctions
    Bonjour,

    Je cherche activement un tuto / cours sur les delegate ou délégués en Delphi. En gros sa permet de passé des Variables d'une forme à une autre. Mais j'ai du mal dans la technique.
    Si vous connaissez un bon lien, je suis preneur.


    Bonne journée,
    bien cordialement,

  2. #2
    Membre émérite
    Avatar de Thierry Laborde
    Homme Profil pro
    N/A
    Inscrit en
    Avril 2002
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : N/A

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 391
    Points : 2 529
    Points
    2 529

  3. #3
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    En réalité j'avais mal construit ma demande. Je cherchais plus quelques choses sur les variables qui peuvent contenir des procedures ou encore des fonctions du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMaDelegate = Procedure(I : Integer , S : String) Of Object;
    Mais tes liens me seront utiles par la suite tout de même !

    Merci
    Bonne journée,

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    il en existe trois types:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TProcedure  = procedure (param: type);
     
      TMethod = procedure(param: type) of object;
    la première est une pointeur sur une procédure (ou une fonction), la seconde un pointeur sur une méthode objet. A la différence de la première un second pointeur lui est associé, celui de l'instance objet concerné. C'est pour cela que "Button1.OnClick := Form1.Button1Click" suffit pour associer à la fois Form1 et sa méthode Button1Click à l'objet Button1.

    et le troisième type ? ce sont les "reference to procedure", qu'on appelle aussi fonction anonyme. Celle là est particulière, puisqu'elle va permettre de capturer des variables locales

    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
     
    type
      TExemple = reference to procedure(Obj: TObject);
     
    var
      ex: TExemple;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ex := procedure(Obj: TObject)
            begin
              ShowMessage(TButton(Obj).Caption + ' et ' + TButton(Sender).Caption);
            end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      ex(Sender);
    end;
    dans cet exemple, il faut cliquer sur Button1 puis Button2 et deviner ce qu'il se passe
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Avant de commencer,
    Merci de ta réponse




    Bonne chance à ceux qui essayent et qui comme moi débutent dans le milieu, attention sa fait mal à la tête !

    Bon, après trituration dans tout les sens je propose une réponse :

    Button1.OnClick :
    1. On initialise la delegate TExemple.
    2. TButton(Obj).Caption ne vaut null car Obj n'as pas encore été définis ?
    3. TButton(Sender).Caption affiche TButton1 car Sender existe lui pour le coup ?
    Donc le Show Message = 'et TButton1'

    Button2.OnClick :
    1. On appelle la delegate ex.
    2. Obj vaut le Sender du TButton2 vu qu'on l'a passé en paramètre dans Button2Click. Et le TButton(Sender) est le TButton1.
    Le Showmessage affichera donc :
    TButton1 et TButton2.


    ~ Inversement : En clickant sur le Button2 puis sur le Button1 ~
    Button2.OnClick :
    1. Access violation ou un truc du genre car on ne pourra pas accéder à l'initialisation de ex vu qu'il faut forcément clicquer sur Button1 pour lancer l'initialisation de ex.



    Après auto-correction :
    Il me semble que j'ai compris le fonctionnement général, cependant lorsque l'on clique sur Button1 il n'y a pas de ShowMessage, or, je ne comprends pas vu que le Sender de TButton(Sender).Caption existe belle et bien ici même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm1.Button1Click(Sender: TObject);

  6. #6
    Membre expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 048
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 048
    Points : 3 342
    Points
    3 342
    Par défaut
    Bonjour,

    Dans Button1Click on ne fait qu'attribuer la "variable" "ex" avec la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ex := procedure(Obj: TObject)
            begin
              ShowMessage(TButton(Obj).Caption + ' et ' + TButton(Sender).Caption);
            end;
    Dans Button2Click utilise cette procédure...

    Je n'ai pas testé mais je dirais que le résultat est plutôt "Button2 et Button1".

  7. #7
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Exact : Button2 et Button1 je me suis trompé en écrivant mais il y avait la bonne logique !
    Et oui d'accord, capito !

    Sujet résolu.


    Edit: Un lien util : http://laurent-dardenne.developpez.c...resEtMethodes/

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    comme le précise Barbibulle, Button1 n'appelle pas la procédure, il déclare une procédure qui est affectée à ex.

    quand Button2 appelle ex (si on n'a pas cliqué sur Button1, ex n'est pas défini, l'erreur est normale), on appelle la procédure avec Button2 en paramètre, mais là où c'est très fort, c'est qu'une référence au paramètre Sender de Button1Click a été conservée alors qu'on a quitté la procédure depuis longtemps. Donc la "reference to procedure" a capturé un paramètre et le conserve pour plus tard. Evidemment si Button1 devait être détruit, ex() planterait en y faisant référence.

    voici un autre exemple qui montre la capture d'une variable locale

    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
      TExemple = reference to function: string;
     
    var
      ex: TExemple;
      s1: string = 'World'; // s1 initialisé à 'World'
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s2: string;
    begin
      s2 := s1; // copie locale de s1
      ex := function: string
            begin
              Result := s1 + ' ' + s2; // s1 et s2
            end;
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      s1 := 'Hello';
      ShowMessage(ex);
      s1 := 'Bye';
      ShowMessage(ex);
    end;
    Notez aussi qu'on peut créer une fonction qui retourne une reference to procedure

    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
     
    function Demo(Value: string): TExemple;
    begin
      Result := function: string
                begin
                  Result := Value + s1;
                end;
    end;
     
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      ex := Demo('Test');
      s1 := '1';
      ShowMessage(ex);
      s1 := '2';
      ShowMessage(ex);
    end;
    dernier cas d'usage et non des moindres, on utilise la reference comme paramètre d'une fonction

    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
     
    type
      TCompare = reference to function(s1, s2: string): Boolean;
     
    function IsEqual(s1, s2: string; Compare: TCompare): Boolean;
    begin
      Result := Compare(s1, s2);
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    begin
      if IsEqual(
        'a', 'b',
        function(s1, s2: string): Boolean
        begin
          Result := s1 = s2;
        end)
      then
        ShowMessage('a = b')
      else
        ShowMessage('a <> b');
    end;
    ce sera utilisé par exemple dans une fonction de trie dans laquelle on pourra indiquer directement le code de la fonction de comparaison sans avoir à déclarer une procédure externe.

    et si on mélange un peu les exemples on obtiens quelque chose comme ça

    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
    27
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      CaseSensitive: Boolean;
      Compare: TCompare;
    begin
      Compare := function(s1, s2: string): Boolean
                  begin
                    if CaseSensitive then
                      Result := s1 = s2
                    else
                      REsult := CompareText(s1, s2) = 0;
                  end;
     
      CaseSensitive := False;
      if IsEqual('A', 'a', Compare) then
        ShowMessage('A = a')
      else
        ShowMessage('A <> a');
     
      CaseSensitive := True;
      if IsEqual('A', 'a', Compare) then
        ShowMessage('A = a')
      else
        ShowMessage('A <> a');
     
    end;
    et même :
    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
    27
    28
    29
    30
    31
     
    function CompareString(CaseSensitive: Boolean): TCompare;
    begin
      Result := function(s1, s2: string): Boolean
                begin
                  if CaseSensitive then
                    Result := s1 = s2
                  else
                    Result := CompareText(s1, s2) = 0;
                end;
    end;
     
    procedure TForm1.Button4Click(Sender: TObject);
    var
      Compare: TCompare;
    begin
      Compare := CompareString(False);
     
      if IsEqual('A', 'a', Compare) then
        ShowMessage('A = a')
      else
        ShowMessage('A <> a');
     
      Compare := CompareString(True);
     
      if IsEqual('A', 'a', Compare) then
        ShowMessage('A = a')
      else
        ShowMessage('A <> a');
     
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] à la recherche d'un bon tuto sur les dates
    Par gretch dans le forum Langage
    Réponses: 2
    Dernier message: 06/10/2006, 16h01
  2. Tuto sur les Hooks
    Par reptils dans le forum Windows
    Réponses: 2
    Dernier message: 13/07/2006, 20h49
  3. cherche tuto sur les tab control
    Par firejocker dans le forum MFC
    Réponses: 66
    Dernier message: 14/12/2005, 16h55

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