Form d'attente

cs_hminet Messages postés 3 Date d'inscription lundi 29 juillet 2002 Statut Membre Dernière intervention 30 mars 2007 - 30 mars 2007 à 16:34
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 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 !

Hadrien

2 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
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

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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)
0
Rejoignez-nous