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éer une instance d'objet depuis son nom de classe


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Créer une instance d'objet depuis son nom de classe
    Bonjour,

    Je souhaite créer un objet depuis son nom.

    Ex : j'ai l'infos dans une variable maClassNameEnString = 'TBidule';

    Est-ce qu'il serait possible de créer un objet directement depuis maClassNameEnString?

    En gros un truc comme maClassNameEnString.Create
    (Lol je sais que ça ne marche pas ça. C'est pour faire comprendre l'idée.)

    Pour le moment je dois passer par une factory qui fait :
    If maClassNameEnString = 'TBidule' then
    Result := TBidule.Create

    Je voudrai donc m'affranchir de cette factory.

    Est ce que quelqu'un à une idée?

    merci d'avance.

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Merci d'utiliser la fonction de recherche. Quelques messages plus bas :
    Création d'objet dynamique (à partir du nom de la classe)
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Oui je viens de lire le message.

    On y conseil d'utiliser :
    Instance := GetClass('TUnObjet').Create;

    Pour utiliser cette méthode il faut d'abord faire un RegisterClass(AClass : TPersistent)

    Ce qui m'embête dans l'histoire c'est que mon objet hérite de TObject eet que ça pose des problèmes qu'il soit en TPersistent.

    Est-ce qu'il y aurait une astuce?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 549
    Points : 25 119
    Points
    25 119
    Par défaut
    C'est à partir du Persistant qu'il y a publication des propriétés, cela n'a pas d'incidence, je te conseille même de partir du TComponent pour bénéficier de la Gestion de la mémoire via un Owner, c'est très pratique ...

    Sinon, tu peux faire ton propre RegisterClass, voir la construction de MetaClasse ou Référence de Classe, avec "class of"

    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
    type
      TMachinType = (mtTruc, mtBidule, mtChose);
     
    const
      Machin_NAMES: array[TMachinType] of string = ('Truc', 'Bidule', 'Chose');
     
    const
      Machin_CLASSES: array[TMachinType] of TClass = (TObjectTruc, TObjectBidule, TObjectChose);
     
     
    class function TMachinManager.GetEchantMachin(const MachinName: string): TClass;
    var
      iMachin: TMachinType;
    begin
      for iMachin := Low(TMachinType) to High(TMachinType) do
      begin
        if SameText(MachinName, Machin_NAMES[iMachin]) then
        begin
          Result := Machin_CLASSES[iMachin];
          Exit;
        end;
      end;
     
      Result := nil;
    end;
    L'avantage de cette construction, via un tableau de constantes chaines, c'est que tu peux afficher les libellés à l'utilisateur, et réagir à sa demande, cela reste plus clair que d'afficher le ClassName, utilise par exemple pour lister des Maladies ou Virus, qui contiennent des caractères accentués qu'il faut afficher pour le logiciel mais interdit dans un nom de classe ... mais on peut aussi passer par ClassName directement si il n'y a que manipulation en interne ...
    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

Discussions similaires

  1. Appeler une méthode d'objet via son nom à l'exécution
    Par Nono40 dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/02/2013, 11h51
  2. Réponses: 4
    Dernier message: 11/01/2012, 17h59
  3. [PHP 5.0] Créer une instance d'objet dynamique
    Par _jey_ dans le forum Langage
    Réponses: 1
    Dernier message: 07/06/2010, 17h45
  4. Réponses: 10
    Dernier message: 26/06/2008, 11h25
  5. Réponses: 4
    Dernier message: 09/02/2007, 19h00

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