DYNAMIC CONTROLS MANAGER - GÉREZ FACILEMENT VOS CONTRÔLES DYNAMIQUES [MODULE DE
mortalino
Messages postés6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 2011
-
9 mars 2007 à 01:11
Garlim
Messages postés10Date d'inscriptionvendredi 25 juillet 2008StatutMembreDernière intervention30 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.
Garlim
Messages postés10Date d'inscriptionvendredi 25 juillet 2008StatutMembreDernière intervention30 juillet 2008 25 juil. 2008 à 16:50
Je précise que je programme en VB(Excell 2003).
Garlim
Messages postés10Date d'inscriptionvendredi 25 juillet 2008StatutMembreDernière intervention30 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 27 mars 2007 à 12:49
avec la maj de la classe? (dans le doute...)
cs_drakkard
Messages postés99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 janvier 2009 15 mars 2007 à 18:30
Tellement plus simple et plus logique...
Parfois j'ai tendance à chercher compliqué...
Merci
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 14 mars 2007 à 19:20
For i = AfDCM_Pic.GetLastID To 1 Step -1
cs_drakkard
Messages postés99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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.
merci à tous pour vos comms et notes
++
PCPT [AFCK]
cs_drakkard
Messages postés99Date d'inscriptionlundi 20 juin 2005StatutMembreDernière intervention20 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és280Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention18 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és13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 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és6786Date d'inscriptionvendredi 16 décembre 2005StatutMembreDernière intervention21 décembre 201118 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 ;)
25 juil. 2008 à 18:36
Mais merci pour les liens :D
25 juil. 2008 à 18:33
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
25 juil. 2008 à 16:50
25 juil. 2008 à 16:37
4 avril 2007 à 09:49
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
1 avril 2007 à 11:34
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
++
27 mars 2007 à 13:00
27 mars 2007 à 12:55
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 ;-))
27 mars 2007 à 12:49
27 mars 2007 à 12:44
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.
27 mars 2007 à 12:15
27 mars 2007 à 11:50
tu as pu voir mon pb ?
je viens de tester avec ton update, j'ai toujours la même erreur.
27 mars 2007 à 11:41
26 mars 2007 à 21:56
héberge ta source sur un ftp et donne-moi l'@ par MP, j'y jèterai u oeil ;)
++
26 mars 2007 à 17:10
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.
15 mars 2007 à 18:30
Parfois j'ai tendance à chercher compliqué...
Merci
14 mars 2007 à 19:20
14 mars 2007 à 19:14
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...
14 mars 2007 à 19:06
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)
14 mars 2007 à 18:52
Do While AfDCM_Lbl1.GetFreeID > 1
AfDCM_Lbl1.Remove AfDCM_Lbl1.GetFreeID - 1
loop
14 mars 2007 à 18:48
Dim i As Integer
For i = 1 To AfDCM_Pic.GetLastID
If Not AfDCM_Pic.IsFreeID(i) Then AfDCM_Pic.Remove i
Next i
14 mars 2007 à 18:46
çà 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
++ ;)
14 mars 2007 à 18:33
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 !!!
14 mars 2007 à 18:23
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?
14 mars 2007 à 16:39
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 ?
14 mars 2007 à 01:00
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]
13 mars 2007 à 18:23
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...
9 mars 2007 à 19:15
"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
9 mars 2007 à 15:19
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.
9 mars 2007 à 02:45
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
++ ;)
9 mars 2007 à 01:11
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 !
@++