Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Lubie de VB

4 réponses
Avatar
Yves Boyer
mymsg.frm me sert de MsgBox.
Elle est équipée de 2 boutons "Oui" et "Non" codés comme suit :
Private Sub cmdnon_Click()
mgret = 7
Unload Me
End Sub

Private Sub cmdoui_Click()
mgret = 6
Unload Me
End Sub

mgret est une variable publique (Integer).
mymsg.frm est appelée par ma fonction ShowMsg ci-dessous :
Public Function ShowMsg(A$, Optional B%, Optional C$) As Integer
Msg = A
If Not IsMissing(B) Then mgIt = B
If Not IsMissing(C) Then mgtit = C
mymsg.Show 1
ShowMsg = mgret
End Function

A un 1er appel, je réponds "Oui" (donc cmdoui_Click).
A un 2ème appel, je réponds "Non" (donc cmdnon_Click).
Au 3ème appel mymsg n'apparaît pas et VB me dit :
<Erreur d'exécution '400':
Feuille déjà affichée; impossible d'afficher modalement.>

Quel culot quand on voit que mes cmdnon_Click et cmdoui_Click lui ont dit
Unload Me !
D'autant plus que cet incident ne se reproduit pas si, dans ShowMsg, j'écris
<Unload mymsg> avant <mymsg.Show 1>

Alors comment expliquez-vous cette lubie de VB ?

Yves Boyer

4 réponses

Avatar
Jean-Marc
"Yves Boyer" a écrit dans le message de
news:
mymsg.frm me sert de MsgBox.
Elle est équipée de 2 boutons "Oui" et "Non" codés comme suit :
Private Sub cmdnon_Click()
mgret = 7
Unload Me
End Sub

Private Sub cmdoui_Click()
mgret = 6
Unload Me
End Sub

mgret est une variable publique (Integer).
mymsg.frm est appelée par ma fonction ShowMsg ci-dessous :
Public Function ShowMsg(A$, Optional B%, Optional C$) As Integer
Msg = A
If Not IsMissing(B) Then mgIt = B
If Not IsMissing(C) Then mgtit = C
mymsg.Show 1
ShowMsg = mgret
End Function

A un 1er appel, je réponds "Oui" (donc cmdoui_Click).
A un 2ème appel, je réponds "Non" (donc cmdnon_Click).
Au 3ème appel mymsg n'apparaît pas et VB me dit :
<Erreur d'exécution '400':
Feuille déjà affichée; impossible d'afficher modalement.>

Quel culot quand on voit que mes cmdnon_Click et cmdoui_Click lui ont dit
Unload Me !
D'autant plus que cet incident ne se reproduit pas si, dans ShowMsg,


j'écris
<Unload mymsg> avant <mymsg.Show 1>

Alors comment expliquez-vous cette lubie de VB ?




Hello,

impossible de reproduire ton probleme.
Voici comment j'ai fait:

voici ma form principale:
***
Option Explicit
Dim mgit As String
Dim mgtit As String
Dim msg As String

Private Sub Command1_Click()
Call ShowMsg("hh")
End Sub
Public Function ShowMsg(A$, Optional B%, Optional C$) As Integer
msg = A
If Not IsMissing(B) Then mgit = B
If Not IsMissing(C) Then mgtit = C
mymsg.Show 1
ShowMsg = mgret
End Function
***

la forme mymsg
***
Option Explicit

Private Sub cmdnon_Click()
mgret = 7
Unload Me
End Sub

Private Sub cmdoui_Click()
mgret = 6
Unload Me
End Sub
***


et le module pour la variable publique
***
Option Explicit
Public mgret As Integer
****

A priori, le probleme vient d'ailleurs;


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Salut,

En fait tu n'es jamais certain que ta feuille soit déchargée, même si tu
l'unload. Il faut la mettre à nothing impérativement.

Evidemment, tu ne peux pas la mettre à nothing depuis elle-même ; donc tu
dois avoir une fonction externe.

J'ai moi aussi développé ma msgbox ; voici ma stratégie :

