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

Lazarus Pascal Discussion :

Passer une procédure en paramètre [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Passer une procédure en paramètre
    Bonjour,

    Je voudrais exécuter un procédure en lui passant en paramètre une autre procédure.
    D'après les infos trouvées sur Internet, j'ai essayé ceci :

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    type
     
      TTraitement = procedure(const f: String);
     
      { TMain }
     
      TMain = class(TForm)
        // ..
      private
        { private declarations }
        // ..
        procedure TraiterDossier(d: string; t: TTraitement);
        procedure TaiterFichier(const fichier: String);
      public
        { public declarations }
      end;
     
    procedure TMain.TraiterDossier(d: string; t: TTraitement);
    var sr: TSearchRec;
    begin
      if (FindFirst(d + '*', faAnyFile and faDirectory, sr) = 0) then
      begin
        repeat
          if ((sr.Attr and faDirectory) <> 0) then
          begin
            if (sr.Name <> '.') and (sr.Name <> '..') then
            begin
              nbDir := nbDir + 1;
              TraiterDossier(IncludeTrailingBackslash(d + sr.Name), t);
            end;
          end
          else
          begin
            TaiterFichier(sr.Name);
          end;
        until (FindNext(sr) <> 0);
      end;
    end;
     
    procedure TMain.TaiterFichier(const fichier: String);
    begin
      // traitement
    end;
     
    procedure TMain.btnTraiterClick(Sender: TObject);
    begin
      TraiterDossier(edDossier.Text, TraiterFichier);
    end;
    mais il bloque sur la ligne "TraiterDossier(edDossier.Text, TraiterFichier);" avec le message
    main.pas(123,59) Error: Wrong number of parameters specified for call to "TraiterFichier"


    Pouvez-vous m'aider sur la bonne manière de procéder ?
    Merci d'avance de l'aide que vous pourriez m'apporter.
    Dernière modification par gvasseur58 ; 27/04/2017 à 23h23.

  2. #2
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour.

    Tu dois donner l'adresse de la procédure : TraiterDossier(edDossier.Text, @TraiterFichier);

    Mais tu vas encore rencontrer une erreur.
    Pcq ta procédure TraiterFichier est une procédure de l'objet TMain.
    Il te faut alors rédéfinir ton type :
    TTraitement = procedure(const f: String) of object;

    Puis appeler la procédure par T(sr.name).

    Remarque : la mémoire allouée à SearchRec, après usage, doit être libérée par FindClose.

    Cordialement
    Thierry

  3. #3
    Invité
    Invité(e)
    Par défaut
    super, cela fonctionne, merci !

  4. #4
    Membre expérimenté
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 094
    Points : 1 530
    Points
    1 530
    Billets dans le blog
    5
    Par défaut
    Ça serait bien de mettre ça dans le FAQ. Je pense que ça doit en intéresser plus d'un.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 789
    Points : 13 449
    Points
    13 449
    Par défaut
    Ca peut ne pas paraître clair en lisant le message :

    Error: Wrong number of parameters specified for call to "TraiterFichier"
    Le paramètre t est une variable procédurale, un pointeur (@) sur une procédure de type TTraitement.
    En omettant le @, le compilateur voit TraiterFichier comme un appel à une fonction censée retourner un TTraitement. Cette fonction attend un paramètre Fichier, il ne le trouve pas => erreur : pas le bon nombre de paramètres !

    Le compilateur s'arrête sur la première erreur "logique", même si au final, elle n'a pas grand chose à voir avec la cause réelle, ici l'oubli du @

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2016, 23h29
  2. Faire passer une table en paramètre pour une procedure
    Par samplaid dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/02/2006, 11h26
  3. Réponses: 1
    Dernier message: 15/04/2005, 11h30
  4. [Conception] Passer une fonction en paramètre
    Par pejay dans le forum Langage
    Réponses: 9
    Dernier message: 09/12/2004, 13h58
  5. Passer une procédure en paramètre ?
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2003, 12h21

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