Form qui disparait

Résolu
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009 - 29 mai 2009 à 11:20
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 - 2 juin 2009 à 13:38
Bonjour à tous,

grand débutant en VB.Net (j'ai commencé il y a un mois et on me charge déjà de la migration d'une énorme appli), je rencontre un petit souci:

je suis en train de programmer les tests effectués par l'appli lorsqu'on la charge.

Il s'agit de tests pour savoir si le serveur est accessible, si les paramètres de l'utilisateur sont bons, etc...

Je fais donc mes petits tests, et lorsque le serveur n'est pas accessible par exemple, je renvoie sur un autre form (formLogin) qui permet à l'utilisateur de rentrer un path correct.

Je l'appelle en faisant

Me.hide()
formLogin.show()

donc logiquement, c'est censé me charger formLogin_Load. J'ai vérifié, ça le fait bien, mais à la fin du sub formLogin_load, au lieu d'attendre que l'utilisateur rentre des infos et clique sur les boutons (connect et quit, programmés dans frmLogin), l'appli renvoie tout de suite sur le premier form et continue à suivre les instructions comme si j'avais juste fait appel à une méthode!
Alors que moi je voudrais que le formLogin attende les événements (clic sur les boutons connect ou quit, rentrer des infos dans les Tb...)

Je sais pas si c'est très clair...

Merci de votre aide en tout cas!

11 réponses

Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 mai 2009 à 14:08
Bonjour,

Il faut ouvrir ton formulaire en mode modale, comme ceci :

formLogin.showDialog()

Ou :

formLogin.showDialog(Me)

selon le placement de ton formulaire.

Me.hide()
formLogin.show()  <== Le programme, ve executer cette ligne et attendre la fermeture de ce formulaire pour exécuter les lignes suivantes
[lignes suivantes...]
3
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009
29 mai 2009 à 14:38
ça marche!

Merci beaucoup!
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 mai 2009 à 14:51
Tu m'excusera je me suis planté en plus c'est :

Me.hide()
formLogin.showDialog()  <== Le programme, ve executer cette ligne et attendre la fermeture de ce formulaire pour exécuter les lignes suivantes
[lignes suivantes...]

Mais tu avais compris c'est le principale....

@+ et bon courrage pour ton gros projet !
0
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009
29 mai 2009 à 15:07
Oui, j'avais même pas vu la faute, tout content d'aller essayer showdialog...

par contre, ça marche bien , mais maintenant je voudrais pouvoir quitter l'appli à partir du formLogin (qui est donc en showdialog).

je programme donc un bouton quit, avec, au clic:

application.exit

et là, ça bugge!

Je suppose que c'est dû au showdialog qui ne permet pas de sortir de l'appli aussi facilement...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 mai 2009 à 16:37
Non, en fait si tu n'arrive pas à quitter ton application c'est que tu as des classes instanciées qui empechent la fermeture de ton application. Utilise la méthode Dispose des objets pour libérer leurs ressources proprement.

Exemple :

Dim Coll As New Collection
Coll.Add ("Test")

'Coll.Dispose (True)
Coll.Dispose

Voila @+
0
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009
29 mai 2009 à 16:52
j'ai repéré deux objets instanciés qui pourraient empecher la fermeture.

Mais ce sont des objets de mon premier formulaire (frmMenu), permettant la connexion à la base de données: ils sont issus de deux classes que j'ai créées:
SQLCommande et SQLConnexion:
_________________

Public Class SQLCommande

Dim connexion As New SQLConnexion

Public Function requete(ByVal queryString As String, ByVal connexion As SQLConnexion) As SqlDataReader

Dim command As New SqlCommand(queryString, connexion.connexion())

Dim reader As SqlDataReader = command.ExecuteReader()

Return reader

End Function

End Class

_____________


Public Class SQLConnexion

'
'méthode pour lancer la connexion à la DB
'
Public Function connexion() As SqlConnection
Try
Dim strConnexion = "Server=" + frmMenu.NomServeur + ";Integrated Security=SSPI;database=" + frmMenu.dbname + ""
Dim oConnection As SqlConnection = New SqlConnection(strConnexion)
oConnection.Open()
Return oConnection


Catch e As Exception
Console.WriteLine("L'erreur suivante a été rencontrée :" & e.Message)
Return Nothing

End Try
End Function


