cs_hminet
Messages postés3Date d'inscriptionlundi 29 juillet 2002StatutMembreDernière intervention30 mars 2007
-
30 mars 2007 à 16:34
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 2015
-
30 mars 2007 à 18:29
Bonjour à tous,
Mon problème est simple et compliqué à la fois je m'explique :
Je développe une appli VB6 client/serveur.
Durant certains processus (requetes) j'aimerais afficher une form modale (donc qui peut pas etre contournée) pour faire patienter les personnes.
Cependant cette form d'attente étant modale, mon script ne s'exécute plus tant qu'elle n'a pas disparu...
Par exemple :
frmWait.show vbModal
'processus SQL long
'qui ne s'exécutera pas car la nouvelle form est modale
frmWait.Hide 'ou unLoad frmWait...
Comment faire donc pour avoir une fenetre d'attente qui ne puisse être contournée et qui se ferme une fois le processus fini ?
Et aussi, si parfois de mon application, depuis la première form, j'affiche une seconde form modale (par exemple la fenetre principale contient une liste de clients et la fenetre que j'ouvre en modale affiche sa fiche client) si je veux aussi faire apparaitre cette fenetre d'attente et que je dois donc passer par un affichage de la waitScreen en non-modale, ca va me faire une erreur 401 :
impossible d'afficher une feuille non modale lorsqu'une feuille modale est affichée.
Donc comment faire ?
D'avance merci pour vos réponses ! J'ai parcouru un peu le forum mais j'ai pas trouvé de topic similaire donc je fais appel à vous ! Merci !
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 30 mars 2007 à 18:11
un truc simple, bien qu'un peu tordu, consite a lancer ta feuille en modale, et de t'arranger pour que le code du long traitement soit lancé par elle...
une fois le traitement finit, tu masque la feuille modale et hop ! ni vu ni connu ^^
bon, je le reconnait, c'est tordu, mais ca fonctionne..... et c'est facile a mettre en place
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 mars 2007 à 18:29
Salut
('Contournable' : définition exact de ce que tu veux dire, stp)
En effet, une forme modale n'est peut-être pas la solution.
A mon avis, il faut la charger en Modeless et la forcer en "Always on top" grace à ce genre de code (API) :
frmAttente.Show vbModeless
Call SetTop (frmAttente, True)
et quand je n'en ai plus besoin
Call SetTop (frmAttente, False)
Unload frmAttente
Dernière chose : Pendant que ton programme travaille, tu n'es pas obligé d'afficher sa forme principale, tu peux la masquer, ça ne l'empèchera pas d'exécuter son code : frmMain.Visible False puis frmMain.Visible True quand tu veux la faire réapparaitre
Mets ça dans un Module :
Option Explicit
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 uFlags As Long) As Long
' Constantes de SetWindowPos :
Private Const HWND_TOPMOST As Long = -1
Private Const HWND_NOTOPMOST As Long = -2
Private Const SWP_NOSIZE As Long = &H1
Private Const SWP_NOMOVE As Long = &H2
Private Const SWP_NOACTIVATE As Long = &H10
Public Sub SetTop(Form As Form, _
ByVal Topmost As Boolean)
Dim hWndInsertAfter As Long
If Topmost Then
hWndInsertAfter = HWND_TOPMOST
Else
hWndInsertAfter = HWND_NOTOPMOST
End If
SetWindowPos Form.hWnd, hWndInsertAfter, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOACTIVATE
End Sub
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)