OVH Cloud OVH Cloud

Form modale

3 réponses
Avatar
J. Smith
Bonjour,

Je possède un traitement dont je souhaiterais voir l'activité dans une
fenêtre modale (imposée au dessus de la fenêtre mère). J'ai vu que deux
fonctions permettaient d'afficher une fenêtre Show et ShowDialog.

Show rend la fenêtre non modale.
ShowDialog la rend modale, mais aucun traitement ne s'exécute tant qu'elle
n'est pas fermée.

Exemple :

Form Principale
dim a as new RunForm
a.ShowDialog()

if (a.DoJob_2() = false) then
do something in main form
end if

a.Dispose ()


Dans cet exemple, DoJob ne s'exécute pas tant que la RunForm n'est pas
fermée.

J'ai envisagé de placer le code d'exécution dans le Load (ou équivalent) de
la RunForm, mais cela pose un certain nombre de contraintes (valeur de
retour, mise à jour de la main form e fin de traitement, branchement vers le
bon DoJob, ...) qui me font penser que ça n'est pas la bonne solution.

Qu'en pensez-vous ?

Merci

3 réponses

Avatar
Eric Vernié [MS]
Bonjour J.Smith
Pourquoi veux tu une fenêtre modale si tu peux switcher vers la fenêtre qui
l'appel ?

Sinon, voici ce que tu peux faire.
A partir de ta 1er form
sur le click d'un bouton

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim t As Threading.Thread
t = New Threading.Thread(AddressOf OuvrirMaForm)
t.Start()
End Sub
Sub OuvrirMaForm()
Dim f As New Form2
f.ShowDialog()
End Sub

A+

Eric Vernié
Microsoft France


"J. Smith" a écrit dans le message de news:
41f0ab97$0$7830$
Bonjour,

Je possède un traitement dont je souhaiterais voir l'activité dans une
fenêtre modale (imposée au dessus de la fenêtre mère). J'ai vu que deux
fonctions permettaient d'afficher une fenêtre Show et ShowDialog.

Show rend la fenêtre non modale.
ShowDialog la rend modale, mais aucun traitement ne s'exécute tant qu'elle
n'est pas fermée.

Exemple :

Form Principale
dim a as new RunForm
a.ShowDialog()

if (a.DoJob_2() = false) then
do something in main form
end if

a.Dispose ()


Dans cet exemple, DoJob ne s'exécute pas tant que la RunForm n'est pas
fermée.

J'ai envisagé de placer le code d'exécution dans le Load (ou équivalent)
de
la RunForm, mais cela pose un certain nombre de contraintes (valeur de
retour, mise à jour de la main form e fin de traitement, branchement vers
le
bon DoJob, ...) qui me font penser que ça n'est pas la bonne solution.

Qu'en pensez-vous ?

Merci




Avatar
J. Smith
Bonjour,

Merci pour l'astuce, mais son application :
- rend la fenêtre de dialogue non modale.
- bloque tout de même l'exécution du code placé après le ShowDialog

Pour être plus clair, ce que je cherche à faire est l'équivalent de ce que
l'on peut trouver dans de nombreux logiciels :

On demande la réalisation d'une action au sein d'une fenêtre mère (ex : scan
antiviral)
Cela ouvre une petite fenêtre de suivi du processus (avec progressBar et
bouton Annuler/Pause/...)
Tant que le processus n'est pas terminé, l'utilisateur ne peut pas revenir
vers la fenêtre principale, à moins de le stopper.

Je fait actuellement ce suivi dans la fenêtre principale, mais elle commence
à être surchargée aussi je souhaite passer par cette solution.

Comment faire ?

En vous remerciant,
J. Smith


"Eric Vernié [MS]" a écrit dans le message de
news:ehX6$M5$
Bonjour J.Smith
Pourquoi veux tu une fenêtre modale si tu peux switcher vers la fenêtre


qui
l'appel ?

Sinon, voici ce que tu peux faire.
A partir de ta 1er form
sur le click d'un bouton

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim t As Threading.Thread
t = New Threading.Thread(AddressOf OuvrirMaForm)
t.Start()
End Sub
Sub OuvrirMaForm()
Dim f As New Form2
f.ShowDialog()
End Sub


Avatar
Eric Vernié [MS]
Bonjour J smith,

Voici comment tu peux procéder.
Le plus simple est de réutiliser mon exemple de threads pour afficher dans
la fenêtre modale et dans une progressbar par exemple l'état d'avancement du
traitement

Exemple :
1) Tu déclare comme donnée membre privée ton formulaire qui sera modale
Private MonForm as Form2
2) Tu crées ta méthode qui fait le traitement mais qui indiquera égalment au
formulaire modale de se mettre à jour
Sub FaitMonTraitement()
Dim valeur as integer
while (true)
valeur+=1
MonForm.ProgressBar.value=valeur
end while
monForm.close()
End Sub

Dans un bouton Click() du formulaire principal tu ajoutes le code suivant

Dim t As Threading.Thread
t = New Threading.Thread(AddressOf FaitMonTraitement)
'Démarre le traitement
t.Start()
'Affiche le formulaire en modale (mais le traitement continue
toujours
MonForm =New Form2
MonForm.ShowDialog()
End Sub


Ceci devrait fonctionner

A+

Eric Vernié
Microsoft


"J. Smith" a écrit dans le message de news:
41f23591$0$2513$
Bonjour,

Merci pour l'astuce, mais son application :
- rend la fenêtre de dialogue non modale.
- bloque tout de même l'exécution du code placé après le ShowDialog

Pour être plus clair, ce que je cherche à faire est l'équivalent de ce que
l'on peut trouver dans de nombreux logiciels :

On demande la réalisation d'une action au sein d'une fenêtre mère (ex :
scan
antiviral)
Cela ouvre une petite fenêtre de suivi du processus (avec progressBar et
bouton Annuler/Pause/...)
Tant que le processus n'est pas terminé, l'utilisateur ne peut pas revenir
vers la fenêtre principale, à moins de le stopper.

Je fait actuellement ce suivi dans la fenêtre principale, mais elle
commence
à être surchargée aussi je souhaite passer par cette solution.

Comment faire ?

En vous remerciant,
J. Smith


"Eric Vernié [MS]" a écrit dans le message de
news:ehX6$M5$
Bonjour J.Smith
Pourquoi veux tu une fenêtre modale si tu peux switcher vers la fenêtre


qui
l'appel ?

Sinon, voici ce que tu peux faire.
A partir de ta 1er form
sur le click d'un bouton

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click

Dim t As Threading.Thread
t = New Threading.Thread(AddressOf OuvrirMaForm)
t.Start()
End Sub
Sub OuvrirMaForm()
Dim f As New Form2
f.ShowDialog()
End Sub