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

Delphi Discussion :

créer composant dynamiquement avec sa déclaration


Sujet :

Delphi

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut créer composant dynamiquement avec sa déclaration
    bonjour, je voudrais arriver a créer un composant dynamiquement, ca ca ne pose pas de problème mais
    je voudrais déclarer les composants au fur et à mesure de la création car je dois créer des composants en fonction d'un paramètre du programme qui pourrait aller jusque 100, je n'ai pas trop envie de déclarer 100 composants et ne pas tous les utiliser donc je voudrais arriver a déclarer via une boucle est possible ?
    merci d'avance

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    en fait ça va pour en créer plusieurs je ne dois pas les déclarer apparemment séparément.
    ce sont des checkbox, maintenant je voudrais arriver a savoir quels sont les checkbox qui ont été sélectionnés apparemment ce n'est pas placé dans un tableau
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm3.monboutonClick(Sender: TObject);
    var i,j:integer;
    begin
    j:=4;
    for i:=0 to 3 do
    begin {La fenêtre est propriétaire du nouveau bouton }
      chk := Tcheckbox.Create(Self);
      chk.Parent := jvgroupbox1;
       chk.Caption := 'check';
      chk.Left := 3;
      chk.Top:=j;
      j:=j+20;
    end;
    end;
    si tous les checkbox ont été sélectionnés alors chk est considéré à checked

  3. #3
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Tout a fait ... par contre tu ne garde aucune references des composants crees car a chaques tours de boucles tu ecrases l'ancienen reference par la nouvellement cree.

    Ce n'ets pas grave en soit (pb de fuite memoire) car une copie de l'instance est stocké dans la proprietee components du owner et controms du parent.

    Par contre pour les manipluer uliterieurement c'est quand meme moins pratique.

    Je te conseille donc d'utiliser un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Var chkTab : Array of TCheckBox;
     
    SetLength(chkTab, NbCheckBoxes);
    For i := 0 to NbCheckboxes-1 do
      Begin
      chktab[i] := TCheckbox.create(self);
      chkTab[i]. [...];
      End;

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    ok ca semble mieux je vais tester
    merci

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SetLength(chkTab, NbCheckBoxes);
    a quoi sert cette commande ?

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    ok j'ai compris je suppose que c'est la taille du tableau

  7. #7
    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
    Par défaut
    Tu peux aussi utiliser le TObjectList qui est fait pour ça
    pour plus d'infos
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  8. #8
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Mihalis
    ok j'ai compris je suppose que c'est la taille du tableau
    Tout a fait
    Ca alloue N element d'un tableau.
    Pour une gestion dynamique de l'allocation element par element en cours de boucle (cas ou la taille n'ets pas definie au debut) demande moi si tu trouves pas tout seul

  9. #9
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Pedro
    Tu peux aussi utiliser le TObjectList qui est fait pour ça
    pour plus d'infos
    LE probleme du TStringList, c'est que les objets sont stockés sous forme de TObjet et doivent etre casté avant utilisation.
    Donc si on a pas besoin de dynamisme (surtout en delete et encore ...) ou de tri, le tableau est quand meme bien plus simple a gerer.
    Quitte a creer des fonctions generiques Add, Remove, Insert ..... pour eviter ce type de code un peu redondant.

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    sur le onclose de la form dois-je supprimer le tableau ? on dirait que j'ai un probleme de mémoire et si oui comment ? merci d'avance

  11. #11
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    Code delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm3.monboutonClick(Sender: TObject);
    var i,j:integer;
    begin
    j:=4;
    for i:=0 to 3 do
    begin {La fenêtre est propriétaire du nouveau bouton }
      chk := Tcheckbox.Create(Self);
      chk.Parent := jvgroupbox1;
       chk.Caption := 'check';
      chk.Left := 3;
      chk.Top:=j;
      j:=j+20;
    end;
    end;
    @Clorish, il n'y a aucune fuite mémoire là, car la classe TCheckBox hérite de TComponent, que les instance sont créées avec l'instance de TForm3 comme propriétaire (Owner) donc, au pire Form3 tuera les instances (Mécanisme de freenotification). Or, TCheckBox hérite aussi de TControl, et la propriété parent est valorisée. Du coup, quand le parent (jvgroupbox1) moura, il tuera les checkboxs qu'il contient.
    Donc, double mécanisme de nettoyage, aucune fuite mémoire.

    Citation Envoyé par Clorish
    LE probleme du TStringList, c'est que les objets sont stockés sous forme de TObjet et doivent etre casté avant utilisation.
    Donc si on a pas besoin de dynamisme (surtout en delete et encore ...) ou de tri, le tableau est quand meme bien plus simple a gerer.
    Quitte a creer des fonctions generiques Add, Remove, Insert ..... pour eviter ce type de code un peu redondant.
    Mis à part le Cast obligatoire (quoiqu'on puisse hériter de TComponentList pour le faire une bonne fois pour toute), le reste est faux.
    1) On parle bien pas du TStringList, mais du TObjectList.
    2) Si on utilise le TComponentList, le mécanisme de FreeNotification est prise en charge, ce qui permet d'avoir une liste de composant (des checkbox par ex) qui se mettra à jour automatiquement lors de disparition d'éléments contenus.
    3) Avec TList, TObjectList, TComponentList, on peut parfaitement trier car il y a une méthodse Sort().
    4) Evidement, TList, TObjectList, TComponentList ont tous les méthodes classiques de liste (Add, REmove, Delete, Count, etc...

  12. #12
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par neilbgr
    @Clorish, il n'y a aucune fuite mémoire là, car la classe TCheckBox hérite de TComponent, que les instance sont créées avec l'instance de TForm3 comme propriétaire (Owner) donc, au pire Form3 tuera les instances (Mécanisme de freenotification). Or, TCheckBox hérite aussi de TControl, et la propriété parent est valorisée. Du coup, quand le parent (jvgroupbox1) moura, il tuera les checkboxs qu'il contient.
    Donc, double mécanisme de nettoyage, aucune fuite mémoire.
    Parfaitement !
    C'est d'ailleurs ce que je disais :
    Ce n'ets pas grave en soit (pb de fuite memoire) car une copie de l'instance est stocké dans la proprietee components du owner et controls du parent.
    mais c'est vrai que ma phrase n'etait peut etre pastrounée clairement

    Donc en resumé, ce n'ets pas une necessite de stocké les references car on evite le pb des fuites memoire grace au systeme de freenotification (merci pour le terme) mais c'est quand meme plus pratique niveau gestion des composants.

    Citation Envoyé par neilbgr
    Mis à part le Cast obligatoire (quoiqu'on puisse hériter de TComponentList pour le faire une bonne fois pour toute), le reste est faux.
    Pas tant que ca.
    Mais pour le cast, utiliser un TCompoentList permet de faciliter pas mal les chose en ayant deja un cast correct ... ca n'empeche que l'on ne peux pas acceder aux proprietees speciles du TCheckBox sans cast systematique.
    Ou alors on derive un TCheckListBox qui s'occupe de redefinir les proprietees/Methodes afin d'y inclure la cast ....
    Citation Envoyé par neilbgr
    1) On parle bien pas du TStringList, mais du TObjectList.
    Ben oui .... simple erreur de frappe
    Mais sur le principe, il me semble que les 2 derive de TList ....
    Citation Envoyé par neilbgr
    2) Si on utilise le TComponentList, le mécanisme de FreeNotification est prise en charge, ce qui permet d'avoir une liste de composant (des checkbox par ex) qui se mettra à jour automatiquement lors de disparition d'éléments contenus.
    3) Avec TList, TObjectList, TComponentList, on peut parfaitement trier car il y a une méthodse Sort().
    4) Evidement, TList, TObjectList, TComponentList ont tous les méthodes classiques de liste (Add, REmove, Delete, Count, etc...
    Je pense que la aussi il y a eu un probleme d'interpretation.
    En fait je parlais de la gestion par tableau.
    Je trouve les tableaux plus simples pour gerer les objet qu'ils contiennent, A moins de devoir effectuer des tris ou des suppressions dynamiques .. plustot casse pied avec les tabelaux.
    Mais cela n'est qu'un avis strictemetn personnel
    Quand je parlais de developper des fonctions add, remove, etc .. c'est la seule chose qui manque au tableaux par rapport au TList.
    Mais il est possible de creer uen serie d'api qui effectue ces operations sur des tablaux generiques pour eviter de les coder a chaques fois

  13. #13
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Citation Envoyé par Mihalis
    sur le onclose de la form dois-je supprimer le tableau ? on dirait que j'ai un probleme de mémoire et si oui comment ? merci d'avance
    Du fait que tes objets sont libérés automatiquement par leur owner car derivé de TComponent, tu n'a pas besoin de liberer chaques objets du tableau.
    Le tableau etant uen variable, na pas non plus besoin d'etre libéré. de toute facon, le programme se terminant, tout va etre detruit

    Par contre pour etre plus logique et propre, je te conseille quand meme d'expliciter la liberation des objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    For i := 0 to Length(chkTab)-1 do
      chkTab[i].free;
    Par contre pense bien a t'arreter en Size-1 car les tableaux dynamiuqes de N cases sont indexés de 0 a N-1

  14. #14
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Ci joint un petit programme que j'avais fait il y a 2 ans environ qui permet de lire les fichiers ini.
    Tous se fait par création dynamique de composants (Création d'onglet dans un PageControl, Création de scrollbox + label + edit , etc ...)

    Je pense que ca te permettra de voir un peu le fonctionnement de la création dynamique (Le programme est largement perfectible)

    Il nécessite d'avoir la JVCL (j'utilise une progressbar de cette suite de composant)
    Fichiers attachés Fichiers attachés
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  15. #15
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    tres bonne idee
    Je pensais justement dans les prochains mois creer un editeur d'ide et une classe de gestion dynamique d'ide

  16. #16
    Membre émérite
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Par défaut
    @Clorish, effectivement, je t'ai lu un trop rapidement.
    Mon avis reste que dès lors qu'on parle de liste/tableau de control (composant, ou objet) il est largement préférable de travailler avec au moins des composants et au moins une TComponentList pour ne pas avoir a géré les disparitions d'objets (et donc, Violation d'accès). L'approche avec les tableaux est difficilement extensible (si on a besoin un jour d'ajouter facilement ou pire de supprimer, comme tu l'as dit, ca devient fastidieux et surtout source d'erreur. Du coup, je préfère utiliser une encapsulation des tableaux faite par l'équipe Delphi, certainement moins incertaine !)
    En gros je préfère l'approche objet de la chose... Ce n'est que mon humble point de vue et mon gout.

  17. #17
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Comme toujours : Chaque technique a son champs d'application
    Le tout est de bien maitriser les avantages et inconvenient pour en tirer le meilleur parti

  18. #18
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    bonjour, merci de votre participation
    j'obtiens un message d'erreur
    First chance exception at $7C812A5B. Exception class EAccessViolation with message 'Access violation at address 00401CC5 in module 'Projecttimesheet.exe'. Write of address 0043CD7C'. Process Projecttimesheet.exe (4896)
    voici le code qui l'appele

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CreateForm(Tformmessage, formmessage);
    formmessage.showmodal;
    je l'appele a partir de dossier
    voici le code des forms
    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
      Application.Initialize;
      Application.CreateForm(Tformdemarrage, formdemarrage);
      Application.CreateForm(Tx, x);
      Application.CreateForm(TFormcreation_dossier, Formcreation_dossier);
      Application.CreateForm(TFormpr, Formpr);
      Application.CreateForm(TFormcp, Formcp);
    
      Application.CreateForm(TForm_do, Form_do);appelée ici
      Application.CreateForm(TFormmessage, Formmessage);
      Application.CreateForm(TFormclient, Formclient);
      Application.CreateForm(TFormfact, Formfact);
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TFormfrais_pr, Formfrais_pr);
      Application.CreateForm(TFormbdd, Formbdd);
      Application.CreateForm(Tgestion, gestion);
      Application.CreateForm(TFormcorr, Formcorr);
      Application.CreateForm(TFormfrais, Formfrais);
      Application.CreateForm(TFormmanuel, Formmanuel);
      Application.CreateForm(TFormfacturation, Formfacturation);
      Application.CreateForm(TForm_horaire, Form_horaire);
      Application.CreateForm(Tform_Etat, form_Etat);
      Application.CreateForm(TForm_provision, Form_provision);
      Application.CreateForm(TFormarchives, Formarchives);
      Application.CreateForm(TForm7, Form7);
      Application.CreateForm(TFormparametres, Formparametres);
    
      Application.Run;
    en fait j'appele formmessage et dedans j'utilise des variables de dossier

  19. #19
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Par défaut
    non en fait je n'ai pas de probleme a ce niveau la par contre est-il possible qu'il y ait maximum 9 checkbox ?
    lorsque j'en mets 10 j'obtiens l'erreur ci dessous

    First chance exception at $7C812A5B. Exception class EAccessViolation with message 'Access violation at address 00401CC5 in module 'Projecttimesheet.exe'. Write of address 0043CD7C'. Process Projecttimesheet.exe (4896)

  20. #20
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CreateForm(TForm_do, Form_do);appelée ici
      Application.CreateForm(TFormmessage, Formmessage);
    J'ai pas trop compris ce que tu appelles et quand tu l'appelles ... mais visiblement tu creer formmessage apres form_do.
    Si le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.CreateForm(Tformmessage, formmessage);
    formmessage.showmodal;
    est appeles dans le create de form_do il risque d'y avoir double emploi ....

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2013, 09h47
  2. Comment créer un site immobilier dynamique avec une base de données ?
    Par Alain troverti dans le forum Général Conception Web
    Réponses: 14
    Dernier message: 07/07/2006, 21h57
  3. Réponses: 1
    Dernier message: 04/05/2005, 11h43
  4. [DisplayTag] Créer un lien dynamique avec javascript
    Par babylone7 dans le forum Taglibs
    Réponses: 3
    Dernier message: 20/04/2005, 10h23
  5. Créer composant avec TQuery->pb suppression a la concepti
    Par marghett dans le forum Bases de données
    Réponses: 12
    Dernier message: 24/07/2004, 07h42

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