End Class

_________


Dans frmMenu, je crée un objet de chaque pour pouvoir me connecter à la base.

Public commande As New SQLCommande
Public connec As New SQLConnexion

Et quand je fais ce que tu m'as conseillé dans frmLogin, voici l'erreur que j'obtiens:

Error 1 'Dispose' is not a member of 'Formation_.SQLCommande'.


Que faire?

Merci à toi pour tes réponses!!!
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 mai 2009 à 17:24
Tu instancie ces classes, OK, mais appel-tu leurs fonctions avant d'ouvrir ton deuxième formulaire ? Peux-tu me poster le code complet de la procédure dans laquelle tu appel ton Form.showdialog et celle de ton Form_Load si ce n'est pas un code de 50 pages...
0
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009
29 mai 2009 à 17:49
Private Sub frmMenu_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

testParam()

End Sub

Private Sub testParam()

'Test de la connexion au serveur

TestConnec = connec.connexion()

'Test du serveur et de la base

serv = testserveur()

'test du username

us = testUser()

'Test de validité des paramètres

If serv False Or us False Then

frmLogin.ShowDialog()
testParam()

ElseIf serv True And us True Then
MsgBox("Vous êtes connecté au serveur:" & NomServeur & ", à la base:" & dbname & " sous le nom:" & login)

End If

End Sub


___________


En sachant que frmLogin joue sur Nomserveur, dbname et login pour que ces trois paramètres soient valides.

Le formLoad de frmLogin ne fait rien si ce n'est remplir les TextBox avec les paramètres :
___________

Private Sub frmLogin_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If frmMenu.serv = False Then
Tb_db.Text = frmMenu.dbname
Tb_user.Text = frmMenu.login


ElseIf frmMenu.us = False Then
Tb_serveur.Text = frmMenu.NomServeur
Tb_db.Text = frmMenu.dbname

ElseIf frmMenu.serv False And frmMenu.us False Then
Tb_db.Text = frmMenu.dbname

End If
End Sub

_________

Enfin, le code du bouton qui déconne (toujours dans frmLogin)

_________

Private Sub bt_quit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bt_quit.Click
Me.Close()
Application.Exit()
End Sub
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
29 mai 2009 à 18:49
TestConnec = connec.connexion() '<= Tu ouvre la connexion sans la refermer

'Test du serveur et de la base 
     
serv = testserveur() 'A quoi coresspond cette procédure ?

'test du username 

us = testUser() 'Idem ?

Pour chaque procédure que tu appelle, veille à bien libérer les ressources, Exemple :

Private Function Test() As Boolean

    Dim Server As MaClasseConnexion
    
    Server.Login ="Toto"
    Server.Passwrd = "Tata"
    
   Try
      Server.Connect
      Return True  
   Catch
      Return False
   Finally 'Termine la procédure par les lignes dessous errreur ou non
      Server.CloseConnexion' <= Ferme la connexion
      Server.Dispose' <= Libère l'objet
   End Try

End Function

Ici je pars du principe que j'ai créé une classe MaClasseConnexion qui gère ma connexion.

Pour ce qui est de Dispose, ta classe n'implément pas IDisposable, de ce fait, tu ne peux pas appeler la méthode Dispose, pour en savoir plus, c'est Ici
@+ Mayzz
0
cs_tuomas Messages postés 6 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 2 juin 2009
2 juin 2009 à 09:27
Désolé pour le retard, j'ai plus le code quand je pars de la boite...

testserveur et testeuser sont deux procédures bien à part testant la dispo du serveur( bloc try catch, mais effectivement je vais rajouter un finally ça ira ^ptet mieux), et l'autre vérifie si le login ws correspond à un nom enregistré dans une table de l'appli.

Bon j'essaye avec les finally. Merci du tuyau!
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
2 juin 2009 à 13:38
Re !

Il faut surtout que tu n'oublis pas la libération des ressources dans ces procédures... Si tu ouvre une connexion pour tester le serveur, il est normale de la fermer, sinon le temps que ton prog va resté exécuté la connexion sera ouverte + celle que tu va ouvrir pour le transfert...

Tien moi au courrant si elle ne se ferme toujours pas.

@+ Mayzz

Si le déboguage est l'art d'enlever les bogues, alors la programmation doit être l'art de les créer.
0
Rejoignez-nous