DYNAMIC CONTROLS MANAGER - GÉREZ FACILEMENT VOS CONTRÔLES DYNAMIQUES [MODULE DE

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 9 mars 2007 à 01:11
Garlim Messages postés 10 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 30 juillet 2008 - 25 juil. 2008 à 18:36
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/41772-dynamic-controls-manager-gerez-facilement-vos-controles-dynamiques-module-de-classe

Garlim Messages postés 10 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 30 juillet 2008
25 juil. 2008 à 18:36
ok, je m'en doutais un peu :s
Mais merci pour les liens :D
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 juil. 2008 à 18:33
salut,
la FAQ est ici : http://www.vbfrance.com/doc/faq.aspx
elle contient le lien détaillant les sources : http://www.vbfrance.com/doc/faq.aspx#vb_src

et ma source (VB6), ne fonctionnera pas sous excel (VBA)
VBA n'a pas de gestion de contrôle par "groupe/index", aucune adaptation n'est possible

tu peux par contre gérer des ensembles de contrôles de même type, avec ce code de Mortalino par exemple : http://www.vbfrance.com/codes/EVENEMENT-MOUSEMOVE-SUR-SELECTION-CONTROLES-MEME-TYPE_37169.aspx
Garlim Messages postés 10 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 30 juillet 2008
25 juil. 2008 à 16:50
Je précise que je programme en VB(Excell 2003).
Garlim Messages postés 10 Date d'inscription vendredi 25 juillet 2008 Statut Membre Dernière intervention 30 juillet 2008
25 juil. 2008 à 16:37
Je suis très intéressé par ce code, ça correspond tout à fait à un développement que je souhaiterai faire. Par contre, je ne sais pas comment utiliser le zip! et j'ai pas trouvé de FAQ. Un coup de main?
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
4 avril 2007 à 09:49
Bonjour PCPT,
pas de suite..., ouaip, c'est juste que je n'ai pas eu le temps de regarder de nouveau le prog.
J'avais pensé aussi à un timer, donc dès que j'ai le temps...
Autrement, encore merci PCPT
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 avril 2007 à 11:34
drakkard -> pas de suite..., tu as bien reçu mon dernier MP?
une solution serait d'utiliser un timer à 10 ms qui serait enabled lors du click sur le combo. le reste du code (celui du combo) est alors à déplacer dans le timer. ne pas oublier de mettre le timer a disabled dans son évènement

++
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 mars 2007 à 13:00
suite du dial par MP, tu n'as pas du bien lire le précédent ;)
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
27 mars 2007 à 12:55
ouaip...
lorsque tu tests, prends en OS l'enterprise dans le combo1 et la licence terminant par AZSER dans le combo2, normalement l'erreur se produira si tu changes d'OS ( j'ai oublié de coder pour un changement de licence ). Au fait les licences sont fausses ;-))
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 mars 2007 à 12:49
avec la maj de la classe? (dans le doute...)
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
27 mars 2007 à 12:44
PCPT,
je viens de tester avec ta modif sur la form, j'ai toujours le message d'erreur mais à un autre endroit : Unload oCol.Item(i).Obj.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 mars 2007 à 12:15
j'ai pu voir oui, je t'ai répondu en MP et t'ai copié la form concernée modifiée sur ton FTP (avant de faire la MAJ)
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
27 mars 2007 à 11:50
Bonjour PCPT,



tu as pu voir mon pb ?
je viens de tester avec ton update, j'ai toujours la même erreur.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
27 mars 2007 à 11:41
petite maj de "Remove", permet de ne plus avoir à tester l'existance d'un objet avant de le détruire
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
26 mars 2007 à 21:56
message d'erreur bien étrange...
héberge ta source sur un ftp et donne-moi l'@ par MP, j'y jèterai u oeil ;)
++
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
26 mars 2007 à 17:10
Salut PCPT,



je viens de tester globalement mon prog qui utilise tes contrôles dynamiques,
j'ai un message d'erreur lors de la suppression des contôles
"Impossible de décharger dans ce contexte". J'ai utilisé ta technique est j'ai le même message d'erreur en débug c'est au niveau de Unload MyItem.Obj que le code bloque.

