OVH Cloud OVH Cloud

Savoir si la fenêtre active est modale

17 réponses
Avatar
SAISAS
Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.

10 réponses

1 2
Avatar
X
A tout hasard :

If VBmodal = true then msgbox "OK " & vbmodal
If VBmodal = false then msgbox "NO = " & vbmodal

------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"SAISAS" a écrit dans le message de news:

Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.


Avatar
Jacques93
Bonjour SAISAS,
SAISAS a écrit :
Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?




Pas très élégant, mais bon... Tu ajoutes une feuille "frmBidon",
pour éviter les flash tu met les propriétés :

BorderStyle = 1 - FixedSingle
ControlBox = False
Caption = ""

il n'y aura pas de barre de titre, puis tu réduis cette Form au minimum :

Width = 0
Height = 0

Et dans le code de la feuille dont tu veux savoir si elle est modale ou
pas :

Dim Modal As Boolean

On Error Resume Next
Err.Clear
frmBidon.Show vbModeless
Modal = (Err.Number = 401)
Unload frmBidon
On Error GoTo 0
If Modal Then
MsgBox "Modale"
Else
MsgBox "Non modale"
End If

Le principe est de trapper l'erreur 401 :

Impossible d'afficher une feuille non modale lorsque qu'une feuille
modale est affichée

--
Cordialement,

Jacques.
Avatar
Jacques93
Bonjour X,
X a écrit :
A tout hasard :

If VBmodal = true then msgbox "OK " & vbmodal
If VBmodal = false then msgbox "NO = " & vbmodal




vbModal étant une constante égale à 1, il y a peu de chance que cela
fonctionne (True = -1, False = 0)

--
Cordialement,

Jacques.
Avatar
X
Oui tu as raison, j'ai dit ça comme ça, sans réfléchir...
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:

Bonjour X,
X a écrit :
A tout hasard :

If VBmodal = true then msgbox "OK " & vbmodal
If VBmodal = false then msgbox "NO = " & vbmodal




vbModal étant une constante égale à 1, il y a peu de chance que cela
fonctionne (True = -1, False = 0)

--
Cordialement,

Jacques.


Avatar
X
Re-bonjour,

En fait, partant du postulat que c'est ton programme, il n'est pas
impossible que tu saches lesquelles de tes feuilles son "modal", mais à part
ça, peut être qu'on peut aussi:

Mettre une liste invisible en form1, dans laquelle tu indiques pour chaque
forme si elle est modal ou non
01o
02n
03n
04o
Et comme ça, à chaque fois que tu ouvres une feuille, tu indiques en même
temps dans ta liste si modal ou pas pour la form considérée, puis ensuite tu
peux consulter la liste de partout.
Je parle d'une liste car il me semble me souvenir qu'une variable public ne
peut être indicée...
Néanmoins, je ne vois toujours pas pourquoi tu veux savoir si c'est modal,
puisque tu le sais, c'est toi qui écrit "VBmodal" ??? Peut-être est-ce par
là qu'il faudrait commencer ???
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"SAISAS" a écrit dans le message de news:

Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.


Avatar
driss hanib
comme d'hab.. ;o)

"X" a écrit dans le message de news:
%
Oui tu as raison, j'ai dit ça comme ça, sans réfléchir...
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:

Bonjour X,
X a écrit :
A tout hasard :

If VBmodal = true then msgbox "OK " & vbmodal
If VBmodal = false then msgbox "NO = " & vbmodal




vbModal étant une constante égale à 1, il y a peu de chance que cela
fonctionne (True = -1, False = 0)

--
Cordialement,

Jacques.






Avatar
X
GGGGRRRRRRRrrrrrrrrrrr :o)

--
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"driss hanib" a écrit dans le message de news:

comme d'hab.. ;o)

"X" a écrit dans le message de news:
%
Oui tu as raison, j'ai dit ça comme ça, sans réfléchir...
Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:

Bonjour X,
X a écrit :
A tout hasard :

If VBmodal = true then msgbox "OK " & vbmodal
If VBmodal = false then msgbox "NO = " & vbmodal




