cs_tuomas
Messages postés6Date d'inscriptionvendredi 29 mai 2009StatutMembreDernière intervention 2 juin 2009
-
29 mai 2009 à 11:20
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDerniè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...)
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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...]
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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...]
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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.
cs_tuomas
Messages postés6Date d'inscriptionvendredi 29 mai 2009StatutMembreDerniè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'.
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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...
cs_tuomas
Messages postés6Date d'inscriptionvendredi 29 mai 2009StatutMembreDerniè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
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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
cs_tuomas
Messages postés6Date d'inscriptionvendredi 29 mai 2009StatutMembreDerniè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.
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 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.