VB.Net Accès aux objets depuis autre class

julien5108 Messages postés 4 Date d'inscription samedi 11 juin 2022 Statut Membre Dernière intervention 12 juin 2022 - 11 juin 2022 à 21:56
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 - 12 juin 2022 à 15:10
Bonjour,

Je me permet de poster ce message car je suis en difficulté sur un code Vb.net, en effet j'ai une Windows Form avec un label qui contient une seconde class.
Depuis cette seconde class je n'arrive pas à changer la propriété text de ce même label.
Même en faisant une instance, en passant par des propriétés .... je sèche
Pouvez vous m'éclairer sur le sujet ?
Merci par avance

7 réponses

julien5108 Messages postés 4 Date d'inscription samedi 11 juin 2022 Statut Membre Dernière intervention 12 juin 2022
Modifié le 11 juin 2022 à 22:46
Imports System.Data
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports System.IO.Ports
Imports System.Data.SqlClient
Imports System.Threading



Public Class Form1

      
  Dim x As New plc_input

  Public Property waiting As Boolean
        Get
            Return waiting
        End Get
       Me.Label1.Text = "AZERTY"
        Set(ByVal value As Boolean)
          
    End Property


  Private Sub get_status_Click(sender As Object, e As EventArgs) Handles get_status.Click
      
  x.enable=true
       
  End Sub
End Class



Public Class plc_input
   
    Dim y As New Form1

    Public Property id As Int16
    
    Private _press As Boolean = False


    Public Property enable As Boolean
        Get
            Return enable
        End Get

        Set(ByVal value As Boolean)

            y.Label1.Text = "AZERTY"
     y.waiting = True 

        End Set

    End Property

End Class

0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
11 juin 2022 à 22:58
Bonsoir

Pour poster un code par la suite, merci d'appliquer ce qui est décrit là
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Ce que tu expliques n'a pas de sens, et le code que tu montres non plus.

D'abord
un label qui contient une seconde class.
ça en winform, c'est impossible. Un label ne peut contenir qu'une string et une string n'est pas dérivable donc en aucun cas un label winform ne peut contenir une class

Ensuite
Depuis cette seconde class je n'arrive pas à changer la propriété text de ce même label.

Que je suppose en lien avec
    Public Property enable As Boolean
        Get
            Return enable
        End Get

        Set(ByVal value As Boolean)

            y.Label1.Text = "AZERTY"
     y.waiting = True 

        End Set

    End Property


Sauf que y n'est pas l'instance de Form1 qui est affichée et qui contient le label, mais l'instance interne à la class plc_input, instance que tu n'affiches pas


Et il y a un autre problème ici
  Public Property waiting As Boolean
        Get
            Return waiting
        End Get
       Me.Label1.Text = "AZERTY"
        Set(ByVal value As Boolean)
          
    End Property


Une propriété ne peut contenir qu'un Getter et un Setter, la ligne
       Me.Label1.Text = "AZERTY"
n'a rien à faire là.

Alors pour essayer de t'aider efficacement, peux tu expliquer ton besoin ? (et pas la solution que tu crois devoir appliquer, tu as peut-être raison, mais c'est pour comprendre le besoin sans être influencer par ton idée de solution)

0
julien5108 Messages postés 4 Date d'inscription samedi 11 juin 2022 Statut Membre Dernière intervention 12 juin 2022
12 juin 2022 à 07:27
Bonjour,

Alors concernant ta première réponse je vais reformuler : j'ai un Formulaire qui se nomme Form1.vb dans ce formulaire j'ai ma class form1 et une seconde class que j'ai crée "plc_input", un label ne peut contenir un class je suis entièrement d'accord avec toi, ma phrase n'est pas claire.

Concernant ta deuxième remarque, en effet je souhaiterai faire depuis ma class "plc_input" qui est contenue dans mon formulaire Form1, une modification du label "label1.text" contenu dans la class form1.

J'espère que tu comprendras ma démarche.
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
12 juin 2022 à 08:44
Oui, je pense avoir compris, même si ce que tu décris n'est toujours pas cohérent avec le code que tu présentes.

