IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment faire appel à une sub depuis une class vb


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire en biologie moléculaire
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire en biologie moléculaire
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Comment faire appel à une sub depuis une class vb
    Bonjour à toute et à tous.

    Je me permet de poster un discutions pour éclairer ma lanterne.

    Je préviens, il y a pas de vrai problème en sois. C'est juste une question purement de connaissance.

    Donc je m'explique. J'ai dans l'idée de faire un projet de création de compte avec stockage des différents éléments composant le compte dans une base de donnée.

    Pour bien organiser mon code, je crée un class.vb pour y mettre tout mes lignes qui pourrait être récurrente.

    Ensuite, je crée une form1 avec un bouton qui change son texte quand je suis connecté ou pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Imports System.Data.SqlClient
     
     
    Public Class Appel_de_code
     
     
     
        Dim cnString As String = "Data Source=nom de mon serveur;Initial Catalog=Utilisateur;Integrated Security=True;Pooling=False"
        Dim cn As SqlConnection
     
        Public Sub Connection_serveur()
            Dim a As New Listing_d_employer
     
     
            If a.Button1.Text = "Se connecter" Then
     
                cn = New SqlConnection(cnString)
     
                Try
                    If cn.State = ConnectionState.Closed Then
                        cn.Open()
                        a.Button1.Text = "Se deconnecter"
                    End If
     
                Catch ex As Exception
                    MessageBox.Show("Impossible de se connecter à la base de donnée !!!")
                End Try
     
            Else
     
                cn.Close()
                a.Button1.Text = "Se connecter"
            End If
     
     
        End Sub
    Donc ci-dessus ma class.vb ou j'ai la structure de mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Imports System.Data.SqlClient
     
     
    Public Class Listing_d_employer
     
        Dim a As New Appel_de_code
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
            a.Connection_serveur()
     
     
     
        End Sub
    End Class
    Et ci-dessus mon événement pour le clik dans ma form1.vb.

    Donc ma question est la suivant:

    Quand je place le code suivant dans l'événement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Imports System.Data.SqlClient
     
     
    Public Class Listing_d_employer
        Private cnstring As String = "Data Source=nom de mon serveur;Initial Catalog=Utilisateur;Integrated Security=True;Pooling=False"
        Private cn As SqlConnection
     
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
     
     
     
            If Button1.Text = "Se connecter" Then
     
                cn = New SqlConnection(cnString)
     
                Try
                    If cn.State = ConnectionState.Closed Then
                        cn.Open()
                        Button1.Text = "Se deconnecter"
                    End If
     
                Catch ex As Exception
                    MessageBox.Show("Impossible de se connecter à la base de donnée !!!")
                End Try
     
            Else
     
                cn.Close()
                Button1.Text = "Se connecter"
            End If
     
     
     
        End Sub
    End Class
    Cela fonctionne. Mais quand je fait appel à la sub à partir de ma class.vb pour l'événement dans la form1, cela ne fonctionne pas.
    Exemple du code en dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Imports System.Data.SqlClient
     
     
    Public Class Listing_d_employer
        Private cnstring As String = "Data Source=nom de mon serveur;Initial Catalog=Utilisateur;Integrated Security=True;Pooling=False"
        Private cn As SqlConnection
        Dim a As New Appel_de_code
     
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
            a.Connection_serveur()
     
     
        End Sub
    End Class
    Du coup, j'aimerais savoir pourquoi?

    Personnellement, comme je vous l'ai dit, cela est pas vraiment un problème vu que j'arrive à mes fins. Mais je vous avoue que cela serais plus agréable d'avoir un class.vb où je mettrais tout mes procédures, instruction ect, pour avoir un code structuré et ainsi aérer ce dernier pour le rendre lisible pour moi et les autres éventuellement.

    De plus, je préviens, je suis un amateur éclairé et le code que j''ai écris net pas de moi. Merci à ProjetX7 et à tout les autres de prendre le temps nous instruire.

    Merci d'avance de votre aide et au plaisir de vous lire.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire en biologie moléculaire
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire en biologie moléculaire
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour à toute et à tous.

    Je me permet de remonter ma discutions.


    Vu le nombre de réponse, c'est que je me suis, sans doute, mal exprimer.


    Donc je vais essayer de reformuler.

    En fait, je ne comprend pas pourquoi le code que j'ai mis dans ma class nommé "Appel_de_code.vb", ne fonctionne pas. C'est juste un code simple qui demande si il y a une ouverture du serveur et si cela n'est pas le cas, ce dernier s'ouvre pour pouvoir se connecter. Rajouter à ça, un change de label d'un bouton de "Se connecté" à " Se déconnecté".

    Ainsi, quand je place le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
     
    Public Class Appel_de_code
     
     
        Public Sub Connection_serveur()
     
            Dim cnString As String = "Data Source=NOM_DE_SEERVEUR;Initial Catalog=Utilisateur;Integrated Security=True;Pooling=False"
            Dim cn As SqlConnection
            cn = New SqlConnection(cnString)
     
            Dim a As Listing_d_employer
            a = New Listing_d_employer
     
            If a.Button1.Text = "Se connecter" Then
     
     
     
                Try
                    If cn.State = ConnectionState.Closed Then
                        cn.Open()
                        a.Button1.Text = "Se deconnecter"
                    End If
     
                Catch ex As Exception
                    MessageBox.Show("Impossible de se connecter à la base de donnée !!!")
                End Try
     
            Else
     
                cn.Close()
                a.Button1.Text = "Se connecter"
            End If
     
     
        End Sub
     
     
    End Class
    J'ai déclarer et instantifié " a" qui est une instance de type " new listing_employer" de la classe listing_employer pour pouvoir accès au contrôleur et leur propriété.
    Ensuite je déclare et instantifis " z " qui est une instance de type " new appel_de_code" de la classe Appel_de_code pour pouvoir accédé à la procédure " Connection_serveur" (ici je ne l'ai pas fait apparaître dans le code, j'ai juste mis les codes principaux pour que vous ayez un visuel simple).


    Mais cela ne fonction pas.


    Par contre, quand je met ce code dans l'evenement clik du bouton, cela fonction. Comme vous pouvez le voir en dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    Imports System.Data.SqlClient
     
    Public Class Listing_d_employer
     
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
     
     
     
     
            Dim cnString As String = "Data Source=NOM_DE_SEERVEUR;Initial Catalog=Utilisateur;Integrated Security=True;Pooling=False"
            Dim cn As SqlConnection
            cn = New SqlConnection(cnString)
     
            If Button1.Text = "Se connecter" Then
     
     
     
                Try
                    If cn.State = ConnectionState.Closed Then
                        cn.Open()
                        Button1.Text = "Se deconnecter"
                    End If
     
                Catch ex As Exception
                    MessageBox.Show("Impossible de se connecter à la base de donnée !!!")
                End Try
     
            Else
     
                cn.Close()
                Button1.Text = "Se connecter"
            End If
     
     
     
     
        End Sub
     
     
     
    End Class
    Quelqu'un aurait une explication?

    Merci d'avance

  3. #3
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Dans la classe Listing_d_employer, tu instancies un objet Appel_de_code.
    Et dans Appel_de_code, tu instancies un objet Listing_d_employer.

    Est-ce bien normal ?
    Est-il nécessaire d'écrire une classe Appel_de_code qui ne fera rien d'autre que d'utiliser d'autres classes fournies par le système et accessibles partout ?

    Si l'objectif est de te créer le "coffre à outils" de ton projet, un Module pourrait peut-être faire l'affaire.

    Je sais que ces commentaires ne solutionneront pas ton problème mais peut-être t'inspireront-ils ...

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire en biologie moléculaire
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire en biologie moléculaire
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Dans la classe Listing_d_employer, tu instancies un objet Appel_de_code.
    Et dans Appel_de_code, tu instancies un objet Listing_d_employer.

    Est-ce bien normal ?
    Oui, je suis obligé de faire ça pour appeler les fonctions/méthodes dans la class Listing_d_employer et lier les objets/contrôleurs (bouton en l’occurrence) de la class Listing_d_employer dans la class Appel_de_code pour ainsi accédé aux propriété .

    De plus, j'ai pensé au module pour mettre tout mon code. Mais idem, cela ne fonctionne pas. Je suis toujours dans la même problématique.

    Merci en tout cas de l'intervention.

  5. #5
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Il n'y a pas de raison que tu n'y arrives pas avec un module. Poste le code, tu auras sûrement de l'aide.
    Par contre, les instanciations en récursivité croisées sont fort douteuses ...

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire en biologie moléculaire
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire en biologie moléculaire
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Re,


    Par contre, les instanciations en récursivité croisées sont fort douteuses ...
    Je vous avoue que si je peux éviter cela avec un module, c'est avec plaisir. Je veux opter pour le plus simple.

    Il n'y a pas de raison que tu n'y arrives pas avec un module. Poste le code, tu auras sûrement de l'aide.
    En ce qui concerne le code, je l'ai mis plus haut. La seul chose qui diffère, est le nom de mon serveur.

  7. #7
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Ok, je t'envoie un exemple de procédures stockées dans un module demain matin, je n'ai plus accès à mon PC ce soir
    Bonne soirée

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Voici l'exemple d'un module qui contient une variable, une Sub et une Function accessibles de tout ton projet.
    Je joins ce projet de tests pour toi expérimenter : MultiForm.zip
    Le code du module:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Module MiModule
        Public VariablePublica As Integer  ' p. ejemplo
     
        Public Sub UnaSub()
            MessageBox.Show("UnaSub")
        End Sub
     
        Public Function UnaFuncion(ByVal S As String) As String
            Return S & " en UnaFuncion"
        End Function
     
    End Module
    Le code d'un Form qui utilise les éléments de ce module :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    '... ... ...
      Private Sub FPrimero_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            VariablePublica = 15
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            FSegundario.Show()
            UnaSub()
            MessageBox.Show(UnaFuncion("Azerty"))
        End Sub
    '... ... ...
    Voici un autre exemple où un module appelé DBConnector teste la connexion à la DB :
    Et voici comment est appelé ce test. Ici, le nom du module a été écrit dans l'appel de la procédure (DBconnector.TestDB()). C'est parfois nécessaire mais dans tous les cas, cela rend le code plus lisible.
    Le module DBConnector (pour une DB nommée DB_Astuce.mdb) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    Imports System.Data.OleDb
    Module DBconnector
        Public Function DB_ASTUCE() As String
            Dim Connection = "Provider= MICROSOFT.JET.OLEDB.4.0; Data Source=" & My.Settings.APP_PATH & "\DataBase\DB_ASTUCE.mdb"
            Return Connection
        End Function
     
        Public Function TestDB() As Boolean  ' True ===> DB ok, False ===> DB pas ok
            Dim DB_ASTUCE_CONNECT = New OleDbConnection
            DB_ASTUCE_CONNECT.ConnectionString = DB_ASTUCE()
            Try
                DB_ASTUCE_CONNECT.Open()
                DB_ASTUCE_CONNECT.Close()
            Catch
                DB_ASTUCE_CONNECT.Dispose()
                Return False
            End Try
            DB_ASTUCE_CONNECT.Dispose()
            Return True
        End Function
    End Module
    et son appel dans un Form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    '... ... ...
            '**** Vérification de la connection vers la DB
            Try
                If Not DBconnector.TestDB() Then
                    MsgBox("Base de donnée non trouvée, veuilliez configurer le chemin d'accès...", MsgBoxStyle.Critical + vbSystemModal, "Erreur...")
                End If
            Catch ex As Exception
                MsgBox("Base de donnée non trouvée, veuilliez configurer le chemin d'accès...", MsgBoxStyle.Critical + vbSystemModal, "Erreur...")
            End Try
    '... ... ...
    Je pense que ces exemples t'apportent tous les outils dont tu as besoin. J'espère qu'au moins, ils t'inspireront.

    Très bonne journée ...

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Technicien de laboratoire en biologie moléculaire
    Inscrit en
    Juillet 2021
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien de laboratoire en biologie moléculaire
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juillet 2021
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Rebonjour à toute et tous.

    Je viens de trouver la solution.

    Cela était assez bête au final. En fait, au lieu d'instancier une variable pour avoir accès à la class ou au module. Fallait juste que j'utilise les propriétés de manière logique. Merci pour l'exemple de la voiture dans la partie III du cours VB.net. C'est ça qui m'a donné la solution.

    J'explique mon erreur et la solution pour que cela aide, éventuellement une autre personne.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    Public Class Appel_de_code
     
            Sub Connection_serveur()
                Dim a As New listing_employer
     
                If a.button1.text = "Se connecter" Then
     
                    'Mon instruction
     
                End If
     
            End Sub
        End Class
    Donc ici, j'instancie "a" comme type " listing_employer" de la class "listing-employer".
    Mon erreur est ici, car quand je veux appeler ma sub "connection_serveur()" dans la class "listing-employer", je suis obligé de refaire une autre variable que je dois instancier du type "Appel_de_code".

    Alors que cela est pas nécessaire. Faut juste que j'utilise les propriété (attribues) de la class (peux importe laquelle) dans ma sub, en l’occurrence "sub connection_serveur()".

    Ainsi en dessous, le code corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Module Appel_de_code
     
            Sub Connection_serveur()
     
     
                If listing_employer.button1.text = "Se connecter" Then
     
                    'Mon instruction
     
                End If
     
            End Sub
    End Module
    Cependant, il est préférable d'utilisé une module qu'une class. Car avec le module, vous pouvez appelez vos function/sub partout dans votre code. Alors que avec une class vous sera obligé d'instancié une variable du type de votre class pour appeler votre function/sub.

    Merci en tout cas à Phil Rob pour les idées. Je vais rester sur le module pour écrire tout mes fonctions.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XSLT] [MSXML] probleme d'appel a javascript
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 16/01/2006, 14h01
  2. probleme d'appel de fonction!
    Par transistor49 dans le forum C++
    Réponses: 5
    Dernier message: 11/03/2005, 10h46
  3. Réponses: 8
    Dernier message: 13/08/2004, 12h32
  4. [Reflection] Probleme d'appel newInstance()
    Par SEMPERE Benjamin dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 17/06/2004, 13h15
  5. [VB.NET] Appeler une sub public dans un module de form
    Par SergeF dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/06/2004, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo