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 :

Methode de classe


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut Methode de classe
    Bonjour.

    Je suis famillier avec les classes JAVA, et moin avec les classes de Delphi.
    J'ai lu les tutoriels a ce propos, mais je ne comprend pas une chose :

    Comment faire une methode de classe. Ce qui en java se code :

    Public Static type nom( arguments)

    Il y a t-il un equivalent en Delphi ?

    merci

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Normalement, c'est une procédure, voire une fonction.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 80
    Par défaut
    ok je me suis mal exprimé. je sais ce qu'est une procedure ou une fonction.

    Le truc, c'est que quand je crée une classe avec des fonctions/procedure, il me faut imperativement créer une instance de cette classe pour acceder a la procedure.

    Le concept des methodes statiques, c'est de dire directement

    MaClasse.MaProcedure();

    sans avoir a crée d'instance.

  4. #4
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Ne va t'on pas rapidement boucler à cause du vocabulaire ?

    une classe Java = 1 prog, si je me souviens bien ?

    une classe Delphi = le prototypage d'un objet (avec ses propriétés et ses méthodes, les méthodes se déclinant en Fonctions ou en Procédures)

    De sorte que vouloir accéder à une méthode de classe sans créer l'instance correspondante n'a a priori pas de sens en Delphi :
    ce sera soit incorrect pour le compilo (pas de variable du type de l'objet), soit une exception lors de l'exécution (instance non créée avant appel d'une de ses méthodes)

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    Desolé de contredir le qi130
    tu peut tres bien acceder à une methode sans instancier
    exemple le plus connue le constrcteur
    il existe effectivement une methode

    il te suffit de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    type
        TMyClass = class
            class function JeFaisCeQueJeveut : Boolean;
           ...
       end;
    ...
    class function TMyClass.JeFaisCeQueJeveut: Boolean;
    begin
        Result := True;
    end;
    @+ Phil

  6. #6
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    Salut

    Citation Envoyé par HopeLeaves
    Bonjour.

    Je suis famillier avec les classes JAVA, et moin avec les classes de Delphi.
    J'ai lu les tutoriels a ce propos, mais je ne comprend pas une chose :

    Comment faire une methode de classe. Ce qui en java se code :

    Public Static type nom( arguments)

    Il y a t-il un equivalent en Delphi ?

    merci
    recherche dans l'aide à partir de ces modèles de déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class function TMaClasse.NomFonction(arg1: TypeArg1; arg2: TypeArg2): TTypeRetour;
    begin
    ...
    end;
    pour une méthode de classe sous forme de fonction, et pour les procédures de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class procedure TMaClasse.NomProcedure(arg1: TypeArg1; arg2: TypeArg2);
    begin
    ...
    end;
    Attention à la sémantique du self qui est différente de celle des méthodes d'objet. self désigne la classe elle-même dans la méthode de classe et non pas l'objet courant.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  7. #7
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Il me semble qu'il n'y a rien à faire pour les méthodes statiques contrairement à Java.

    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
    type TMaClasse = class( TObject )
           procedure UneMethode;
         end;
     
    procedure TMaClasse.UneMethode;
    begin
         ShowMessage('Je suis statique' );
    end;
     
    procedure TMaForm.ButtonClick
    var MaClasse: TMaClasse;
    begin
      // ... A noter, il n'y a pas de MaClasse := TMaClass.Create();
      MaClasse.UneMethode; 
    end;
    pratique pour faire des classes bibliothèques...

    bon courage !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  8. #8
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    euh tictac dans ton cas sa doit planter

    regarde le code fournit avant et la oui ca va marcher
    sinon essayer d'appelemer une methode d'un objet non instancier la probabilite de plantage est de 100%
    par contre tu peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tmaclass.create(self).unemethode
    @+ Phil

  9. #9
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Citation Envoyé par anapurna
    salut

    euh tictac dans ton cas sa doit planter

    regarde le code fournit avant et la oui ca va marcher
    sinon essayer d'appelemer une methode d'un objet non instancier la probabilite de plantage est de 100%
    par contre tu peut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tmaclass.create(self).unemethode
    @+ Phil
    Non ca ne plante pas comme je pensais.
    Les méthodes sont bien allouées en mémoire, mais pas les variables.
    si on fait appel à une variables, ca plante, c'est normal.

    Quant à ton exemple avec Create, ca ne plante bien sur pas puisque tu instancie la classe
    -> a éviter dans ce style, car tu n'as plus de trace de ton (pointeur) d'objet, tu ne peux donc le libérer.

    Mais ce que souhaite HopLeaves si j'ai bien compris, c'est de pouvoir utiliser des méthodes de classes non instanciées.

    Par contre, le compilo génère une avertissement.
    Il suffit de faire avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse := Nil; // si si !
    PS: Mais je suis d'accord, sémantiquement il vaut mieux utiliser 'class', c'est plus propre
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  10. #10
    Membre émérite
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Par défaut
    Citation Envoyé par TicTacToe
    Par contre, le compilo génère une avertissement.
    Il suffit de faire avant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaClasse := Nil; // si si !
    PS: Mais je suis d'accord, sémantiquement il vaut mieux utiliser 'class', c'est plus propre


    Absolument pas !!!!

    Une méthode de classe doit impérativement être déclarée avec le mot class devant, sinon ça ne compile pas et sinon ce n'est pas une méthode de classe.

    En faisant MaClasse := nil; tu utilises une instance. Donc évidemment, tu pourras accéder à n'importe quelle méthode de TMaClasse, sauf que si cette méthode fait référence à un membre de la classe, tu auras un plantage, puisque MaClasse pointe sur une zone nulle.

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMaClasse = class
    public
      class procedure mc;
    end;
    Bloon

  11. #11
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Bon alors je me fais mal comprendre.

    Je suis complètement d'accord qu'il faut utiliser (je le dis dans mon PS).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class TMaClasse.MaMethode() begin...end;
    puisque c'est la marche à suivre dans l'aide Delphi. La dessus pas de problème.

    Par contre, le code que j'ai posté fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     En faisant MaClasse := nil; tu utilises une instance.
    Pour moi, une instance, est une allocation d'une classe. L'instance devient un objet.
    Or, en faisant MaClasse := nil, il n'y a aucune allocation, uniquement une affection d'un pointeur (nil) à la variable MaClasse.
    Ceci, est uniquement dans le but de bluffer le compilo qui rale en disant: "attention vous utilisez une variable non initialisée'...donc je l'initialise.

    Ensuite, l'appel MaClasse.MaMethode fonctionne parfaitement, sans violation d'accès. Car il n'y a pas de tentative de lecture d'une zone mémoire non allouée (les méthodes sont allouées même si aucun objets n'a été instancié).
    Cela provoquerait une violation si je tentais d'accéder à une variable, qui est allouée pour chaque instanciation par contre.

    je suis pas en train de dire que ma méthode est bonne, mais qu'elle fonctionne et qu'elle ne plante absolument pas contrairement à ce que je lis (essayez!).
    C'est une constatation, rien de plus...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

Discussions similaires

  1. Réponses: 9
    Dernier message: 08/02/2006, 12h46
  2. [POO] Prob avec une méthode de classe
    Par Ludo75 dans le forum Langage
    Réponses: 9
    Dernier message: 06/02/2006, 22h37
  3. [DLL] Methodes de classe et dll
    Par chronos dans le forum C++
    Réponses: 11
    Dernier message: 27/04/2005, 17h18
  4. Méthode de classe et copie d'objets
    Par Duloup dans le forum Général Python
    Réponses: 5
    Dernier message: 11/04/2005, 16h27
  5. Visibilité de methodes dans Classe de Class
    Par Math75 dans le forum C++
    Réponses: 9
    Dernier message: 28/09/2004, 12h48

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