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

Composants VCL Delphi Discussion :

Lister les propriétés d'un composant


Sujet :

Composants VCL Delphi

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Lister les propriétés d'un composant
    Bonjour,

    -----------------------------------------------------------------
    VERSION SIMPLE DE MA QUESTION :

    Existe-il une fonction permettant de récupérer (ex: dans un tableau quelconque ou autre chose) la liste des propriétés d'un composant ?

    -----------------------------------------------------------------
    VERSION DETAILLEE DE MA QUESTION :

    je doit convertir dynamiquement a l'execution, les composants "delphi standard" (a savoir TButton etc...) en d'autres type de composants (ex: je veux obtenir des composants TMS donc un TButton deviendra dans ma form principale un TAdvButton).

    Je m'explique, en fait j'ai une form deja existante (appellont là Form1) qui utilise des composants delphi standard (TPanel, TButton, etc...), cette form je la crée au lancement de mon programme mais je ne l'affiche pas. ensuite j'ai une 2ieme Form (appellont là Form2) qui elle est vierge de tout composants mais visible.
    Mon objectif est donc de recréer sur cette Form2, tout les composants de la Form1 mais en utilisant les équivalent TMS de ces composants.

    Actuellement je réalise ceci en ayant au préalable listé sur un bout de papier toutes les propriétés des composants delphi standard (ex: TButton) et leur équivalent en composant TMS (ex: le TButton.parent = TadvButton.parent, etc...). Le tout en laissant de coté les éventuelles propriétés d'un TButton qui n'existerait pas dans un TadvButton.

    Je réalise donc des copies conforme de TButton en TadvButton (les propriétés Top, Left, Width, Caption, Name, etc... sont identiques, a l'exception du Parent qui bien evidemment est Form2 à la place de Form1).


    Maintenant que vous connaissez mon objectif, voici ma question :

    Plutot que de coder tout pleins de lignes de code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if Form1.Components[i].ClassType = TButton then
        begin
          AdvButton := TAdvButton.Create(Form2);
          AdvButton.Parent := Form2;
          AdvButton.Name := TButton(Form1.Components[i]).Name;
     
    etc... pour toutes les propriétés
    Existe-il une fonction permettant de récupérer (ex: dans un tableau quelconque ou autre chose) la liste des propriétés d'un composant ?

    Cela me permettrait en effet d'alléger considérablement mon code si je pouvait mettre en place une fonction générale, qui, apres quelques tests tout simple, pouvait retourner le composant TMS équivalent au composant (quasi)inconnu passé en paramêtre.

    Merci d'avance a vous tous pour votre attention et votre aide.

  2. #2
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Bonjour.

    Je ne suis pas sur d'avoir bien compris le problème, mais voici.
    Je pense que la méthode Assign est la solution. L'aide DELPHI explique bien "Copie le contenu d'un autre objet similaire".

    Autrement dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Var
        Bouton2 : TButton;
     
    begin
          Bouton2 := TButton.Create(Form2);
          Bouton2.Assign(Bouton1);
     
    end;
    A+

  3. #3
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par bambino
    Existe-il une fonction permettant de récupérer (ex: dans un tableau quelconque ou autre chose) la liste des propriétés d'un composant ?
    Pour cela il faut utiliser les RTTI et TypeInfo (unité Typinfo) exemple non fonctionnel pour démarrer:
    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
     
    PROCEDURE Ajoute_Composant(AObject:TObject);
      VAR
        PropList:TypInfo.PPropList;
        Type_Data:TypInfo.PTypeData;
        Nb_Property, i_Property : SmallInt;
        Nom_Propriete,Valeur_Propriete:String;
        Type_Propriete:TType_Propriete;
     
     
      BEGIN { Ajoute_Composant }
        //N.B. GetPropList fait l'allocation mémoire
        Nb_Property:=TypInfo.GetPropList(AObject,PropList);
     
        FOR i_Property:=0 TO Nb_Property-1 DO
          BEGIN
            // Faudra gérer les tkClass
            IF (PropList^[i_Property].PropType^.Kind in [tkString, tkLString, tkWString]) THEN
              BEGIN
                Nom_Propriete:=PropList^[i_Property]^.Name;
               Valeur_Propriete:=TypInfo.GetStrProp(AObject,PropList^[i_Property]);
    Avec le TypInfo on peut retrouvé toutes les propriétées les fonctions..... il faut y aller mollo avec des pincetttes, ce n'est pas très compliqué

    Voir TypInfo.pas pour plus d'informations

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Philippe Gormand => Non je suis désolé cela reviendrait a faire une copie d'un TButton vers un TButton hors je veux pouvoir faire une copie d'un TButton vers un TadvButton (composant TMS).
    Merci cependant d'avoir prit la peine de répondre a mon post.

    Eric.H => Merci beaucoup!!! ça marche impec !
    Vraiment merci beaucoup, tu viens de reduire mon code de 15000 lignes
    Grand Grand merci!

    la syntaxe exacte est ceci :

    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
     
    uses Typinfo;
    ...
     
    procedure TForm1.DelphiFormToTMSForm(DelphiForm: TForm);
    var
      i, j: Integer;
      PropList: TypInfo.PPropList;
      Type_Data: TypInfo.PTypeData;
      Nb_Property, i_Property: SmallInt;
      Nom_Propriete, Valeur_Propriete: string;
    begin
      for i := 0 to DelphiForm.ComponentCount - 1 do
      begin
        //N.B. GetPropList fait l'allocation mémoire
        PropList := nil;
        Nb_Property := TypInfo.GetPropList(DelphiForm.Components[i], PropList);
        for i_Property := 0 to Nb_Property - 1 do
        begin
          if (PropList^[i_Property].PropType^.Kind in
              [ tkInteger, tkChar, tkEnumeration, tkFloat,
                tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString, tkInt64 ]) then
          begin
            Nom_Propriete := PropList^[i_Property]^.Name;
            Valeur_Propriete := TypInfo.GetStrProp(DelphiForm.Components[i], PropList^[i_Property]);
              ShowMessage(Nom_Propriete);
          end;
        end;
      end;
    end;

  5. #5
    Membre actif
    Avatar de Eric.H
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 220
    Points : 286
    Points
    286
    Par défaut
    Citation Envoyé par bambino
    ça marche impec !
    Les sources de Delphi son une mine d'informations, si on prend le temps

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par bambino
    Eric.H => Merci beaucoup!!! ça marche impec !
    Vraiment merci beaucoup, tu viens de reduire mon code de 15000 lignes
    Grand Grand merci!
    Ta joie ne doit pas te faire oublier de cliquer sur

  7. #7
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Ravis de savoir que tu as résolu ton problème.

    Chacun participe selon sont expérience et (le peu) de ce qu'il sait.

    A+


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

Discussions similaires

  1. Réponses: 11
    Dernier message: 27/03/2008, 10h47
  2. [Styles]lister les propriétés des styles
    Par peyo_le_fou dans le forum Word
    Réponses: 6
    Dernier message: 16/05/2007, 13h33
  3. Lister les propriétés d'un objet
    Par DWade dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/10/2006, 13h09
  4. RTTI:Lister les propriétés d'une interface COM
    Par zeprogrameur dans le forum Langage
    Réponses: 10
    Dernier message: 09/11/2005, 17h06

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