Dans la feuille elle-même une fonction Use, qui reçoit des paramètres. Dans
Use, je me montre moi-même en modal (le code de la fonction Use s'arrête
alors ici, tant que la feuille n'est pas cachée). Lorsque la feuille est
cachée par un Me.hide lors du clic dans un bouton de la feuille, le code
repart. Et on affecte une valeur à Use (cela évite d'avoir une variable
globale)...




Dans un module public...

Public Function BoxInfo&(ByVal Message As String, Optional Buttons As
String)

Dim f As fBox 'fBox est MA msgbox propriétaire

Set f = New fBox 'pour pouvoir afficher plusieurs msgbox en même temps

BoxInfo = f.Use(Message, Buttons, info) 'on appelle la fonction Use de la
feuille elle-même, et elle renvoie une valeur (inutilisée ici)
Unload f
Set f = Nothing 'c'est là que la feuille est vraiment déchargée

End Function




maintenant la fonction Use de la feuille...

Public Function Use(ByVal Text As String, Optional ByVal Buttons As String,
Optional ByVal Mode As cfBoxUseMode) As Long

'ici il y a tout un code pour paramétrer la feuille

show vbModal 'le code s'arrête ici tant que la feuille est visible

Use = m_back 'Use renvoie l'index du bouton sur lequel on a cliqué

End Function




Puis le code d'un des boutons de la feuille...

Private Sub b_Click(Index As Integer) 'index car il y a plusieurs boutons

m_back = Index 'm_back est une variable locale qui me sera utile pour
savoir sur quel bouton on a cliqué dans Use
Me.Hide 'permet au code de la fonction Use de reprendre

End Sub


Hope this helps...

Christian


"Jean-Marc" a écrit dans le message de
news:41795c1b$0$22747$
"Yves Boyer" a écrit dans le message de
news:
> mymsg.frm me sert de MsgBox.
> Elle est équipée de 2 boutons "Oui" et "Non" codés comme suit :
> Private Sub cmdnon_Click()
> mgret = 7
> Unload Me
> End Sub
>
> Private Sub cmdoui_Click()
> mgret = 6
> Unload Me
> End Sub
>
> mgret est une variable publique (Integer).
> mymsg.frm est appelée par ma fonction ShowMsg ci-dessous :
> Public Function ShowMsg(A$, Optional B%, Optional C$) As Integer
> Msg = A
> If Not IsMissing(B) Then mgIt = B
> If Not IsMissing(C) Then mgtit = C
> mymsg.Show 1
> ShowMsg = mgret
> End Function
>
> A un 1er appel, je réponds "Oui" (donc cmdoui_Click).
> A un 2ème appel, je réponds "Non" (donc cmdnon_Click).
> Au 3ème appel mymsg n'apparaît pas et VB me dit :
> <Erreur d'exécution '400':
> Feuille déjà affichée; impossible d'afficher modalement.>
>
> Quel culot quand on voit que mes cmdnon_Click et cmdoui_Click lui ont


dit
> Unload Me !
> D'autant plus que cet incident ne se reproduit pas si, dans ShowMsg,
j'écris
> <Unload mymsg> avant <mymsg.Show 1>
>
> Alors comment expliquez-vous cette lubie de VB ?


Hello,

impossible de reproduire ton probleme.
Voici comment j'ai fait:

voici ma form principale:
***
Option Explicit
Dim mgit As String
Dim mgtit As String
Dim msg As String

Private Sub Command1_Click()
Call ShowMsg("hh")
End Sub
Public Function ShowMsg(A$, Optional B%, Optional C$) As Integer
msg = A
If Not IsMissing(B) Then mgit = B
If Not IsMissing(C) Then mgtit = C
mymsg.Show 1
ShowMsg = mgret
End Function
***

la forme mymsg
***
Option Explicit

Private Sub cmdnon_Click()
mgret = 7
Unload Me
End Sub

Private Sub cmdoui_Click()
mgret = 6
Unload Me
End Sub
***


et le module pour la variable publique
***
Option Explicit
Public mgret As Integer
****

A priori, le probleme vient d'ailleurs;


--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."




Avatar
Yves Boyer
Merci pour cette solution qui est très bien expliquée.

Ainsi le code <Unload f: Set f = Nothing> montre bien qu'un simple Unload
peut être insuffisant et qu'il faut le doubler d'un <Set ... = Nothing>
J'ai donc écrit dans mes codes de boutons "Oui" et "Non" de ma feuille
mymsg.frm :
<Unload Me
Set mymsg = Nothing>
et ça marche.

Je ne comprends pas pourquoi le code de ta fonction Use s'arrête à "Show
vbModal" tant que la feuille f est visible. Pourquoi le "Me.Hide" de b_Click
permet-il à ce code de se poursuivre par
<Use = m_back> sachant que l'Integer m_back est une variable au niveau de la
feuille f ?

Bon dimanche !

Yves Boyer
Avatar
Christian HUBERT-HUGOUD- Xtrem7
Bonjour,

Attention : je ne pense pas que le code set me = nothing puisse fonctionner
(je ne pense pas qu'on puisse s'autodétruire). Si la feuille est réellement
déchargée, c'est le fait du hasard, selon moi. Cela n'arrivera pas toujours.

Le code s'arrête parce que la feuille est modale. Sinon, il continuerait à
s'éxécuter. Cette façon de faire est très "solide" et un peu agricole. Elle
fonctionne à coup sur sous tous les OS Windows.

Le me.hide "supprime" le caractère modale de la feuille (c'est l'idée
générale). En mode modal, les instruction s'exécutent les unes à la suite
des autres. C'est ce qu'on faisait partout avant l'évènementiel. En mode
modal, le programmeur sait toujours où est l'utilisateur. De ce fait,
l'utilisateur ne peut pas faire n'importe quoi. C'est le cas des ancien
programmes en mode console. En évènementiel, c'est autre chose : on doit
gérer tous les cas.

Voila...

Christian


"Yves Boyer" a écrit dans le message de
news:
Merci pour cette solution qui est très bien expliquée.

Ainsi le code <Unload f: Set f = Nothing> montre bien qu'un simple Unload
peut être insuffisant et qu'il faut le doubler d'un <Set ... = Nothing>
J'ai donc écrit dans mes codes de boutons "Oui" et "Non" de ma feuille
mymsg.frm :
<Unload Me
Set mymsg = Nothing>
et ça marche.

Je ne comprends pas pourquoi le code de ta fonction Use s'arrête à "Show
vbModal" tant que la feuille f est visible. Pourquoi le "Me.Hide" de


b_Click
permet-il à ce code de se poursuivre par
<Use = m_back> sachant que l'Integer m_back est une variable au niveau de


la
feuille f ?

Bon dimanche !

Yves Boyer