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 :

Création dynamique d'une instance à partir du nom de la classe


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 530
    Par défaut Création dynamique d'une instance à partir du nom de la classe
    Bonjour,

    Je voudrais créer dynamiquement un objet à partir de son nom de classe mais j'ai systématiquement une violation d'accès lors de l'appel à "create".
    Pouvez-vous me donner votre avis sur cet exemple basique?
    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
     
    program Project5;
    {$APPTYPE CONSOLE}
    {$R *.res}
    uses
      System.SysUtils,system.Classes;
     
      type TMaClasse=class(Tpersistent)
       public
          constructor create;virtual;
      end;
     
      type TClasse1=class(TMaClasse)
      private
          fprop1:string;
         public
          constructor create;override;
          property prop1:string read fProp1 write fProp1;
      end;
     
      constructor TMaClasse.create;
      begin
         inherited create;
      end;
     
      constructor TClasse1.create;
      begin
          inherited create;
         prop1:='ok';
      end;
     
      var   classe1:TClasse1;
     
    begin
      try
        RegisterClasses ([TMaClasse,TClasse1]);
        classe1:=TClasse1(getclass('TClasse1')).Create;  //Violation d'accès lors de la création de l'instance
        writeln(classe1.prop1);
        classe1.free;
        readln;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    Remarque: Si j'instancie un objet de la classe de base (TMaCLasse), ça fonctionne

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    TClasse1 est une classe pas une metaClass

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TMaClasseClass = class of TMaClasse
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe1:=TMaClasseClass (getclass('TClasse1')).Create;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 530
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    TClasse1 est une classe pas une metaClass

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe1:=TMaClasseClass (getclass('TClasse1')).Create;
    Voui... mais ça compile plus ("types incompatibles Tclasse1 et TMaClasse")
    Pas grave, il suffit de transtyper le résultat de TMaClasseClass (getclass('TClasse1')).Create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe1:=TClasse1(TMaClasseClass (getclass('TClasse1')).Create);
    Merci pour ton aide

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Pour le dire autrement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var   classeG :TMaClasse;
    classeG est une référence d'objet de la classe TMaClasse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var   MaMetaClasse: TMaClasseClass ;

    MaMetaClasse est une référence de la classe TMaClasse

    Rappel, TMaClasseClass est à TMaClasse ce qu'est TClass à TObjet ou TPersistentClass à TPersistent


    Donc on peut décomposer MaMetaClasse référence de la classe et classeG référence d'objet (instance)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaMetaClasse := TMaClasseClass(getclass('TClasse1'));
    classeG := MaMetaClasse.Create(); // permet l'utilisation du constructeur virtuelle.
    classeG est dans une variable TMaClasse mais pointe sur une instance de TClasse1, polymorphisme de base !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 081
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 081
    Par défaut
    Citation Envoyé par Higgins Voir le message
    Voui... mais ça compile plus ("types incompatibles Tclasse1 et TMaClasse")
    Pas grave, il suffit de transtyper le résultat de TMaClasseClass (getclass('TClasse1')).Create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classe1:=TClasse1(TMaClasseClass (getclass('TClasse1')).Create);
    Merci pour ton aide
    Oui mais cela n'a aucun sens d'affecter à une classe descendante TClasse1 avec une code générique à base de GetClass

    Si tu types fortement, la généricité disparaît !
    Toujours ce problème de confusion entre le type en DesignTime et le Type en RunTime qui peut être différent, il faut utiliser is et as, voir InheritsFrom pour gérer les transtypages en RunTime quand le type réel n'est pas connu en DesignTime
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre éclairé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    530
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 530
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Oui mais cela n'a aucun sens d'affecter à une classe descendante TClasse1 avec une code générique à base de GetClass

    Si tu types fortement, la généricité disparaît !
    oui, bien sûr. Là j'avais fais un exemple court pour montrer mon problème mais à l'usage, la variable utilisée sera faiblement typée

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

Discussions similaires

  1. [WD24] Création dynamique d'un état à partir d'une fenêtre
    Par tonioboss dans le forum WinDev
    Réponses: 0
    Dernier message: 11/04/2020, 16h57
  2. Réponses: 2
    Dernier message: 24/08/2016, 15h46
  3. Réponses: 2
    Dernier message: 27/04/2016, 14h20
  4. Réponses: 1
    Dernier message: 27/05/2008, 10h50
  5. [FB1.5]Création dynamique d'une procédure stockée ?
    Par Sitting Bull dans le forum SQL
    Réponses: 3
    Dernier message: 10/12/2004, 14h44

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