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

C++Builder Discussion :

Accéder à une variable à partir d'une chaine de caractère


Sujet :

C++Builder

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 92
    Points
    92
    Par défaut Accéder à une variable à partir d'une chaine de caractère
    Bonjour,

    a première vue mon titre n'est pas très clair, donc je vais vou expliquer ce que je souhaite obtenir

    j'ai un fichier xml qui a l'architecture suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <nom_prog>
    <nom_form> 
    <Label1 Type="TLabel" Champ="Caption" Texte="salut" Font_Size="6" Font_Name="Ms Sans Serif"\>
    <Memo1 Type="TMemo" Champ="Lines->Text" Texte="salut" Font_Size="6" Font_Name="Ms Sans Serif"\>
    <\nom_form>
    <\nom_prog>
    Je souhaite a partir de ce fichier, charger dynamiquement les différentes propriétés des composants.

    j'ai donc fait une boucle qui parcourt les forms de mon application, et les composants pour chaque form

    dans cette double boucle for, je fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      composant = form->ChildNodes->FindNode(glForm.at(j)->Components[i]->Name);
    cette ligne me permet de récupérer le noeud correspondant au composant de la forme en cours

    avec ce noeud, je souhaiterai recupérer le nom de la propriété à modifier pour modifier le texte du composants (donc dans le cas d'un tlabel, le caption et dans le cas d'un tmemo, le lines->text)

    donc je voudrai savoir si il est possible en récupérant le nom du champ du composants à modifier, en récupérant la nouvelle valeur, et le type du composant , comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      AnsiString type = composant->GetAttribute("Type");
    AnsiString champ = composant->GetAttribute("Champ");
    WideString nouveau_texte = composant->GetAttribute("Texte");
    de modifier la valeur du composant, un peu comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      ((type *) glForm.at(j)->Components[i])->champ = nouveau_texte;
    merci d'avance pour votre aide

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Je n'ai que la version BCB 3 Pro, avec laquelle je pense que c'est impossible à faire d'une manière simple. Il faudrait ici, avoir l'avis des autres membres pour les versions ultérieures de BCB.

    Donc si j'ai bien compris, l'exploitation qui en est faite ne va pas jusqu'à créer le programme, mais consiste simplement à modifier les propriétés d'un programme existant, pour le quel existe déjà une ou plusieurs forms pour lesquelles existent déjà un ensemble d'objets ?

    A noter qu'il existe TComponent::FindComponent(AnsiString Name) pour éviter la boucle de scrutation des Components mais ça peut ne pas être aussi simple si les propriétaires ne se limitent pas seulement à la form.
    En effet, tout TComponent peut détenir d'autres TComponent !

    Sinon... il existe probablement (au moins) deux moyens d'y parvenir :
    - au niveau utilisateur, mettre en place de quoi identifier des noms de propriété, ensuite, ça devient un jeu d'enfant !
    - au niveau concepteur, développer des classes supplémentaires apportant à l'objet de quoi modifier lui-même ses propriétés selon cette vision là.
    Donc ... voir si BCB le propose nativement à partir d'une version... !

    Par contre... ce développement risque d'être assez important si n'importe quelle propriété doit pouvoir être modifiée et ce, pour n'importe quel type d'objet !

    Il faudrait en savoir plus !

    A plus !

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 86
    Points : 92
    Points
    92
    Par défaut
    Tout d'abord merci henderson d'avoir pris le temps de lire et de réfléchir sur mon problème.

    Donc si j'ai bien compris, l'exploitation qui en est faite ne va pas jusqu'à créer le programme, mais consiste simplement à modifier les propriétés d'un programme existant, pour le quel existe déjà une ou plusieurs forms pour lesquelles existent déjà un ensemble d'objets ?
    tu a bien compris, par contre moi je n'ai pas compris ton discours (p-e suis-ej encore un peu léger niveau programmation :/)

    donc je vais tenter de donner un exemple plus précis, pour éclaicir les idées de tout le monde

    j'ai une application quelconque avec des forms et des composants simple sur chacunes de ces forms.

    lors de la création de la derniére form de cette application, j'utilise une méthode qui me permet de changer dynamiquement les captions, les lines->text, les hints, etc de tout les composants pouvant contenir du texte.

    pour cela, j'utilise ce bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Stockage des pointeurs de fiche
     std::vector<TForm *> form;
     if (Form1 != NULL)     form.push_back(Form1);
     
     
     gestLang->SetVectorForm(form);		
     gestLang->LoadLangue("Français") ; // le paramétre sera par la suite récupérer dans un fichier ini
     form.clear();
    et voici en gros le code de la fonction loadlangue :

    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
      XmlLib = LoadXMLDocument(nomFichier);
      docLib = XmlLib->DocumentElement;
     
      //Parcours des form de l'application
      for(int j=0; j< glForm.size() ;j++)
      {
     
        form = docLib->ChildNodes->FindNode(glForm.at(j)->Name);
        if (form != NULL)
        {
          glForm.at(j)->Caption =  form->GetAttribute("Titre");
     
          //Parcours des composants de la form courante
          for(int i=0; i<glForm.at(j)->ComponentCount; i++)
          {
     
            composant = form->ChildNodes->FindNode(glForm.at(j)->Components[i]->Name);
            if (composant != NULL)
            {
     
              //----------------------------Recuperation des TTntLabel---------------------------
              if (String(glForm.at(j)->Components[i]->ClassName()) == "TTntLabel")
              {
                tntlabel = dynamic_cast<TTntLabel*>(glForm.at(j)->Components[i]);
     
                if (composant->GetAttribute("Texte") != WideString(""))
                tntlabel->Caption     = composant->GetAttribute("Texte");
     
                if (composant->GetAttribute("Hint") != WideString(""))
                tntlabel->Hint        = composant->GetAttribute("Hint");
     
                if (composant->GetAttribute("Font_Name") != WideString(""))
                tntlabel->Font->Name  = composant->GetAttribute("Font_Name");
     
                if (composant->GetAttribute("Font_Size") != WideString(""))
                tntlabel->Font->Size  = composant->GetAttribute("Font_Size");
              }
            }
          }
        }
      }
    On voit que dans mon code, je n'ai géré que le cas du composant TTntLabel, et il faudrait que je le fasse pour tous les composants ... et je pense (j'éspére) qu'il y a une autre façon de faire.

    donc j'avais pensé à utiliser le code suivant sans savoir comment l'implémenter

    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
     
     XmlLib = LoadXMLDocument(nomFichier);
      docLib = XmlLib->DocumentElement;
     
      //Parcours des form de l'application
      for(int j=0; j< glForm.size() ;j++)
      {
     
        form = docLib->ChildNodes->FindNode(glForm.at(j)->Name);
        if (form != NULL)
        {
          glForm.at(j)->Caption =  form->GetAttribute("Titre");
     
          //Parcours des composants de la form courante
          for(int i=0; i<glForm.at(j)->ComponentCount; i++)
          {
     
            composant = form->ChildNodes->FindNode(glForm.at(j)->Components[i]->Name);
            if (composant != NULL)
            {
             AnsiString type = composant->GetAttribute("Type");
             AnsiString champ = composant->GetAttribute("Champ");
             WideString nouveau_texte = composant->GetAttribute("Texte");
     
             ((type *) glForm.at(j)->Components[i])->champ = nouveau_texte;
     
           }
         }
       }
     }
    donc si quelqu'un avait une idée

Discussions similaires

  1. [Débutant] appeler une variable à partir d'une chaine de caractères
    Par caoutchouc159 dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/04/2012, 11h56
  2. accéder à variable privée d'une classe à partir d'une autre classe
    Par restapa dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 05/08/2010, 08h56
  3. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  4. Réponses: 2
    Dernier message: 13/09/2007, 11h34
  5. Réponses: 7
    Dernier message: 15/11/2005, 10h14

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