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

Fenetre d'attente pendant une recherche

7 réponses
Avatar
jerome
Bonjour,

Je voudrais pouvoir afficher une fenetre pendant l'exécution d'une procédure
stockée envoyant à l'utilisateur un message d'attente.

Le problème est que la fenetre d'où est lancée la requete est une fenetre
modale.

Si je fais un attente.show vbModeless j'ai un message d'erreur me disant que
je ne peux afficher une fenetre non modale par dessus une fenetre modale.

Et si je fais un attente.show vbModal la suite du code vb ne se fait pas
tant que la fenetre d'attente n'a pas été fermée.

Comment puis-je faire ?
En sachant que ma fenetre d'appel est nécessairement, dans mon cas une
fenetre modale.

Merci

7 réponses

Avatar
Jean-marc
"jerome" a écrit dans le message de news:

Bonjour,

Je voudrais pouvoir afficher une fenetre pendant l'exécution d'une
procédure
stockée envoyant à l'utilisateur un message d'attente.

Le problème est que la fenetre d'où est lancée la requete est une fenetre
modale.

Si je fais un attente.show vbModeless j'ai un message d'erreur me disant
que
je ne peux afficher une fenetre non modale par dessus une fenetre modale.

Et si je fais un attente.show vbModal la suite du code vb ne se fait pas
tant que la fenetre d'attente n'a pas été fermée.

Comment puis-je faire ?
En sachant que ma fenetre d'appel est nécessairement, dans mon cas une
fenetre modale.



Hello,

une solution alternative:
tu mets sur ta fenêtre un ou des controle(s) invisible(s),
par exemple des Label avec un texte comme
"Veuillez Patienter etc."
Juste avant le lancement de ta requête, tu rends ces controles
visibles. Puis à la fin de l'exec, tu les remet en invisible.

Avec un peu de soin, on peut faire quelque chose de joli
et pratique.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jacques93
Bonsoir,
Jean-marc a écrit :
"jerome" a écrit dans le message de news:

Bonjour,

Je voudrais pouvoir afficher une fenetre pendant l'exécution d'une
procédure
stockée envoyant à l'utilisateur un message d'attente.

Le problème est que la fenetre d'où est lancée la requete est une fenetre
modale.

Si je fais un attente.show vbModeless j'ai un message d'erreur me disant
que
je ne peux afficher une fenetre non modale par dessus une fenetre modale.

Et si je fais un attente.show vbModal la suite du code vb ne se fait pas
tant que la fenetre d'attente n'a pas été fermée.

Comment puis-je faire ?
En sachant que ma fenetre d'appel est nécessairement, dans mon cas une
fenetre modale.



Hello,

une solution alternative:
tu mets sur ta fenêtre un ou des controle(s) invisible(s),
par exemple des Label avec un texte comme
"Veuillez Patienter etc."
Juste avant le lancement de ta requête, tu rends ces controles
visibles. Puis à la fin de l'exec, tu les remet en invisible.

Avec un peu de soin, on peut faire quelque chose de joli
et pratique.




Deux solutions alternatives ;-) :

Utiliser les API pour afficher la seconde fenêtre :

Private Const SW_SHOW = 5
Private Const HWND_TOPMOST = -1
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2

Private Declare Function ShowWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long

Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, _
ByVal wFlags As Long) As Long

Private Sub Command1_Click()
ShowWindow Form2.hwnd, SW_SHOW
SetWindowPos Form2.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, _
SWP_NOSIZE Or SWP_NOMOVE
End Sub

Il n' y plus là de notions de vbModal ou vbModeless pour la fenêtre
appelée, par contre la fenêtre appelante garde le Focus (la fenêtre
appelée ne reçoit pas les événement souris ou clavier).

Une autre solution est d'utiliser un Exe ActiveX pour la seconde
fenêtre. Tournant 'Out of Process', les deux fenêtres vivent leur vie de
manière indépendante. C'est plus lourd à mettre en oeuvre, mais cela
permet plus de liberté.


--
Cordialement,

Jacques.
Avatar
jerome
Merci.

La solution API fonctionne.
Par contre j'essaie de faire en sorte que le Private Declare Function soit
écrit dans un module pour être appelé à plusieurs endroits.
Du style Public Declare Function mais je ne trouve pas la syntaxe correcte.

Re- Merci

"Jacques93" wrote in message
news:%230gB%
Bonsoir,
Jean-marc a écrit :
> "jerome" a écrit dans le message de news:
>
>> Bonjour,
>>
>> Je voudrais pouvoir afficher une fenetre pendant l'exécution d'une
>> procédure
>> stockée envoyant à l'utilisateur un message d'attente.
>>
>> Le problème est que la fenetre d'où est lancée la requete est une


fenetre
>> modale.
>>
>> Si je fais un attente.show vbModeless j'ai un message d'erreur me


disant
>> que
>> je ne peux afficher une fenetre non modale par dessus une fenetre