vbModal étant une constante égale à 1, il y a peu de chance que cela
fonctionne (True = -1, False = 0)

--
Cordialement,

Jacques.










Avatar
SAISAS
Merci,

en fait, mon problème est justement de trapper cette fameuse erreur 401.

Donc problème résolu.

"Jacques93" a écrit :

Bonjour SAISAS,
SAISAS a écrit :
> Bonjour,
>
> je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
> comment faire?
>

Pas très élégant, mais bon... Tu ajoutes une feuille "frmBidon",
pour éviter les flash tu met les propriétés :

BorderStyle = 1 - FixedSingle
ControlBox = False
Caption = ""

il n'y aura pas de barre de titre, puis tu réduis cette Form au minimum :

Width = 0
Height = 0

Et dans le code de la feuille dont tu veux savoir si elle est modale ou
pas :

Dim Modal As Boolean

On Error Resume Next
Err.Clear
frmBidon.Show vbModeless
Modal = (Err.Number = 401)
Unload frmBidon
On Error GoTo 0
If Modal Then
MsgBox "Modale"
Else
MsgBox "Non modale"
End If

Le principe est de trapper l'erreur 401 :

Impossible d'afficher une feuille non modale lorsque qu'une feuille
modale est affichée

--
Cordialement,

Jacques.



Avatar
Guy DETIENNE
Salut ;O)

Partant de cette idée logique:
Une formulaire modal n'a de sens que s'il est appelé à partir d'un autre
formulaire.
Le but du style modal est d'empêcher l'utilisation de la fenêtre appelante
avant d'avoir fermé la fenêtre appelée (comme une message box).

Un seul et unique formulaire modal dans une application n'a à vrai dire
aucun sens.

Sachons que lorsqu'un formulaire ouvre un autre formulaire via la méthode
Show avec comme style VbModal, le style du formulaire appelant passe
aussitôt à Disabled (WS_DISABLED).
C'est la règle dans Windows.

L'on pourrait grâce à l'API GetWindowLong récupérer le style de la fenêtre
appelante et tester le flag WS_DISABLED (&H8000000) pour connaître son état.
Ceci est la version longue : Exemple d'une fonction IsWindowModal :

Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As
Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long

Public Const WS_DISABLED = &H8000000
Public Const GWL_STYLE = (-16)

Public Function IsWindowModal(hWnd As Long) As Boolean

Dim hwndOwner As Long
hwndOwner = GetWindow(hWnd, GW_OWNER)
If hwndOwner Then
IsWindowModal = (GetWindowLong(hwndOwner, GWL_STYLE) And WS_DISABLED)
End If

End Function


Cepdendant, il existe un raccourci efficace au code ci-dessus.
L'utilisation de l'API IsWindowEnabled.
Pour illustrer l'utilisation de cette API, il faudra créer 2 formulaires
(Form1 et Form2).
Form1 possède un bouton qui appellera Form2 de façon modale - le code :
Form2.Show vbModal
Form2 possède un bouton avec le code suivant (qui donnera l'état de la
fenêtre appelante): MsgBox IsWindowEnabled(Form1.hwnd)
Un module avec ce code-ci : Public Declare Function IsWindowEnabled Lib
"user32" (ByVal hwnd As Long) As Long

Lancer Form1, puis cliquer le bouton et Form2 apparaît de façon modale.
Impossible donc de retourner sur Form1 sans avoir quitté Form2.
Cliquer sur le bouton de Form2 et la MsgBox donnera la valeur 0, ce qui
signifie que Form1 est Disabled car Form2 a modifié son état vu que Form2
est modal.
(Pour info, la valeur 1 est retournée si in formulaire est Enabled)

Voilà... C'est ainsi que je travaillerais si j'étais dans ce cas de figure.
A prèsent, si ta notion de Form modal n'est pas celle décrite ci-dessus,
alors je ne peux rien pour toi, car il n'y a pas mille notions d'un Form
modal....

Guy






"SAISAS" a écrit dans le message de
news:
Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.


