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

cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 10:21 - Dernière réponse : cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention
- 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
Afficher la suite 

19 réponses

addamsmercredi 121 Messages postés dimanche 3 octobre 2004Date d'inscription 27 juillet 2006 Dernière intervention - 3 mars 2006 à 11:45
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 10:30
0
Utile
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
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 10:33
0
Utile
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
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 10:34
0
Utile
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
cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention - 3 mars 2006 à 10:40
0
Utile
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 --
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 10:49
0
Utile
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
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 10:49
0
Utile
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
cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention - 3 mars 2006 à 10:51
0
Utile
Bonne justification,

t'iras loins si tu persiste

-- Pourquoi faire simple quand on peut faire compliquer --
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 10:56
0
Utile
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
addamsmercredi 121 Messages postés dimanche 3 octobre 2004Date d'inscription 27 juillet 2006 Dernière intervention - 3 mars 2006 à 11:05
0
Utile
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.
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 11:06
0
Utile
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
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 11:08
0
Utile
Re,

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

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 11:14
0
Utile
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
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 11:38
0
Utile
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
cs_eldim 961 Messages postés lundi 30 mai 2005Date d'inscription 21 août 2014 Dernière intervention - 3 mars 2006 à 11:40
0
Utile
Essai d'arreter le timer pendant l'exécution de ta procedure et relance le ensuite

-- Pourquoi faire simple quand on peut faire compliquer --
jrivet 7401 Messages postés mercredi 23 avril 2003Date d'inscription 6 avril 2012 Dernière intervention - 3 mars 2006 à 11:44
0
Utile
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
addamsmercredi 121 Messages postés dimanche 3 octobre 2004Date d'inscription 27 juillet 2006 Dernière intervention - 3 mars 2006 à 12:04
0
Utile
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).
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 12:16
0
Utile
Merci pour cette réponse.
Je viens de l'implémenter et ça marche. Houuurrraaa.
Merci les amis.
A bientôt.
Marco.

Cotmar
cs_cotmar 71 Messages postés vendredi 13 septembre 2002Date d'inscription 9 mars 2009 Dernière intervention - 3 mars 2006 à 12:19
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.