modale.
>>
>> Et si je fais un attente.show vbModal la suite du code vb ne se fait


pas
>> tant que la fenetre d'attente n'a pas été fermée.
>>
>> Comment puis-je faire ?
>> En sachant que ma fenetre d'appel est nécessairement, dans mon cas une
>> fenetre modale.
>
> Hello,
>
> une solution alternative:
> tu mets sur ta fenêtre un ou des controle(s) invisible(s),
> par exemple des Label avec un texte comme
> "Veuillez Patienter etc."
> Juste avant le lancement de ta requête, tu rends ces controles
> visibles. Puis à la fin de l'exec, tu les remet en invisible.
>
> Avec un peu de soin, on peut faire quelque chose de joli
> et pratique.
>

Deux solutions alternatives ;-) :

Utiliser les API pour afficher la seconde fenêtre :

Private Const SW_SHOW = 5
Private Const HWND_TOPMOST = -1
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2

Private Declare Function ShowWindow Lib "user32" ( _
ByVal hwnd As Long, _
ByVal nCmdShow As Long) As Long

Private Declare Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal cx As Long, ByVal cy As Long, _
ByVal wFlags As Long) As Long

Private Sub Command1_Click()
ShowWindow Form2.hwnd, SW_SHOW
SetWindowPos Form2.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, _
SWP_NOSIZE Or SWP_NOMOVE
End Sub

Il n' y plus là de notions de vbModal ou vbModeless pour la fenêtre
appelée, par contre la fenêtre appelante garde le Focus (la fenêtre
appelée ne reçoit pas les événement souris ou clavier).

Une autre solution est d'utiliser un Exe ActiveX pour la seconde
fenêtre. Tournant 'Out of Process', les deux fenêtres vivent leur vie de
manière indépendante. C'est plus lourd à mettre en oeuvre, mais cela
permet plus de liberté.


--
Cordialement,

Jacques.


Avatar
Vincent Guichard
jerome a écrit :
Merci.

La solution API fonctionne.
Par contre j'essaie de faire en sorte que le Private Declare Function soit
écrit dans un module pour être appelé à plusieurs endroits.
Du style Public Declare Function mais je ne trouve pas la syntaxe correcte.



Pourtant en mettant les déclarations des fonctions et des constantes
dans un module et en remplaçant Private par Public ça devrais marcher.
Tu peux aussi laisser ces fonctions (et constantes) en Private et
rajouter une fontion Public dans laquelle tu mets le code d'appel des
deux APIs, comme par exemple:

'Attention, non testé (pas envi de lancer VB6)
Public Function ShowFormOnTop(f as Form) as Long
ShowWindow f.hwnd, SW_SHOW
ShowFormOnTop = SetWindowPos(f.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, _
SWP_NOSIZE Or SWP_NOMOVE)
End Function


Vincent Guichard
Avatar
jerome
Quand j'essaie la syntaxe

Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal
nCmdShow As Long) As Long

j'ai un message d'erreur : erreur de compilation, seul des commentaires
peuvent apparaitre apres end sub, end function ou end property

"Vincent Guichard" wrote in message
news:4564825d$0$5104$
jerome a écrit :
> Merci.
>
> La solution API fonctionne.
> Par contre j'essaie de faire en sorte que le Private Declare Function


soit
> écrit dans un module pour être appelé à plusieurs endroits.
> Du style Public Declare Function mais je ne trouve pas la syntaxe


correcte.

Pourtant en mettant les déclarations des fonctions et des constantes
dans un module et en remplaçant Private par Public ça devrais marcher.
Tu peux aussi laisser ces fonctions (et constantes) en Private et
rajouter une fontion Public dans laquelle tu mets le code d'appel des
deux APIs, comme par exemple:

'Attention, non testé (pas envi de lancer VB6)
Public Function ShowFormOnTop(f as Form) as Long
ShowWindow f.hwnd, SW_SHOW
ShowFormOnTop = SetWindowPos(f.hwnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, _
SWP_NOSIZE Or SWP_NOMOVE)
End Function


Vincent Guichard


Avatar
Vincent Guichard
jerome a écrit :
Quand j'essaie la syntaxe

Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal
nCmdShow As Long) As Long

j'ai un message d'erreur : erreur de compilation, seul des commentaires
peuvent apparaitre apres end sub, end function ou end property



Parce que les déclarations doivent être mises au début du fichier, avant
la première définition de fonction.

Vincent Guichard
Avatar
jerome
Effectivement.
Merci

"Vincent Guichard" wrote in message
news:456b04aa$0$27393$
jerome a écrit :
> Quand j'essaie la syntaxe
>
> Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long,


ByVal
> nCmdShow As Long) As Long
>
> j'ai un message d'erreur : erreur de compilation, seul des commentaires
> peuvent apparaitre apres end sub, end function ou end property

Parce que les déclarations doivent être mises au début du fichier, avant
la première définition de fonction.

Vincent Guichard