URGENT : Unload (déchargement dynamique d'un contrôle en VB6)

Résolu
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009 - 3 mars 2006 à 10:21
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009 - 3 mars 2006 à 12:19
Bonjour,

Voilà avant de vous poser ma question, je vous situe le contexte. Il s'agit tout d'abord de VB6.

J'ai une combo box qui si on est à la première ligne sélectionnée de la combo correspond en face soit à 3 options buttons, à 2 options button quand la deuxième ligne de la combo est sélectionnée...

Je charge donc mes options buttons dynamiquement en fonction de la ligne de la combo qui est sélectionnée et du coups j'ai eussi besoin de décharger dynamiquement avant toute chose les option buttons avant d'en créer d'autres.

Mon problème est le suivant : VB refuse apparemment de laisser passer un ordre UNLOAD avec un évènement click de l'option button.

J'espère avoir été assez clair dans ma question. J'espère aussi être dans la bonne partie du forum. Dans le cas contraire, je vous prie de m'excuser.

Que faire pour solutionner ce problème ?

Cotmar

19 réponses

addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 juillet 2006
3 mars 2006 à 11:45
Essaie comme ceci :


Private Sub CboReference_Click()


timer1.Enabled = true


End sub


Private Sub Timer1_Timer()


timer2.enabled = false

On Error GoTo Errhandle
Dim IntCpt As Integer


For IntCpt = OptReference1.UBound To OptReference1.LBound + 1 Step -1
Unload OptReference1(IntCpt)
Next IntCpt

Select Case CboReference.ListIndex
Case 0
OptReference1(0).Caption = "option 1"
OptReference1(0).Visible = True

Load OptReference1(1)
OptReference1(1).Container = FrmTypeDeReference
OptReference1(1).Caption = "option 2"
OptReference1(1).Top = OptReference1(1).Top + OptReference1(1).Height + 10
OptReference1(1).Left = OptReference1(1).Left
OptReference1(1).Visible = True
Case 1
OptReference1(0).Caption = "option 1"
OptReference1(0).Visible = True

Load OptReference1(1)
OptReference1(1).Container = FrmTypeDeReference
OptReference1(1).Caption = "option 2"
OptReference1(1).Top = OptReference1(1).Top + OptReference1(1).Height + 10
OptReference1(1).Left = OptReference1(1).Left
OptReference1(1).Visible = True

Load OptReference1(2)
OptReference1(2).Container = FrmTypeDeReference
OptReference1(2).Caption = "option 3"
OptReference1(2).Top = OptReference1(2).Top + OptReference1(2).Height + 10
OptReference1(2).Left = OptReference1(2).Left
OptReference1(2).Visible = True
Case 2
OptReference1(0).Visible = False
Case 3
OptReference1(0).Visible = False
End Select

GoTo Exithandle

Errhandle:

Exithandle:

End sub
3
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 10:30
Voici mon code : (Le préfixe "Cbo" désigne la combo box et "Opt" les option button.
J'ai volontairement enlevé ce qui ne servait pas directement à l'esplication.

Private Sub CboReference_Click()
'========================================================================================================================
On Error GoTo Errhandle
Dim IntCpt As Integer


For IntCpt = OptReference1.UBound To OptReference1.LBound + 1 Step -1
Unload OptReference1(IntCpt)
Next IntCpt

Select Case CboReference.ListIndex
Case 0
OptReference1(0).Caption = "option 1"
OptReference1(0).Visible = True

Load OptReference1(1)
OptReference1(1).Container = FrmTypeDeReference
OptReference1(1).Caption = "option 2"
OptReference1(1).Top = OptReference1(1).Top + OptReference1(1).Height + 10
OptReference1(1).Left = OptReference1(1).Left
OptReference1(1).Visible = True
Case 1
OptReference1(0).Caption = "option 1"
OptReference1(0).Visible = True

Load OptReference1(1)
OptReference1(1).Container = FrmTypeDeReference
OptReference1(1).Caption = "option 2"
OptReference1(1).Top = OptReference1(1).Top + OptReference1(1).Height + 10
OptReference1(1).Left = OptReference1(1).Left
OptReference1(1).Visible = True

Load OptReference1(2)
OptReference1(2).Container = FrmTypeDeReference
OptReference1(2).Caption = "option 3"
OptReference1(2).Top = OptReference1(2).Top + OptReference1(2).Height + 10
OptReference1(2).Left = OptReference1(2).Left
OptReference1(2).Visible = True
Case 2
OptReference1(0).Visible = False
Case 3
OptReference1(0).Visible = False
End Select

GoTo Exithandle

Errhandle:

Exithandle:

End Sub

Cotmar
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 10:33
Salut,

N'essaierais tu pas de decharger un controle inserer manuellement dans la feuille (si oui c est impossible)
Les seuls objets qui peuvent etre decharge dynamiquement sont sont charger dynamiquement.

"UNLOAD avec un évènement click de l'option button." -> Si la condition de chargement est dechargement de tes option button est la ligne selectionne dans le combo, ne penses tu pas qu il serait plus judicieux de faire les LOAD et UNLOAD dans l'evenement click du Combo.

Ou est ce que ton programme pete: Un bout de code serait le bienvenue.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 10:34
Re,

OUps desole pour le code tu l as poste pendant que j ecrivait le message.

Voyons voir ca..

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
3 mars 2006 à 10:40
Bonjour,

Question con : pourquoi ne pas mettre tous les controls et ne rendre visble que ceux qui t'intéressent au moment voulu
tu met tes controls dans des frames séparés et le tour est joué...

-- Pourquoi faire simple quand on peut faire compliquer --
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 10:49
Bonjour,


Ce que tu dis est vrai, mais comme j'ai butté sur cette difficulté et que je suis quelqu'un d'un peut têtu, je me suis dit qu'il y avait sûrement une raison à ça.
En bref j'aimerais beaucoups me coucher moins bête ce soir que je ne l'étais ce matin au réveil.


Par ailleur ce faisant ce bout de code que j'ai commencé à faire devrait ainsi être être plus évolutiof une fois terminé. Ca si pour le momment j'ai seulement 3 option button au maximum, pourquoi demain n'y en aurait il pas 4 ou 5 ou 6...


Merci quand même pour vos réponses. J'espère que vous pourrez m'aider.



Cotmar
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 10:49
Re,

Interressant comme probleme.

Ce code fonctionne et pourtant il est guere different

Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 3
Call Load(OptReference1(i))
OptReference1(i).Left = OptReference1(0).Left
OptReference1(i).Top = OptReference1(i - 1).Top + OptReference1(i - 1).Height
OptReference1(i).Visible = True
Next
End Sub


Private Sub Command2_Click()
Dim i As Integer
For i = 1 To 3
OptReference1(i).Visible = False
Call Unload(OptReference1(i))
Next
End Sub

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
3 mars 2006 à 10:51
Bonne justification,

t'iras loins si tu persiste

-- Pourquoi faire simple quand on peut faire compliquer --
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 10:56
Merci à tous les deux.
Effectivement j'avais essayé de faire le UNLOAD sur un command button et dans ce cas ça marche. La syntaxe ou autre problème du même acabi ne serait donc pas en cause (?).
J'avoue que je ne sais pas trops comemnt solutionner ce problème.
Cotmar
0
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 juillet 2006
3 mars 2006 à 11:05
Il y a effectivement un problème lorsque c'est dans l'évènement click d'un ComboBox, j'ai déjà eu le tour.
Pour remédier à ce problème, on peut utiliser un timer d'une petite durée (genre 1 ms). Tu mets le code voulu dans le timer sans oublier de le désactiver tout de suite. Et dans la procédure CboReference_Click, tu actives le timer.
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 11:06
Re,

Ce qui est encore plus bizarre c est que c est juste dans le code du click du Combo que ca ne marche pas.
Pour teste j ai mis un timer et dans le code du timer j ai place exactement le meme code que dans le combo Click.
juste rajouter: Private Decharge as Boolean (comme variable du Form)

Private Sub Timer1_Timer()
If Decharge Then
'Le meme Code
Decharge = False
End if
End sub

Et dans le code du cbo...Click:
juste mettre: If Not Decharge then Decharge = True
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 11:08
Re,

> addamsmercredi : Ah ben du coup les grands esprits se rencontrent

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 11:14
Je vais donc essayer cette solution. Merci à tous.
Je vous tiens au courant. Il me semble que j'avais essayé le Timer, mais sans jouer sur la durée en fait.

Cotmar
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 11:38
En fait ça n'a pas l'air de marcher.
J'ai fais ceci :

Private BoolDecharge As Boolean (global au formulaire)

Private Sub CboReference_Click()
On Error GoTo Errhandle

If Not BoolDecharge Then BoolDecharge = True

Call Timer1_Timer

(ici idem que au dessus pour le SELECT CASE)

End Sub

Private Sub Timer1_Timer()
If BoolDecharge Then
'Le meme Code
Call prvDelOption
BoolDecharge = False
End If
Timer1.Enabled = False
End Sub

Private Sub prvDelOption()
Dim IntCpt As Integer


For IntCpt = OptReference1.UBound To OptReference1.LBound + 1 Step -1
Unload OptReference1(IntCpt)
Next IntCpt 'MyObject
End Sub

Et pour le Timer j'ai mis un intervalle de 1.

Cotmar
0
cs_eldim Messages postés 956 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 21 août 2014 1
3 mars 2006 à 11:40
Essai d'arreter le timer pendant l'exécution de ta procedure et relance le ensuite

-- Pourquoi faire simple quand on peut faire compliquer --
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
3 mars 2006 à 11:44
Salut,

Moi J avais tester avec un timer de 10ms toujours Enable a true

et je jouais avec la valuer du Booleen (Cf mon post)
Et ca marchait

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
0
addamsmercredi Messages postés 121 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 27 juillet 2006
3 mars 2006 à 12:04
En utilisant la ligne "Call Timer1_Timer", c'est normal que ça ne fonctionne pas puisque Call n'active pas le timer, ça sert seulement à appeler une procédure. En faisant cela, ça reste bloqué à cette instruction jusqu'à ce que le code soit fini et ça reste donc bloqué dans la procédure CboReference_Click pendant l'exécution du code.
Alors que le but est de sortir de la procédure CboReference_Click et d'exécuter le code seulement après.
Pour activer un timer, c'est Timer1.Enabled = true.
Et rien ne sert de faire fonctionner le timer en permanence donc en dehors, il faut toujours le laisser désactiver (timer1.Enabled = false).
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 12:16
Merci pour cette réponse.
Je viens de l'implémenter et ça marche. Houuurrraaa.
Merci les amis.
A bientôt.
Marco.

Cotmar
0
cs_cotmar Messages postés 71 Date d'inscription vendredi 13 septembre 2002 Statut Membre Dernière intervention 9 mars 2009
3 mars 2006 à 12:19
Oups j'avais pas vu la réponse déposée entre temps, qui me donne ce complément d'explication sur le timer.
Donc encore une fois un grand merci à tous.
A bientôt amigos.
Marco alias...

Cotmar
0
Rejoignez-nous