Avatar
X
Bonsoir, ben t'as de la chance, moi je ne comprends toujours pas l'utilité
de tester si une form est modale dans son programme, puisque c'est de son
programme que l'on lance les form, on sait quand même comment on les
lance... Et si c'est de l'appel entre programmes, je suis loin d'être
certain qu'on puisse changer par un exe la modalité d'une feuille d'un autre
exe, il y a peut être quelque chosed' extrêmement subtile qui m'échappe,
mais là, bof, je ne comprend pas pourquoi chercher à savoir ce que l'on sait
???

Bien que tu aies compris, si j'appelle de la 1 la 2 en modal, je ne vais pas
me demander en quoi elle est, puisque je viens de l'écrire, lol, je le
sais... et... jusqu'à preuve du contraire les form ne s'appellent pas toute
seules ???

Merci beaucoup, au revoir et à bientôt :o)
------
Site logiciels
http://irolog.free.fr
Mail
http://irolog.free.fr/ecrire/index.htm
Site perso
http://irolog.free.fr/joe/index.htm
Principe d'utilisation des news Groups
http://support.microsoft.com/directory/worldwide/fr/newsgroup/regles.htm
------------------------------------------------------------------------------------
"Guy DETIENNE" a écrit dans le message de news:

Salut ;O)

Partant de cette idée logique:
Une formulaire modal n'a de sens que s'il est appelé à partir d'un autre
formulaire.
Le but du style modal est d'empêcher l'utilisation de la fenêtre appelante
avant d'avoir fermé la fenêtre appelée (comme une message box).

Un seul et unique formulaire modal dans une application n'a à vrai dire
aucun sens.

Sachons que lorsqu'un formulaire ouvre un autre formulaire via la méthode
Show avec comme style VbModal, le style du formulaire appelant passe
aussitôt à Disabled (WS_DISABLED).
C'est la règle dans Windows.

L'on pourrait grâce à l'API GetWindowLong récupérer le style de la fenêtre
appelante et tester le flag WS_DISABLED (&H8000000) pour connaître son
état.
Ceci est la version longue : Exemple d'une fonction IsWindowModal :

Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd
As
Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long

Public Const WS_DISABLED = &H8000000
Public Const GWL_STYLE = (-16)

Public Function IsWindowModal(hWnd As Long) As Boolean

Dim hwndOwner As Long
hwndOwner = GetWindow(hWnd, GW_OWNER)
If hwndOwner Then
IsWindowModal = (GetWindowLong(hwndOwner, GWL_STYLE) And WS_DISABLED)
End If

End Function


Cepdendant, il existe un raccourci efficace au code ci-dessus.
L'utilisation de l'API IsWindowEnabled.
Pour illustrer l'utilisation de cette API, il faudra créer 2 formulaires
(Form1 et Form2).
Form1 possède un bouton qui appellera Form2 de façon modale - le code :
Form2.Show vbModal
Form2 possède un bouton avec le code suivant (qui donnera l'état de la
fenêtre appelante): MsgBox IsWindowEnabled(Form1.hwnd)
Un module avec ce code-ci : Public Declare Function IsWindowEnabled Lib
"user32" (ByVal hwnd As Long) As Long

Lancer Form1, puis cliquer le bouton et Form2 apparaît de façon modale.
Impossible donc de retourner sur Form1 sans avoir quitté Form2.
Cliquer sur le bouton de Form2 et la MsgBox donnera la valeur 0, ce qui
signifie que Form1 est Disabled car Form2 a modifié son état vu que Form2
est modal.
(Pour info, la valeur 1 est retournée si in formulaire est Enabled)

Voilà... C'est ainsi que je travaillerais si j'étais dans ce cas de
figure.
A prèsent, si ta notion de Form modal n'est pas celle décrite ci-dessus,
alors je ne peux rien pour toi, car il n'y a pas mille notions d'un Form
modal....

Guy






"SAISAS" a écrit dans le message de
news:
Bonjour,

je voudrais vérifier si la fenêtre affichée est modale ou non. Savez vous
comment faire?

Merci.






1 2