dans ce formulaire j'ai ma class form1 et une seconde class que j'ai crée "plc_input"
, ça pour moi c'est une classe imbriquée, déjà, il est extrêment rare d'avoir une bonne raison d'écrire une classe imbriquée.
Ensuite en voici un exemple représentatif.
Public Class Chapeau
    'du code de Chapeau

    Public Class Imbriquee
         'du code de Imbriquee
    End Class

    'éventuellement encore du code de Chapeau
End Class


On voit bien que le "end class" de Chapeau est après celui de Imbriquee.
Ce n'est pas le cas de ton code, toi tu as juste écrit 2 classes indépendantes dans un même fichier.
Ce qui est déconseillé pour un soucis de clarté du code.
Si 6 mois, un an, 2 ans après la réalisation de ton projet, tu veux faire une modification, plus c'est clair et plus ce sera facile.

La 2eme chose déconseillée que tu fais, c'est utiliser les nom de controles par défaut (Form1, Label1, etc...) et des noms de variables très très faibles (x et y).

Enfin ceci
Public Property id As Int16
, si tu codes pour Unity, ou si tu as expressément besoin de limiter la valeur maximale de ID, tu n'as pas le choix.
Mais dans tous les autres, ça ne sert à rien de choisir Int16 comme type, en effet la valeur ne pourra pas dépasser 32767 et en plus tu utiliseras quand même 64 bits pour le stocker en RAM sur un système 64 bits, et 32 bits sur un système 32 bits.

Pour ton problème proprement dit, je reviens avec un exemple
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
12 juin 2022 à 08:53
Au final, ce que j'interprète comme étant ton besoin est de transférer une data d'une classe vers un formulaire.
En attendant que je revienne avec un exemple qui reprend ta solution et pas ton besoin, tu peux lire cet article et tester le code exemple, ça répond à ton besoin, mais avec des solutions différentes.
https://codes-sources.commentcamarche.net/faq/11107-interactions-entre-form-en-net-c-et-vb-net
0

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

Posez votre question
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
12 juin 2022 à 10:40
Il y a un autre problème qui ne m'avait pas sauté au yeux ce matin.

Pour essayer ce que tu voulais, tu as dû mettre Label1 public, c'est totalement à l'encontre du principe d'un objet.
L'idée de base d'un objet est de protéger ses membres. Donc les membres doivent être Private ou Protected.

Pour affecter ces membres on utilise des Setter (et des Getter pour y accéder) ou dans les langages qui le permettent (comme VB.Net) des propriétés.

La raison est simple, si le membre est public n'importe quel autre programme peut y a accéder, c'est une faille béante.
Avec les Setter, on peut imposer un type de données d'entrée, vérifier sa cohérence, la mettre en forme etc....

Je vais te montrer un exemple dans lequel le label doit afficher un prix, cet exemple, montrera une utilisation par setter et une par propriété.

Le prix doit être un nombre, positif et l'affichage sera arrondi à 2 décimales, avec un texte et le symbole de l'euro.
La valeur du prix sera stockée dans une variable interne à la classe.
J'ai doublé le code dans le setter et la propriété (ce qui n'est pas bien) juste pour bien marquer que ce sont 2 solutions indépendantes et que tu peux n'en appliquer qu'une (dans ce cas la propriété est préférable car elle seule permet le binding)

Dans mon formulaire, il y a un label et 3 boutons (un qui affecte le prix avec le setter, un qui modifie le prix avec une propriété et un qui essaye de mettre un prix négatif)
Chaque contrôle et chaque variable a un nom fort.