Petite idée ???

merci d'avance.
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
15 mars 2007 à 18:30
Tellement plus simple et plus logique...
Parfois j'ai tendance à chercher compliqué...
Merci
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 19:20
For i = AfDCM_Pic.GetLastID To 1 Step -1
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
14 mars 2007 à 19:14
Ok ok,

je te l'ai donné comme je l'utilise dans mon prog...
J'ai juste besoin à certains moments de virer les contrôles dynamiques ( depuis le dernier vers le premier ) d'ou ma solution...
Ma méthode n'est pas la meilleur de toute façon...
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 19:06
beh c'est pas bon ^^
si des objets sont déjà supprimés, tu ne commenceras pas à partir du dernier item.
exemple sur 10 items, le 5 est libre, tu ne supprimeras que les 1 2 3 4

ps : si le but est de supprimer uniquement à la fermeture (libérer la mémoire), la classe s'en charge déjà.
(autrement dit tu peux aussi juste faire un "set AfDCM_Lbl1 = nothing" puis réinstancier la classe)
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
14 mars 2007 à 18:52
Moi, je l'ai vu ainsi :

Do While AfDCM_Lbl1.GetFreeID > 1

AfDCM_Lbl1.Remove AfDCM_Lbl1.GetFreeID - 1

loop
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 18:48
même pas besoin du test count en fait....



Dim i As Integer
For i = 1 To AfDCM_Pic.GetLastID
If Not AfDCM_Pic.IsFreeID(i) Then AfDCM_Pic.Remove i
Next i
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 18:46
il faut d'abord savoir si l'item est vide. si n'est pas le cas, on vire.
çà donne...



Dim i As Integer, iTo As Integer
iTo = AfDCM_Pic.GetLastID
If iTo > 0 Then
For i = 1 To iTo
If Not AfDCM_Pic.IsFreeID(i) Then AfDCM_Pic.Remove i
Next i
End If

++ ;)
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
14 mars 2007 à 18:33
Ok compris...

pour moi aussi c'est ok pour CountObjectsAttached...
Ma question venait du fait que je voulais utiliser GetLastID pour supprimer ( en boucle ) le dernier élément, je vais le faire avec GetFreeID.

Ta source va me servir très rapidement...

Merci !!!
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 18:23
salut,
GetLastID renvoie le dernier ID de la collection
GetFreeID renvoie le prochain ID libre (item existant mais vide, ou le nouveau qui sera créé si ils sont tous occupés)
CountObjectsAttached renvoie le nombre "d'objets chargés et valides" dans la collection

"GetLastID ne change pas"
>>normal, on a détruit l'objet mais on garde l'item dans la collection (c'est le but même de la source, pouvoir communiquer avec un index inexistant sans avoir d'erreur à traiter, et pouvoir agir dynamiquement)


"CountObjectsAttached non plus"
>>pas normal du tout! je viens de tester (code ci-après), fonctionne nikel

"GetFreeID change"
>>normal, si tu supprimes le "4" il devient forcément le prochain libre


code (dans un bouton_click), beh juste
Debug.Print "LAST ID : " & AfDCM_Pic.GetLastID & vbTab & vbTab & "FREE ID : " & AfDCM_Pic.GetFreeID & vbTab & vbTab & "COUNT USED : " & AfDCM_Pic.CountObjectsAttached

trace avec l'exemple fourni, sans modif :
LAST ID : 73 FREE ID : 74 COUNT USED : 73

supression du 4 (sélection du 4e avec la souris puis bouton remove)

trace :
LAST ID : 73 FREE ID : 4 COUNT USED : 72

tout est bon...


même test avec la suppresion du dernier :
LAST ID : 73 FREE ID : 74 COUNT USED : 73
LAST ID : 73 FREE ID : 73 COUNT USED : 72

nikel aussi

dans quelles conditions ton "CountObjectsAttached" ne change pas?
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
14 mars 2007 à 16:39
Bonjour PCPT,

petit "trouble",
je viens de faire des tests ;
je réalise un GetLastID, un GetFreeID, CountObjectsAttached
je réalise un remove
GetLastID ne change pas
CountObjectsAttached non plus
GetFreeID change

