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 :

Comment déclarer une fonction publique ? [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut Comment déclarer une fonction publique ?
    Bonjour tout le monde.

    Je veux construire la fonction publique suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public
        Function SOMDOM(Table1:TDataset):real ;
        var i:integer;
      begin
      ............
      ...........
        end;
      end;
    mais j'ai le message d'erreur suivant : "identifier" expected but "begin" found".
    Aidez-moi s.v.p !

    Merci.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Par défaut
    Bonjour,

    Il ne faut pas placer l'implémentation du code dans la partie interface qui est purement déclarative...

    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
    interface
    type
      TMaClasse = class(ClasseParente)
      public
        Function SOMDOM(Table1:TDataset):real ;
      end;
    //...
    implementation
     
    function TMaClasse.SOMDOM(Table1:TDataset):real ;
    var
      i: integer;
    begin
      ............
      ...........
    end;
    C'est du basique, il faudrait regarder les docs Lazarus voire Delphi...

  3. #3
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut
    D'accord mais lors de l'appel de la fonction


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    var v:real;
    begin
      v:=TFonct.SOMDOM (Ventes);
    end;
    voila le message surgissant: "Only class methods, class properties, and class variables can be referred with class references.
    excusez moi je suis nul en fonctions et procédures.

  4. #4
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    Citation Envoyé par FOCUS77 Voir le message
    D'accord mais lors de l'appel de la fonction


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Button1Click(Sender: TObject);
    var v:real;
    begin
      v:=TFonct.SOMDOM (Ventes);
    end;
    voila le message surgissant: "Only class methods, class properties, and class variables can be referred with class references.
    excusez moi je suis nul en fonctions et procédures.
    L'erreur ici est de préfixer SomDom par TFonct : le compilateur s'attend non pas à travailler avec une instance de de TFonct (par exemple MyFonct de type TFonct) mais avec la classe elle-même : c'est pourquoi il ne trouve pas parmi les méthodes, propriétés et variables de classe une qui s'appellerait TFonct.

    Plusieurs solutions :
    1. Déclaration classique d'une fonction - Vous déclarez dans la partie interface de votre unité votre fonction dans une section type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function SOMDOM(Table1:TDataset):real;
    Dans la partie implementation, vous définissez votre fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function SOMDOM(Table1:TDataset):real;
    begin
      // votre code ici
    end;
    L'appel se fera sans préfixe et la fonction est publique

    2. Déclaration au sein d'une classe - Vous déclarez dans la partie interface de votre unité votre fonction dans une classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
      TMyClass = class
          private
            // vos déclarations privées
         public 
           function SOMDOM(Table1:TDataset):real;
          // vos autres déclarations publiques...
      end;
    Dans la partie implementation, vous définissez votre fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function TMyClass.SOMDOM(Table1:TDataset):real;
    begin
      // votre définition
    end;
    Après création de votre classe (instance appelée MyClass, par exemple), vous pourrez utiliser la fonction dans une partie de votre code :

    ...
    X := MyClass.SOMDOM(TableEnCours);
    ...

    Comme votre fonction est déclarée dans la partie public de votre classe TMyClass, elle sera publique

    Si tout cela vous semble du charabia, c'est que je m'exprime mal ou/et que vous devriez commencer par un cours de base comme celui excellent que propose Eric Thirion :
    http://lazarus.developpez.com/cours/...et/?page=pg_01

    Bonne continuation

    NB : Il me paraît étrange qu'une fonction prenne ainsi un Dataset en paramètres...
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  5. #5
    Membre éclairé
    Avatar de FOCUS77
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2014
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 336
    Par défaut
    Salut à tous

    Donc cette fonction est composée de 2 paramètres un Dataset et un numéro de colonne.
    Elle sert à calculer la somme d'une colonne de type réel ou entier.

    et voilà son code:

    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
    type
      TFonct = class
        Function FSUM(Dataset:TDataset;Col:integer):real ;
      end;  
     
     
     
    var
      Form1: TForm1; Fonct:TFonct; s:real; Col:integer; 
     
     
     
    Function TFonct.FSUM(Dataset:TDataset;Col:integer):real ;
    begin
      Dataset.first; s:=0;
      while not Dataset.eof do
      if not Dataset.eof then
      begin
       s:=s+Dataset.Fields[Col].AsFloat ;
       Dataset.Next ;
      end;
    end;    
     
     
    procedure TForm1.ExecClick(Sender: TObject);
     
    begin
      Fonct.FSUM(ventes,6) ;
      ShowMessage(floattostr(s));
    end;
    merci à vous tous.

  6. #6
    Rédacteur

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Billets dans le blog
    84
    Par défaut
    [QUOTE=FOCUS77;8175795]

    Je me permets quelques remarques (en dehors du fait qu'il y a des manières plus efficaces de faire la somme avec des fichiers) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TFonct = class
        Function FSUM(Dataset:TDataset;Col:integer):real ; 
      end;
    Si la classe ne contient que cette fonction, il est préférable de définir la fonction de manière autonome !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var
      Form1: TForm1; Fonct:TFonct; s:real; Col:integer;
    Il faut éviter au possible les variables globales, sources de confusion et d'erreurs : celles-ci pourraient facilement intégrer votre fonction. Ici, par exemple, étant donné la suite du code, la variable Col est inutile (voire nuisible) puisque jamais utilisée : la variable Col utilisée plus loin est la variable locale fournie par l'en-tête de la fonction ! De même, la variable s est tout aussi inutile puisqu'elle joue le rôle de Result (toujours définie pour une fonction).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Function TFonct.FSUM(Dataset:TDataset;Col:integer):real ;
    begin
      Dataset.first; s:=0;
      while not Dataset.eof do
      if not Dataset.eof then
      begin
       s:=s+Dataset.Fields[Col].AsFloat ;
       Dataset.Next ;
      end;
    end;
    Votre fonction ne renvoie aucune valeur si bien que le compilateur va vous avertir que la valeur de retour est indéterminée On devrait avoir une ligne du genre :
    Il suffit de remplacer tous les s totalement inutiles par Result...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.ExecClick(Sender: TObject);
    begin
      Fonct.FSUM(ventes,6) ;
      ShowMessage(floattostr(s));
    end;
    Votre fonction n'est pas une fonction utile puisque son résultat n'est pas exploité : il s'agit d'une procédure "camouflée". L'ensemble fonctionne parce qu'une fonction peut voir son résultat (ici par ailleurs indéterminé) être perdu sans déclencher de protestation et que vous avez calculé la somme à partir d'une variable spécifique (s).
    Il suffirait de remplacer s par Result dans la fonction et de remplacer les deux lignes de ExeClick par une seule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShowMessage(FloatToStr(FSUM(ventes, 6)));
    Si le préfixe Fonct a disparu, c'est que j'ai préféré définir une fonction isolée sans faire intervenir de classe. En gardant la classe, ce qui est toujours possible, on doit la créer avec Create et la détruire avec Free, sinon on aura une erreur de réservation de mémoire ou une fuite de mémoire...

    Franchement, je vous encourage à faire des essais comme vous le faites déjà, mais vous devriez cependant écouter le conseil de vous astreindre à une étude d'un cours complet pour maîtriser ces notions.

    Bon courage !
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

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

Discussions similaires

  1. [JavaScript] Comment correctement déclarer une fonction?
    Par Lcf.vs dans le forum Contribuez
    Réponses: 17
    Dernier message: 19/12/2014, 17h50
  2. [AC-2007] Comment déclarer une variable publique à partir d'un formulaire ?
    Par Dr Rodney Mckay dans le forum IHM
    Réponses: 2
    Dernier message: 27/07/2009, 21h30
  3. Réponses: 1
    Dernier message: 22/08/2007, 23h40
  4. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13
  5. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24

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