Dans le fichier du formulaire frmJulien le code est
Public Class frmJulien
    Private lePrix As Double

    Private dataJulien As DataJulien

    Private Sub frmJulien_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SetPrixJulien(0)
        dataJulien = New DataJulien(Me) 'on crée une instance de DataJulien qui est liée à cette instance de formulaire
    End Sub

    ''' <summary>
    ''' Avec un Setter
    ''' </summary>
    ''' <param name="Prix"></param>
    Public Sub SetPrixJulien(Prix As Double)
        If Prix < 0 Then
            Throw New Exception("Le prix doit être positif")
        Else
            lePrix = Prix
            lblPrixJulien.Text = String.Format("Le prix affiché est de {0:N2} €", lePrix)
        End If
    End Sub

    ''' <summary>
    ''' Avec une propriété
    ''' </summary>
    ''' <returns></returns>
    Public Property Prix As Double
        Get
            Return lePrix
        End Get

        Set(value As Double)
            If value < 0 Then
                Throw New Exception("Le prix doit être positif")
            Else
                lePrix = value
                lblPrixJulien.Text = String.Format("Le prix affiché est de {0:N2} €", lePrix)
            End If
        End Set
    End Property

    Private Sub butSetter_Click(sender As Object, e As EventArgs) Handles butSetter.Click
        dataJulien.MetUnPrixParSetter()
    End Sub

    Private Sub butPropriete_Click(sender As Object, e As EventArgs) Handles butPropriete.Click
        dataJulien.ModifieUnPrixParPropriete()
    End Sub

    Private Sub butNegatif_Click(sender As Object, e As EventArgs) Handles butNegatif.Click
        dataJulien.TestUnPrixNegatif()
    End Sub
End Class


Dans le fichier de la classe le code est
Public Class DataJulien
    Private leFormulaire As frmJulien

    ''' <summary>
    ''' Dans le constructeur on fait passer la référence au formulaire qui existe déjà
    ''' </summary>
    ''' <param name="Formulaire"></param>
    Public Sub New(Formulaire As frmJulien)
        leFormulaire = Formulaire
    End Sub

    Public Sub MetUnPrixParSetter()
        leFormulaire.SetPrixJulien(12.3456)
    End Sub

    Public Sub ModifieUnPrixParPropriete()
        leFormulaire.Prix = leFormulaire.Prix + 2.65
    End Sub

    Public Sub TestUnPrixNegatif()
        leFormulaire.SetPrixJulien(-1)
    End Sub
End Class



Maintenant, si tu ne veux pas de Setter ni de propriété, mais que tu as compris qu'il faut protéger l'accès au label, alors il faudra utiliser une classe imbriquée.

Si c'est ça que tu veux, je te ferai un autre exemple
0
julien5108 Messages postés 4 Date d'inscription samedi 11 juin 2022 Statut Membre Dernière intervention 12 juin 2022
12 juin 2022 à 14:38
Merci beaucoup pour tes réponses, en effet pour réaliser mes essais j'ai essayer de mettre mon label1 en public.
J'utilisais déjà les propriétés pour faire passer les valeurs, le code publié est vraiment un exemple et ne reflète pas la réalité.
Je viens d'essayer comme tu m'as indiqué de faire passer la référence du formulaire d'origine dans l'instance de la class et effectivement cela fonctionne.
Cela veut-il dire que lorsque tu déclare une nouvelle instance de ta class sans faire passer la référence du formulaire et que tu veux accéder aux propriétés de ton label par exemple, visuellement tu ne le verras pas changer de valeur car le formulaire qui est lancé à l'écran n'est "le bon" ? En espérant que ma phrase est claire ....
Mais je pense avoir compris.
La fonction :

Public Sub New(Formulaire As frmJulien)
        leFormulaire = Formulaire
    End Sub



Est lancée au début de ton instance ?
Je ne connaissais pas cette façon de faire. En tout cas merci beaucoup pour toutes ces informations.
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
12 juin 2022 à 15:10
Si tu étais bâtisseur de maison, la classe c'est le plan de la maison et l'instance c'est la maison construite.

Le fait d'écrire New MaClasse() veut dire construire, une maison.
Avec le même plan tu peux construire 100 maisons identiques (c'est le secret des maisons pas trop chères, y'a qu'une étude, les matériaux sont achetés en gros etc...)

Par contre, une fois construite le nouveau propriétaire peut choisir de pendre les volets en bleu et son voisin en vert.

Toi, tu peignais une maison en vert, mais tu regardais celle qui est en bleu.
0
Rejoignez-nous