OVH Cloud OVH Cloud

form active

4 réponses
Avatar
thetigers
comment savoir si une form est active (s'il elle est
ouverte par l'instruction show)

ex: if frm_form1.active=true then

4 réponses

Avatar
surfeur75
Bonjour,

Je ne suis pas certain qu'il y ait une instruction qui gère l'état des
form's, alors une variable public as string (je ne sais pas si on peut
indicier une variable public), tu peux mettre dedans chaque fois qu'une form
se ferme ou s'ouvre pour savoir où t'en es...
--
@+, bye, Joe.
Pour m'écrire ng75AROBASEnoosPOINTfr
remplace AROBASE et POINT par leur vrai signe
Il l'a fait car il ne savait pas que c'était impossible, alea jacta est!


"thetigers" a écrit dans le message de news:
00ee01c3c654$0c85be70$
comment savoir si une form est active (s'il elle est
ouverte par l'instruction show)

ex: if frm_form1.active=true then


Avatar
François Picalausa
"thetigers" a écrit dans le message de
news:00ee01c3c654$0c85be70$
comment savoir si une form est active (s'il elle est
ouverte par l'instruction show)

ex: if frm_form1.active=true then



Bonjour/soir,

une possibiité est celle ci:

Private Declare Function apiGetActiveWindow Lib "user32" Alias
"GetActiveWindow" () As Long

Function GetActiveWindow() As Form
Dim frm As Form

'on parcourt la collection des forms chargées
For Each frm In Forms
If apiGetActiveWindow = frm.hWnd Then
Set GetActiveWindow = frm
Exit For
End If
Next frm
End Function

Exemple d'utilisation:
Debug.Print "Form2 est actif ? :" & (GetActiveWindow.Name = "Form2")

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com
Avatar
Pierre Alexis [MVP]
Salut François,

Tu as écrit :

une possibiité est celle ci:

Private Declare Function apiGetActiveWindow Lib "user32" Alias
"GetActiveWindow" () As Long

Function GetActiveWindow() As Form
Dim frm As Form

'on parcourt la collection des forms chargées
For Each frm In Forms
If apiGetActiveWindow = frm.hWnd Then



A chaque tour de boucle tu fais un appel à la fonction apiGetActiveWindow. En
imaginant que cette fonction en interne fasse un traitement long et
fastidieux, ce n'est pas très performant. Mieux vaut stocker la valeur de
retour de la fonction dans une variable et travailler à partir de cette
variable.

Set GetActiveWindow = frm
Exit For
End If
Next frm
End Function

Exemple d'utilisation:
Debug.Print "Form2 est actif ? :" & (GetActiveWindow.Name = "Form2")



Evite de comparer des strings. Mieux vaut écrire : GetActiveWindow Is Form2.
Dans ton code, une caparaison caractère par caractère est effectuée, ce qui
est bien plus long qu'une comparaison d'une adresse.

Ceci dit, tout ton code peut se résumer à cette ligne de code suivante :

Debug.Print "Form1 est actif ? : " & (Screen.ActiveForm Is Form1)

--
Pierre ALEXIS - MVP Visual Basic
Courriel & messenger :
FAQ Visual Basic : http://faq.vb.free.fr/
Avatar
François Picalausa
"Pierre Alexis [MVP]" a écrit dans le
message de news:%
Evite de comparer des strings. Mieux vaut écrire : GetActiveWindow Is
Form2. Dans ton code, une caparaison caractère par caractère est



Bonjour/soir,

Hier il me faisait une erreur type mismatch avec le Is... aujourd'hui, je
réessaye et tout fonctionne.. hmm...

Par contre, ton code ne fonctionne pas comme le mien.. avec ton code, si tu
active Notepad (par exemple), il renvoie toujours true sur la dernière form
active... si il faut retrouver la form active pour savoir si on doit ou non
un flashwindow, par exemple, ca peut être embétant...

Mais je me demande si c'est réellement ce que voulais faire thetigers qui a
écrit:
(s'il elle est ouverte par l'instruction show)



Dans ce cas, il s'agit d'une boucle simple sur la collection forms avec
test:
Function IsActiveWindow(objFrm As Form) As Boolean
Dim frm As Form

IsActiveWindow= False

'on parcourt la collection des forms chargées
For Each frm In Forms
If frm Is objFrm Then
IsActiveWindow = True
Exit For
End If
Next frm
End Function

--
François Picalausa (MVP VB)
FAQ VB : http://faq.vb.free.fr
MSDN : http://msdn.microsoft.com