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 :

Forme d'appel de méthode réservé méthodes de classe


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Forme d'appel de méthode réservé méthodes de classe
    Bonsoir,
    quand je compile mon code, j'obtiens l'erreur suivante : "Forme d'appel de méthode autorisée seulement pour les méthodes de classes"
    à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      gauche:= '0';
      droite:= '0';
      haut  := '0';
      bas   := '0';
      //différents actions sur gauche, droite, haut et bas ...
      [b]Client.envoyerTouches(haut,bas,gauche,droite);[/b]
    end;
    Cette fonction me sert à envoyer une chaîne à partir d'un client vers un serveur en utilisant Winsocks:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure Client.envoyerTouches(haut,bas,gauche,droite:string);
    		begin
    			socket.sendStr('007 ' + haut + bas + gauche + droite +'#13#10');
    		end;
    et voici mes déclarations :
    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
    type
      TForm1 = class(TForm)
        Label1: TLabel;
        Fleche_Haut: TImage;
        Fleche_Gauche: TImage;
        Fleche_Droite: TImage;
        Fleche_Bas: TImage;
        affichage: TLabel;
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure FormKeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
      Client = class
    			constructor creer(
    				nom:String;
    				serveur:String;
    				port:String);
          destructor detruire();
    			private
    				socket:TWSocket;
    				port:String;
    				procedure onDnsLookupDone(sender:TObject; error:Word);
    				procedure onSessionConnected(sender:TObject; error:Word);
    				procedure onSessionClosed(sender:TObject; error:Word);
    			public
            connecte:Boolean;
            [b]procedure envoyerTouches(haut,bas,gauche,droite:string);[/b]
          end;
    var
      Form1: TForm1;
      gauche:string;
      droite:string;
      haut  :string;
      bas   :string;
    Ma procédure est bien définie partout pareil, et je doute qu'une procédure du même nom soit définie dans uses standarts de Delphi. Je ne comprend vraiment pas d'où vient le problème :/

  2. #2
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Oi, esta realmente um chico do Brasil ?


    question procedure, c'est normal.


    Client est une classe, pas un objet de TForm1.

    dans la procedure de Tform1, le compilateur cherche un objet de Tform1, une variable globale ou une méthode, mais pas une procédure de classe d'objet.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    é sou mesmo

    Il n'y aurait pas de bidouille me permettant d'utiliser cette procédure de Client dans cette procedure de Tform1 ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 58
    Points : 43
    Points
    43
    Par défaut
    même si c'est pas très propre, tu peux modifier la fonction EnvoyerTouches pour qu'elle modifie les variables globales Gauche, Droite, Haut, Bas ... de cette manière TForm1 poura y accéder ... pas très propre mais ca devrait marcher !
    http://adrien.frenchcomp.net : Blog (expériementations, contributions), CV, projets....

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Le problème c'est que ces variables se modifie suivant l'appui sur les touches, donc au travers de la procédure TForm1.OnKeyDown

  6. #6
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Pourquoi ne pas déclarer client en amont de TForm1 en tant que class d'objet et déclarer une instance de client dans form1 ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    je ne comprend pas très bien la syntaxe pour déclarer une instance de client dans form1

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Effectivement, tu ne peux pas faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client.envoyerTouches(haut,bas,gauche,droite);
    parce que client, tu l'as déclaré comme type, ce n'est pas un objet. En fait c'est comme si tu étais en train de faire des trucs du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string:='Toto';
    Integer:=5;
    Il faut donc que tu déclares la variable de type Client, puis que tu utilises la variable pour accéder à ta procedure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var MonClient:Client;
    ...
    MonClient.envoyerTouches(haut,bas,gauche,droite);

    Déjà,je te conseilles de renommer ton Client en TClient pour qu'il soit un peut plus "type" dans, :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Client = class
             constructor creer(
              ...
    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TClient = class
             constructor creer(
              ...
    Ensuite, il va falloir que tu déclares ta variable pour ta fiche :
    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
    TForm1 = class(TForm)
        Label1: TLabel;
        Fleche_Haut: TImage;
        Fleche_Gauche: TImage;
        Fleche_Droite: TImage;
        Fleche_Bas: TImage;
        affichage: TLabel;
        procedure FormKeyDown(Sender: TObject; var Key: Word;
          Shift: TShiftState);
        procedure FormKeyUp(Sender: TObject; var Key: Word;
          Shift: TShiftState);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        MonClient:TClient;
      end;
    Puis que tu utilises ton constructeur (dans le OnCreate de ta fiche par exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       MonClient:=TCLient.creer(UnNom,UnServeur,UnPort);
    end;
    Détruire l'objet dans le FormDestroy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
       MonClient.detruire;
    end;
    Et comme ça tu pourras l'utiliser comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      gauche:= '0';
      droite:= '0';
      haut  := '0';
      bas   := '0';
      //différents actions sur gauche, droite, haut et bas ...
      MonClien.envoyerTouches(haut,bas,gauche,droite);
    end;

    Avec tout ça, ça devrait marcher... 8)
    Bidouilleuse Delphi

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'en suis sûr et je t'en remercie beaucoup, j'ai inséré les modifications, mais maintenant lors de l'éxécution, il n'arrive pas à trouver la form alors qu'elle est bien là :
    ---------------------------
    Notification d'une exception du débogueur
    ---------------------------
    Le projet fiche_client.exe a provoqué une classe d'exception EResNotFound avec le message 'Ressource TForm1 non trouvée'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
    ---------------------------
    OK Aide
    ---------------------------
    même en mettant tout le code concernant TClient entre accolade (en vérifiant bien qu'elle ne se ferme pas en plein milieu).

    Les commentaires ne sont pas censés être ignorés lors de la compilation ?

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Mais qu'est ce que tu as fait ?
    Bidouilleuse Delphi

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Je ne sais vraiment pas

    La form avait disparue, il ne restait plus que son unit.

    Mais même en recréant tout proprement, quand j'ajoute le code relatif à TClient il me fait toujours la même erreur

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Le code, il est a ajouter au .pas pas au .dfm !!! (tu as du basculer entre l'affichage mode fiche et l'affichage mode texte !)

    Poste le code de ton unité une fois modifié. Je pourrais sans doute t'aider.
    Bidouilleuse Delphi

  13. #13
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    oui j'ai bien tout rajouté dans le .pas, pas le .dfm


    Version qui marche

    Version qui ne marche pas

  14. #14
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    il manque l'appel à la dfm dans l'unit qui ne marche pas

    {$R *.dfm}

    en plus, est ce qu'il ne faudrait pas déclarer TClient en class(Tobject) ?

  15. #15
    Futur Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup, moi qui virait cette ligne pensant qu'elle ne servait à rien, ça m'apprendra

  16. #16
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    hmmm, déjà les constructeurs et destructeurs de TClients devraient être dans la partie Public ta classe :
    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
    TClient = class
                  private
                     socket:TWATCPClient;
                     port:String;
                     procedure onDnsLookupDone(sender:TObject; error:Word);
                     procedure onSessionConnected(sender:TObject; error:Word);
                     procedure onSessionClosed(sender:TObject; error:Word);
                  public
                     connecte:Boolean;
                     constructor creer(nom:String;
                                       serveur:String;
                                       port:String);
                     destructor detruire;
                     procedure envoyerTouches(haut,bas,gauche,droite:string);
                  end;
    Et tu dois supprimer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure MonClient.envoyerTouches(haut,bas,gauche,droite:string);
    begin
       socket.sendStr('007 ' + haut + bas + gauche + droite +'#13#10');
    end;
    ..qui est juste avant le OnForm1KeyDown

    Ca devrait marcher un peu mieux
    Bidouilleuse Delphi

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par bjl
    il manque l'appel à la dfm dans l'unit qui ne marche pas

    {$R *.dfm}

    en plus, est ce qu'il ne faudrait pas déclarer TClient en class(Tobject) ?
    +1
    Bien vu, joli coup d'oeil bjl !
    Bidouilleuse Delphi

Discussions similaires

  1. forme d'appel autorisé seulement par les méthodes de classe
    Par Ema1714 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 28/05/2014, 15h17
  2. [POO] Appeler une méthode redéfinie de la classe parente
    Par Djakisback dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2006, 22h56
  3. Réponses: 4
    Dernier message: 03/07/2006, 22h52
  4. Problème pour appeler une méthode d'une autre classe
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 7
    Dernier message: 03/03/2006, 13h33
  5. [Interface] Appeller toutes les méthodes héritées d'un class
    Par thibaut.d dans le forum Général Java
    Réponses: 4
    Dernier message: 25/01/2005, 08h42

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