COMPOSANT DYNAMIQUE : COMMENT CODER POUR UN COMPOS NON ENCORE CRÉÉ

florenth - 18 avril 2006 à 20:15
lord948 Messages postés 34 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 19 mai 2009 - 8 janv. 2009 à 02:59
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/37127-composant-dynamique-comment-coder-pour-un-compos-non-encore-cree

lord948 Messages postés 34 Date d'inscription jeudi 17 janvier 2008 Statut Membre Dernière intervention 19 mai 2009
8 janv. 2009 à 02:59
bizarre !!!
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
22 avril 2006 à 21:29
--> Delphiprog
Je ne proposait cette méthode que pour la faire coonnaitre. J'utilise régulièrement la création dynamique et quand ce n'est que pour quelques objets j'utilise bien sur le transtypage et les objet existants ( TComponent.Components, TWinControl.Controls ).

Mais dans le cas d'un grand nombre avec des besoin particulier un héritage est bien mieux adapté.

PS : je viens te voir ici vu que l'on ne te vois pas beaucoup là ba. :wink:
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
21 avril 2006 à 23:31
Tout d'abord, je salue la présence de Nono40 parmi nous.
Comme la création dynamique de composants, leur sauvegarde et leur restauration à partir d'un flux fichier est un sujet sur lequel nous avons collaboré, j'invite les curieux à se rendre à cette adresse : http://tinyurl.com/k72zj

Toutefois, voici un point sur lequel je suis un peu moins d'accord quand il écrit "Tu dérives une classe descendante de TObjectList ou même un TComponentList et tu n'as plus rien à transtyper non plus."
Je trouve que c'est se donner beaucoup de mal quand on n'a besoin que de deux ou trois méthodes de TObjectList, TComponentList ou autres semblables. Il faut pratiquement surcharger toutes les méthodes alors qu'elles ont été définies comme statiques par les concepteurs de la VCL.
Dans ces cas là, je vous conseille d'opter pour la composition et non l'héritage.

Caribensila a écrit : "j'avais rencontré des problèmes pour traiter les événements des compos créés après un 'ReadComponentResFile' dans le code"
Quand tu affectes une méthode à un évènement, tu affectes en réalité un pointeur de méthode. Si au cours de la session courante de ton logiciel tu affectes Nil puis que tu affectes de nouveau une méthode à un évènement, pas de problème. Mais comme les exe sont relogeables et rien ne permet de dire que la session suivante s'effectuera avec les mêmes adresses mémoire, je te laisse imaginer les dégâts que cela pourrait causer si tu affectais une adresse qui ne serait alors plus valide !...
GPF garantie 8-S
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
21 avril 2006 à 19:21
--> Salut HURRYCANE
Moi, j'avais rencontré des problèmes pour traiter les événements des compos créés après un 'ReadComponentResFile' dans le code...

Par exemple, on 'Read' un TPanel contenant un TImage et :

MyImage.OnMouseDown := Action1Execute; // ne fonctionne pas!

Par contre, ça, ça fonctionne:

(MonPanel.Components[0] as TImage).OnMouseDown := Action1Execute;

Je ne comprends très bien pkoi.
Un exemple pourrait aider des débutants, je pense...
hurrycane Messages postés 117 Date d'inscription samedi 4 janvier 2003 Statut Membre Dernière intervention 19 juin 2009 1
21 avril 2006 à 18:37
les compos dynamique leurs création, leur maniements extra ou intra code ainsi que la gestion de leurs evenements dans le code est trop facile et je nai jamais trouvé de probleme la dedans !
je vais vous poster un exemple , faites moi svp un cahier des charges -- serieux je rigole pas !
@Caribensila, @Nono40 : Merci pour vos éclairages ! (je sais pas si le mot existe mais bon).
cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
21 avril 2006 à 00:15
"la création dynamique de compos est toujours d'actualité?"
Imagine une visionneuse de diapos miniatures, par exemple...

Exactement, et il y a des tas d'autres cas... Je rejoints DelphiProg sur les TObjectList. Tu dérives une classe descendante de TObjectList ou même un TComponentList et tu n'as plus rien à transtyper non plus.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
19 avril 2006 à 14:32
--> FLORENTH
"la création dynamique de compos est toujours d'actualité?"
Imagine une visionneuse de diapos miniatures, par exemple...

Mais bon! Je ne me défends pas, Je n'étais pas inspiré et c'est faiblard... Ok pour la cure de vitalines C++ lol
...Et ça a au moins le mérite de me remettre les idées en place.
Merci à tous.
petite erreur: delphipro = delphiprog mais vous m'avez compris n'est ce pas ?

JulioDelphi > Ton idée est pas mal (d'alleurs c'est celle que j'utilise ...) disons que ça évite le transtypage obligatoire que l'on a avec le TObjectList et autres. Mais, sinon, à part ce petit avantage, on ne peut pas manipuler la liste aussi facilement.
Mais entre nous, on peut le dire, la liste de composants, on la laisse dans l'ordre du début.

++
"on ne peut pas faire comme tu dis" : ah mais je suis d'accord avec toi. Seulement, avec ton code, j'ai eu l'impression que tu creeais un panel pour y mettre un edit. C'est pour cela que je t'ai dit ça.

Mais pour le reste on est d'accord, tu te sers soit du conteneur (parent) pour acceder aux objets, soit, si ceux cis te gènent dans ton code, tu prend, comme l'a dit Delphipro, un TObjectList ou un TComponentList.

Mais, là, et je ne voudrais pas polémiquer sur le sujet, mais je n'ai jamais eu besoin de creer plein (en tout cas, un nombre incconnu) de composants dynamiquement,alors je me demandais si la création dynamique de compos est toujours d'actualité ?
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 avril 2006 à 23:39
Quand on ne connait pas à l'avance le nombre de composants qui seront créés à l'exécution, l'utilisation de listes est encore meilleure que les tableaux quand bien même ces derniers seraient dynamiques.
La VCL propose un certain nombre de conteneurs tels que TList, TObjectList ou encore TComponentList.
D'ailleurs, la propriété Components des objets dits "containers" n'est-elle pas une liste de références ?
Caribensila, je trouve que ta forme baisse ces derniers temps ;o)
Une petite cure de vitamines te ferait le plus grand bien, lol.
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
18 avril 2006 à 22:07
Ok, florenth. Mon exemple est sans doute mal choisi. Mais si tu ne connais pas à l'avance le nombre de compos qui seront créés, on ne peut pas faire comme tu dis...
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
18 avril 2006 à 21:07
Salut, j'ai pour habitude (bonne ou mauvaise, dites le moi) de creer des Array of TEdit [0..1] par exemple et donc de les creer comme ça :
for i:=0 to 1 do
begin
NewEdit[i] := TEdit.Create(Panel1);
NewEdit[i].Parent := Panel1;
NewEdit[i].Left := 4;
NewEdit[i].Top := 4+(i*20); // pour les espacer
end;

puis je fais appel a eux comme ceci :
NewEdit[x].Text := 'Bonjour !';

voila. fais-je bien ou pas ?
lol
Pourquoi faire sompliqué quand on peut faire simple ?
Ttu mets ta variable NewEdit dans la section "public" de la déclaration de la fiche et hop ! plus de problèmes !

Et puis ton cas ne marche que pour un panel => un edit.
C'est plus trop dynamique tout ça puisque le panel doit déjà être présent.

Allez, comme je dis toujours: si tu ne te plantes pas, tu ne pousseras jamais ...
Rejoignez-nous