1. #1
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    octobre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : octobre 2005
    Messages : 62
    Points : 75
    Points
    75

    Par défaut Est-il possible de créer un objet à partir de son nom de classe ?

    Bonjour à toutes & à tous,

    Je sais, le titre n'est pas des plus clairs. Je vais me rattraper avec un exemple de ce que je cherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      obj: TObject;
     
      obj := BuildObject( 'TButton', Self );
    Bien sûr, il n'est pas question de faire un case of en testant toutes les classes .

    Merci d'avance pour vos lumières

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Traqueur de tritons et autres bestioles
    Inscrit en
    mars 2002
    Messages
    1 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Traqueur de tritons et autres bestioles

    Informations forums :
    Inscription : mars 2002
    Messages : 1 442
    Points : 3 474
    Points
    3 474

    Par défaut

    Salut,

    A ma connaissance, cela n'est pas possible directement d'une manière générale.
    Pour les descendants de TPersistent, il existe une fonction FindClass, qui peut te rendre service.

    Si tu travailles avec un ensemble de classes plus large que TPersistent, une idée pourrait être de créer un registre de classes indexé par leur nom (méthode ClassName), ce n'est pas très compliqué (c'est en gros ainsi que FindClass travaille) à faire mais cela peut être fastidieux s'il y a beaucoup de classes.

    Quel est ton besoin exact ?

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 8.x 64bit, Lazarus 1.6 (FPC 3.0), Python 3

    "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."

  3. #3
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 386
    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 : 2 386
    Points : 3 730
    Points
    3 730

    Par défaut

    salut ,

    si la class est enregistré donc connue il y a moyen de créer dynamique un instance d'objet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     PerSistClass := GetClass('TBUTTON');
     if Assigned(PerSistClass) Then   
        Instance := TPersistentClass(PerSistClass).Create(Self);
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    octobre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : octobre 2005
    Messages : 62
    Points : 75
    Points
    75

    Par défaut

    Bonjour et merci de vous penchez sur mon problème les amis

    J'ai eu la réponse ici
    La version courte: ce n'est pas possible.

    En fait, je voulais m'éviter de caster quoi que ce soit, pas seulement par fainéantise mais surtout pour l’exhaustivité de la méthode.
    Je suis bon pour un case of long comme un jour sans pain...

    Bien sûr, si entre temps quelqu'un trouve une solution sans caster, je suis preneur !

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Traqueur de tritons et autres bestioles
    Inscrit en
    mars 2002
    Messages
    1 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Traqueur de tritons et autres bestioles

    Informations forums :
    Inscription : mars 2002
    Messages : 1 442
    Points : 3 474
    Points
    3 474

    Par défaut

    Salut

    Supposons que la fonction BuildObject existe, son intérêt, dans l'optique d'éviter les cast, est nul. en effet on se retrouve en sortie avec un TObject (comme ton exemple d'illustration le montrait) sur lequel on ne peut pas directement faire grand chose, de là même, il devient difficile d'éviter un Cast.

    Pourrais-tu définir plus précisément ton besoin ? est-ce limité à une famille particulière de classes ?

    FindClass est un habillage de GetClass, avec exception, la réponse d'Anapurna rejoint donc la mienne, on ne peut traiter que des descendants de TPersistent.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 8.x 64bit, Lazarus 1.6 (FPC 3.0), Python 3

    "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."

  6. #6
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    octobre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : octobre 2005
    Messages : 62
    Points : 75
    Points
    75

    Par défaut

    @e-ric:

    Tout à fait d'accord avec toi sur le fait d'obtenir un TObject mais cela me suffit amplement.
    Le but de tout ceci est d'utiliser tel quel un fichier .lfm qui contient le design d'une interface pour l'analyser et créer dynamiquement les objets qu'il contient...et ça fonctionne !
    Je dois néanmoins caster quelque peu des propriétés comme un TStrings mais ça reste raisonnable.
    Bien entendu, lors de la phase de création de l'objet, il s'agit là aussi de caster nommément le type d'objet désiré en fonction de son nom mais là encore, ça reste raisonnable.

    Merci à tous pour votre aide

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/04/2009, 18h09
  2. Réponses: 4
    Dernier message: 21/05/2008, 13h40
  3. [IL]Instancier un objet à partir de son nom de classe
    Par neo.51 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/08/2007, 11h43
  4. [VB.NET] Obtenir un objet à partir de son nom
    Par bart64 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 31/12/2006, 12h37
  5. Créer une Form à partir de son nom
    Par Delphi-ne dans le forum Delphi
    Réponses: 11
    Dernier message: 11/12/2006, 17h39

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