Est-ce normal ?
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
14 mars 2007 à 01:00
salut,
une maj... il y avait une erreur pour la mise en page des contrôles (détail dans la source)
mortalino -> multi-sélection des picturebox ;)
drakkard -> les contrôles ne sont pas gérés par leur conteneur (ou leur nom).
par contre on vérifie quel est le conteneur (une frame, une picturebox, une form, etc..., voire "rien" pour les contrôles invisibles au runtime comme les timer, winsock et autre). de là on rattache l'objet généré au parent de l'objet "modèle", après sa création.

une scrollbar?... ce n'est pas le but de la classe. juste pour le code, tu peux jeter un oeil ici :
http://www.vbfrance.com/code.aspx?ID=30651
idem asimengo ;)

merci à tous pour vos comms et notes
++
PCPT [AFCK]
cs_drakkard Messages postés 99 Date d'inscription lundi 20 juin 2005 Statut Membre Dernière intervention 20 janvier 2009
13 mars 2007 à 18:23
Salut PCPT,
très intéressant.
Une petite idée en plus, un défilement vertical par un scrollbar sur des contrôles dynamiques.
Question, tu gères les contrôles en identifiant le nom du container ?
Si oui, en ajoutant un menu sur la form ; je crois qu'il y a problème, non ?

Autrement je pense m'en servir...
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
9 mars 2007 à 19:15
salut asimengo,
"un contrôle comme çà"... et bien non ;)
cette source servirait plutôt (pour suivre avec ton exemple) à référencer et à gérer ton usercontrol indéxé à 0, contenant lui-même un ou plusieurs contrôles uniques, ou des contrôles indéxés eux-même rattachés à une instance de la classe
cs_asimengo Messages postés 280 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 18 mars 2009
9 mars 2007 à 15:19
Pas mal.

Peut-être dans le même ordre d'idée j'ai écris un usercontrol (Frame + vscroll + hscroll + msforms2.combobox(0) + label(0)). En propriété largeur controle, hauteur controle, nombre de colonnes, nbre de lignes affichées (-1 pas de vscroll), largeur controle (-1 laisse decision) et hauteur (-1=laisse decision) et accès aux controles dans le frame par index. chaque controle pouvant apparaitre comme textbox ou combobox. Dispose des méthodes pour se construire sur la base d'un recordset, ...
Voila j'espérais tomber aussi sur quelque chose comme ça.

Sinon bien interessant.
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
9 mars 2007 à 02:45
touche ctrl, ok c'est noté, je verrai çà ce week-end ;)
peut-être aussi renvoyer une collection des objets chargés (uniquement).
rappel : la form fournie ne sert qu'à visualiser le traitement des objets afin de gérer facilement un ensemble de timers par exemple (donc pas besoin de multisélection physique).
la classe est néanmoins opérationnelle pour tout objet (groupe) physique, d'où pas mal de paramètres pour la mise en page

MyItem.Free est un booléen (pas instruction), et l'objet MyItem (servant de type/structure) est chargé dans la collection.
à chaque appel à un objet (ou presque, voir comments), MyItem récupère les valeurs de l'item de la collection (voir 2 dernières proc privées)
on sait donc ensuite que l'item est vide par
msgbox myitem.free ou msgbox (myitem.free=true)
ou
msgbox ocol.item(x).free

++ ;)
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
9 mars 2007 à 01:11
Salut PCPT,

très belle gestion des contrôles dynamiques, tout est géré est ça me semble très pratique ;)
Idée d'amélioration : faire en sorte que si la touche Ctrl est enfoncé lors du click sur plusieurs PictureBox, ils se mettent à plusieurs au rouge, afin de permettre une suppression simultannée.

Ensuite j'ai bien une question, tu crées tes propres Items dans la classe StructureDCM, donc depuis la classe principale, tu fais MyItem.Free, d'accord, je comprends.
Par contre, j'ai du mal à savoir comment la relation est faite depuis cette instruction :
oCol.Item(i).Free
Merci ;)

En tout cas, beau travail !
@++
Rejoignez-nous