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 :

Passer un text comme un nom de classe


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 75
    Points : 59
    Points
    59
    Par défaut Passer un text comme un nom de classe
    bonjour
    alors d'abord je sais pas si c'est possible ... bon voilà j'ai une classe abstraite TESTEUR avec une méthode abstraite "LireLeFichier"
    dans les classes filles (TESTEURV2, ... ), j'implémente cette méthode et elle est différente à chaque fois
    dans une autre procedure j'ai besoin d'appeler cette méthode mais je ne sais pas d'avance laquelle de ces classes filles
    par contre son nom est inscrit dans DBLookUpComboBoxTesteur (le nom du testeur est rentré ds la base)

    pour appeler la méthode je fais donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TESTEURV2.LireLeFichier (params)
    et là c'est que je voudrais faire à la place c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FormBddSql.DBLookUpComboBoxTesteur.text.LireLeFichier(params)
    car dans DBLookUpComboBoxTesteur j'ai le nom de mes classes (TESTEURV2,..)
    je sais pas si c'est ça un cast ou comment je peux faire car là ben ça ne marche pas
    merci

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut Re: passer un text comme un nom de classe
    Citation Envoyé par marie253
    car dans DBLookUpComboBoxTesteur j'ai le nom de mes classes (TESTEURV2,..)
    La variable 'text' est de type String ou référence de classe ?

  3. #3
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut Re: passer un text comme un nom de classe
    Si la méthode est une méthode de Classe alors tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TESTEUR(GetClass(FormBddSql.DBLookUpComboBoxTesteur.text)).LireLeFichier(params)
    Par contre, il faut que :
    - LireLeFichier soit une méthode de classe
    - LireLeFichier soit une méthode virtuelle ou dynamique

    Si elle n'est pas une méthode de Classe, ce n'est pas possible du tout de faire ce que tu veux. Car les Méthodes d'objet on besoin d'une instance d'objet pour être exécutées.

    Si la méthode n'est pas virtuelle, tu risque de perdre l'héritage et donc de ne pas appeler la bonne méthode en fonction de la classe réelle de l'objet.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    d'abord merci^^ pour les réponses mais je n'arrive pas ...
    pourtant sur le principe vs m'avez donné une réponse qui devrait correspondre. je détaille un peu plus

    marie253 a écrit:
    car dans DBLookUpComboBoxTesteur j'ai le nom de mes classes (TESTEURV2,..)


    La variable 'text' est de type String ou référence de classe ?
    de type string

    LireLeFichier est bien une méthode de classe et dans la classe Testeur elle est virtuelle (plus dans les sous-classe)
    si ça peut aider à m'aider, voici les 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
     
    type
     
    //classe abstraite pour tous les testeurs
      TESTEUR = class(TObject)
        private
        public
        class procedure LireLeFichier(var list : tgabsord; var F : TMemo); virtual; abstract;
      end;
     
    //Classe qui gère le testeur V2
      V2 = class(TESTEUR)
        private
        public
        class procedure LireLeFichier(var list : tgabsord; var F : TMemo); override;
      end;
    ....
    La procedure LireLeFichier :
    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
    class procedure V2.LireLeFichier(var list : TGABSORD; var F : TMemo);
    var Stg : string;
        i, p : integer;
    begin
    for i := 7 to F.lines.Count-1 do
        begin
          Stg := F.Lines[i];
          Stg := AnsiReplaceText(Stg, '.', ',');  //remplacer dans la chaîne le caractère '.' par ','
          if Stg <> ' '
           then begin
                  p := POS(' ', Stg); //position du premier espace dans la chaine
                  if p <> -1 then
                  begin
                   list.addPoint(StrToFloat(copy(Stg, 1, p-1)),
                                 StrToFloat(copy(Stg, p+1, length(Stg))));
                  end;
                end;
        end;
    end;
    dans une autre unité (traitement des listes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // V2.LireLeFichier(self,FormBddSql.Memo2);
    ceci marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TESTEUR(getclass(FormBddSql.DBLookupComboBoxTesteur.Text)).LireLeFichier(self, FormBddSql.memo2);
    ne marche pas. j'ai bien vérifié que FormBddSql.DBLookupComboBoxTesteur.Text me donnait V2
    l'erreur : violation d'acces à l'adresse ... lecture de l'adresse 00000000
    je vois pas d'où ça peut venir (ça doit etre l'appel puisque ds la ligne audessus cette fonction marche)
    au fait je ne crée pas d'instance d'objet.
    je sais vraiment pas quoi vérifier une idée?

  5. #5
    Membre expérimenté
    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
    Points : 1 339
    Points
    1 339
    Par défaut
    GetClass ne marche que pour les classes persistantes. Il faut implémenter un mécanisme d'enregistrement :

    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
    type
      TTesteurClass = class of TESTEUR;
     
    var
      classByName : TStringList;
     
    // Enregistrer une classe
    procedure registerClassByName(classe: TTesteurClass);
    begin
      // Ajout de la classe si elle n'est pas déjà référencée
      if (classByName.IndexOf(classe.ClassName) = -1) then
      begin
        classByName.AddObject(classe.ClassName,TObject(classe));
      end;
    end;
     
    // Obtenir une classe par son nom
    function getClassByName(nom: string): TTesteurClass;
    var
      i : integer;
    begin
      // Recherche dans la liste des classByName
      i := classByName.IndexOf(nom);
      // si pas trouvé, on renvoie nil
      if (i = -1) then
      begin
        result := nil;
      end
      // si trouvé, on renvoie la classe associée
      else
      begin
        result := TTesteurClass(classByName.objects[i]);
      end
    end;
     
    // Au début de l'application, enregistrer les testeurs :
    classByName := TStringList.Create;
    registerClassByName(V2);
    ...
     
    // Fin d'application, libérer classByName
    classByName.Free;
     
    // Utilisation :
    getClassByName(FormBddSql.DBLookupComboBoxTesteur.Text).Lecture...
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  6. #6
    Membre du Club
    Femme Profil pro
    Inscrit en
    Avril 2004
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 75
    Points : 59
    Points
    59
    Par défaut
    ça marche nickel merci beaucoup !!

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

Discussions similaires

  1. [XL-2010] Utiliser un texte comme nom de cellule
    Par Daejung dans le forum Excel
    Réponses: 8
    Dernier message: 27/12/2013, 14h48
  2. Passer un objet comme attribut d'une classe
    Par Leduc08 dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 05/04/2011, 11h54
  3. [JTextArea] Fenêtre de texte comme un chat
    Par meda dans le forum Composants
    Réponses: 5
    Dernier message: 01/11/2004, 11h34
  4. Passer une fonction comme argument à une fonction
    Par Cocotier974 dans le forum Général Python
    Réponses: 4
    Dernier message: 29/06/2004, 13h41
  5. [Chargement de classe][noms de classe relatifs]
    Par freudy dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2004, 11h36

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