Récupérer le contenu d'un contrôle créé dynamiquement [Résolu]

Messages postés
7
Date d'inscription
mardi 3 avril 2007
Dernière intervention
3 juin 2007
- 26 avril 2007 à 18:40 - Dernière réponse :
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
- 28 avril 2007 à 13:24
Bonjour,
je suis etudiant debutant en delphi et je fait une application dans le cadre d'un projet avec       delphi 7et je trouve un problemepour utiliser des composantes crées dynamiquement car elles ne sont pas reconnu lors de  l'execution j espere que je trouverai de l aide sur votre site merci .

en effet voila un petit bout de code
ou je veux recuperer le caption d'une label creer dynamiquement et dont la valeur est prise à partir d'un fichier XML 

l'affichage et l'extraction a partir de fichier xml se fait sans probleme

[file://\\panel \\panel] saisie n 'est pas creer dynamiquement
 for j := PanelSaisi.ComponentCount -1 downto 0 do
    PanelSaisi.Components[j].Free;


 [file://\\creation \\creation] dynamique de panel2

   Panel2 := TPanel.Create(PanelSaisi);
      with Panel2 do
      begin
        Parent := PanelSaisi;
        ParentColor := true;
        BevelOuter := bvNone;
         Align := AlTop;
        name := 'PanelBrique';     
       caption := '';
      end;

[file://\\creation \\creation] dynamique de label


      with TLabel.Create(Panel2) do
      begin
        Parent := Panel2;
        Align := alLeft;
        Font := PoliceTitre;

[file://\\exraction \\exraction] des données a partir de fichier XML 

        IdType := XMLProfil.DocumentElement.ChildNodes.
          Nodes[ScrollBoxBrique.Tag].Attributes[_type];
        Caption := FFOnctionsUtiles.GetChildNodeByNameAndAttr(
          XMLModele.DocumentElement, _type, 'id', IdType).AttributeNodes.
          Nodes['nom'].Text;
      end;

une fois j 'ecrit ce code je voulais recuperer la valeur de caption créé au dessus et ça j ai pas pu le faire

j ai ecrit ce code qui a generer une erreur d'exception  violation d'acces

[file://\\panel2 \\panel2] et labelType sont declarer comme etant tpanel et tlabel

 panel2:=(panelsaisie.FindChildControl('PanelBrique') as TPanel);
labeltype:=(panel2.FindChildControl('labeltype') as Tlabel);
{je suis presque certain que le probleme vient de ces deux lignes au dessus}

   [file://\\je \\je] colorerai un paneldecoration selon la valeur de label  prise dans le fichiers XML     
 if labeltype.caption = 'Composantes' then      
Paneldecoration.Color := clpurple;       
  if labeltype.caption = 'Graphe' then
Paneldecoration.Color := clyellow;
.....................................

j atend des propositions car je commence a me demoraliser
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
27 avril 2007 à 09:22
3
Merci
salut,

d'abord, bravo. tu poses très bien ta question (et c'est assez rare pour le souligner). en plus, c'est évident que tu t'es poser la question avant de nous la poser.

alors t'as trois façon principale:

1. chercher le compo à chaque fois
2. garder une ref sur le compo dans une var/tableau
3. ne PAS "lire" l'affichage pour connaître un etat.

à mon avis, prend la numéro trois.

1.
findchildcontrol et findcomposant prend en param le NOM. (.name) donc si tu ne l'as pas précisier lors de ton create dynamique...

    with TLabel.Create(Panel2) do
      begin
        Parent := Panel2;
        name := 'MonLblVar' + inttostr(i);
        Align := alLeft;

Note que ce type de méthode ne sont pas des plus rapide. (mais ça vas)
fait toujours un test "if assigned" avant de lire le caption!

2. lorsque tu crée ton compo, sauve le (ie: le pointeur) dans une var ou dans un tableau. Ensuite, pour relire le caption, bin t'as juste à faire MonPointeurSurLabel.Caption .
attention à ne pas lire le compo après qu'il soit détruit !

  MonLblTab[i] :=  TLabel.Create(Panel2); // tab de type TLabel
  with MonLblTab[i] do
      begin
        Parent := Panel2;


3. Relire l'affichage pour connaitre un valeur que tu connaissait avant... bin c'est pas une super méthode de prog. En plus, comme vas tu faire le jour ou tu traduit ton soft? ou change l'affichage (pour une image, text plus court, ...)

Pourquoi ne pas garder ton info dans une VAR (c'est fait pour ça non?) de type enum ? ou un set? au pire un string.

et si t'en as bcp, tu peux faire une class qui garde les options dans un tableau de bool ave des const. (ou n'import quel autre system qui convient à ton problème.)

Ou même une class qui garde les options en mémoire et gère l'affiche de ces options (garde un pointeur sur le compo qui l'affiche, descendant de TCustomPanel ou mieux de TFrame). comme ça tu peux mettre à jour ton affichage facilement (relire le fichier, changer les options, ...)

à toi de voir tes besoins. Ne perd pas 3 jours à faire une class pour tes options, si t'en à deux. mais ne perd pas une semaine à faire du code pour des recherche de compo si t'en a deux cents.

en esperant t'avoir aider.

bon code,

Loda

PS:
je sais pas si ça t'aide, mais jet un oeil:
http://www.delphifr.com/codes/GESTIONNAIRE-FICHIERS-CONFIGURATION_41171.aspx

Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.

Merci cs_Loda 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de cs_Loda
Messages postés
168
Date d'inscription
mercredi 8 octobre 2003
Dernière intervention
10 novembre 2008
26 avril 2007 à 20:40
0
Merci
Salut,

Voici la méthode que j'utilise, alors c'est peut être pas la plus optimisé mais elle fonctionne:

for iIndice := ComponentCount-1 downto 0 do
   if Component[iIndice] is TPanel then
      if TPanel(Component[iIndice]).Name = 'PanelBrique' then
          TPanel(Component[iIndice]).Color := clPurple;

Voila alors je sais que j'ai déjà fait avec FindComponent, mais je sais plus trop comment j'avais fait et je suis pas chez moi pour regarder mes sources.

Bonne Prog   
Commenter la réponse de moldov
Messages postés
122
Date d'inscription
mardi 3 avril 2007
Dernière intervention
15 novembre 2007
26 avril 2007 à 21:17
0
Merci
exemple:

 (FindComponent('Label1') as TLabel).Caption := 'toto';
Commenter la réponse de jelume
Messages postés
7
Date d'inscription
mardi 3 avril 2007
Dernière intervention
3 juin 2007
27 avril 2007 à 14:41
0
Merci
Merci beaucoup à tous ceux qui mon proposer des solutions ça m 'a été tres utile .

cher Loda j ai utiliser la solution 2(c la plus comprehensible pour moi ) que tu m a proposé et ça fonctionne bien merci .
Commenter la réponse de marvenjabloun
Messages postés
7
Date d'inscription
mardi 3 avril 2007
Dernière intervention
3 juin 2007
27 avril 2007 à 15:03
0
Merci
pour ceux qui rencontreront le meme probleme que moi voila comment j ai fait graçe a votre aide Loda :

 with TLabel.Create(Panel2) do
      begin
        Parent := Panel2;
        Align := alLeft;
        Font := PoliceTitre;
        IdType := XMLProfil.DocumentElement.ChildNodes.
          Nodes[ScrollBoxBrique.Tag].Attributes[_type];
        Caption := FFOnctionsUtiles.GetChildNodeByNameAndAttr(
          XMLModele.DocumentElement, _type, 'id', IdType).AttributeNodes.
          Nodes['nom'].Text;
          name := 'labelType';


\\ tablabeltype doit etre declaré comme un tableau de string   
       for k:=0 to 49 do
      tablabeltype[k]:=FFOnctionsUtiles.GetChildNodeByNameAndAttr(
          XMLModele.DocumentElement, _type, 'id', IdType).AttributeNodes.
          Nodes['nom'].Text;


          end;

 for k:=0 to 49 do


       if tablabelType[k] = 'Graphe' then


Paneldecoration.Color := clyellow
else


          if tablabelType[k] = 'Composantes' then
       
Paneldecoration.Color := clpurple;
       
   .................

ça fonctionne
Commenter la réponse de marvenjabloun
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
28 avril 2007 à 13:24
0
Merci
marvenjabloun > Pense à valider les réponses qui te conviennent (bouton "réponse acceptée").
Commenter la réponse de japee

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.