Récupérer une variable

Résolu
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016 - 19 avril 2016 à 11:35
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 - 25 avril 2016 à 10:09
Bonjour,
J'espère que vous allez tous bien et que votre weekend a était doux.

Aujourd'hui, en essayant de récupérer la valeur d'une variable provenant d'un autre formulaire je me suis aperçu que cela ne fonctionner pas...

J'ai regarder un peu tout les topiques parlant de variable VB.net , j'ai lut des cours proposer sur différents site d'aide mais je ne trouve toujours pas la solution..

Alors voilà en gros j'ai un formulaire qui contient une TextBox, un formulaire qui a besoin de la valeur de cette TextBox et une page de type Class ou je réalise toutes mes fonctions.

Dans une première fonction je récupère la valeur de la variable (qui est le nom d'un dossier que je créer) et dans ma deuxième en gros je vais déplacer un fichier dans ce dossier donc j'ai besoin de connaître la valeur de la variable. Malheureusement lorsque je teste de faire un MsgBox pour voir si ma variable c'est bien stocké , aucune réponse ...

Je vous le code des deux fonctions :

Public Shared Sub begindoe()
 
        If (String.IsNullOrEmpty(Form2.TextBox1.Text) Or String.IsNullOrEmpty(Form2.TextBox2.Text) Or String.IsNullOrEmpty(Form2.TextBox3.Text)) Then
            MsgBox("Remplisser toute les cases pour pouvoir poursuivre la création du DOE", vbCritical)
        Else
            Dim nomcodefolder As String = Form2.TextBox1.Text
            Dim nomdoc As String = "DOE_" + Form2.TextBox1.Text + "_" + Form2.TextBox2.Text
            Dim nomcodefile As String = Form2.TextBox3.Text
            My.Computer.FileSystem.CreateDirectory("C:\test\" + nomdoc)
            MsgBox("Vérification des données entrées :" & vbNewLine & vbNewLine & "Code du dossier : " + nomcodefolder & vbNewLine & "Code des fichiers : " + nomcodefile & vbNewLine & "Nom du DOE : " + nomdoc, vbInformation, "Récapitulatif")
            Form3.Show()
            Form2.Close()
        End If
 
    End Sub
 
 
Public Shared Sub deplacer()
 
        Dim namepath As String = "DOE_" + Form2.TextBox1.Text + "_" + Form2.TextBox2.Text
        Dim equipname As String = Form3.ComboBox1.SelectedItem
        Dim FileToMove As String = Form3.ListBox1.SelectedItem
        Dim MoveLocation As String = "C:\test\" + namepath
        Dim samename As String = Directory.GetFiles(MoveLocation).ToString
 
        For Each increm As String In samename
            Form3.ListBox1.Items.Add(increm)
        Next
        If System.IO.File.Exists(FileToMove) = True Then
            System.IO.File.Move(FileToMove, MoveLocation)
            MessageBox.Show("fichier déplacer vers" + MoveLocation)
        End If
    End Sub

16 réponses

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
19 avril 2016 à 14:00
En .Net la variable globale est déconseillée (et comme là on peut largement s'en passer, je ne vais même pas te montrer).

D'ailleurs, même si je java n'est pas ma spécialité c'est plus ou moins pareil.

Un formulaire est une classe comme une autre avec "juste" une interface graphique, donc ce que j'écris en dessous est valable pour les 2.

Une variable que tu déclares dans une méthode (sub ou function), n'est accessible que dans cette méthode, et qu'après la ligne ou elle est déclarée

Une variable que tu déclares dans une classe, peut importe ou tant que ça n'est pas dans une méthode, une propriété, etc....n'est par défaut accessible que dans cette classe.
On pourrait la rendre publique, mais c'est une mauvaise pratique.

Un exemple, je suppose que tu es en France, tu fais une classe de calcul de thermodynamique, comme tu as des thermomètres en degrés Celcius, tu veux que tes entrées et tes sorties soient en Celcius.
Cependant tous les calculs se font en Kelvin.

Si tu mets la variable température publique, elle sera en Celcius, à chaque calcul, il faudra intégrer la conversion. C'est déjà pas terrible.
Mais ce qui serait encore pire, serait qu'un anglais veuillent t'acheter ta classe à condition de disposer d'un point d'entrée en Fahrenheit, il faudra que tu réécrives chaque conversion....

Si tu laisses ta variable en Kelvin (pas de conversion dans les calcul) privée, et que tu mets une propriété Celsius, une Kelvin et une Fahrenreit qui servent de point d'entrée/sortie t'es peinard et c'est une bonne pratique. En plus tu peux binder les interfaces graphique sur des propriétés.
Tu peux aussi utiliser des méthodes d'affectation et lecture (dites setter et getter) mais là pas de binding.


Les propriétés et les méthodes sont les deux façons les plus courantes de passer des infos d'un objet à l'autre.

Et tu les utilises déjà....
Quand tu affectes un texte à un bouton, tu utilise la propriété Text d'une instance de la classe Button

A cette ligne
System.IO.File.Exists(FileToMove)
Tu envoie à la classe Shared File un chemin de fichier pour savoir s'il existe ou pas, ce à quoi elle répond par vrai ou faux

       For Each increm As String In samename
            Form3.ListBox1.Items.Add(increm)
        Next

Ca n'est pas la bonne pratique, tu as rendu ListBox1 publique...

En apparté, prend l'habitude de nommer tes contrôles avec le même esprits que les variables, cette listBox affiche des chemins de fichier donc sont nom doit y faire penser.
Une autre bonne pratique et de mettre un préfixe de 3 ou 4 lettres par type de contrôle, par exemple lstbFichiers => listBox ou y'a des fichiers

On peut aussi passer des paramètres à un constructeur, dans ton autre post tu le fais à cette ligne
Dim Fi As New System.IO.FileInfo(files) 



On peut encore utiliser des événements, par exemple, quand tu écris du code correspond au click sur un bouton, tu t'es abonné (enfin VS l'a fait pour toi) à cet événement et à écris une méthode
avec les paramètres envoyé par cet événement.


Voici un code exemple avec l'idée de thermodynamique plus haut:
	''' <summary>
	''' Classe exemple qui calcule la variation de pression d'une enceinte en fonction de la température
	''' On utilise PV/T = constante
	''' </summary>
	Public Class Thermondynamique
		'Variables internes "indépendantes" sans propriétés
		Private pressionInitiale As Double
		Private temperatureInitiale As Double

		''' <summary>
		''' Constructeur qui initialise le calcul
		''' </summary>
		''' <param name="PressionInitiale">en Pascal</param>
		''' <param name="TemperatureInitiale">en Kelvin</param>
		''' <param name="Volume">en m3</param>
		Public Sub New(ByVal PressionInitiale As Double, ByVal TemperatureInitiale As Double, ByVal VolumeInitial As Double)
			Me.pressionInitiale = PressionInitiale
			Me.temperatureInitiale = TemperatureInitiale
			Volume = VolumeInitial

			temperature = TemperatureInitiale
			pression = PressionInitiale
		End Sub

		#Region "Propriétés"
		''' <summary>
		''' Le volume ne changera pas, mon enceinte n'est pas censée être un ballon, j'écris donc une propriété sans variable interne
		''' Cela reste différent d'une variable publique dans le sens ou je peux, si je veux, ajouter un jour une variable privée.
		''' </summary>
		Public Property Volume() As Double


		Private pression As Double
		''' <summary>
		''' Pression en Pascals
		''' Proprité en lecture seule, c'est notre résulat
		''' </summary>
		Public ReadOnly Property PressionPa() As Double
			Get
				Return pression
			End Get
		End Property

		''' <summary>
		''' Pression en Bars, et si tu la veux en PSI, ben tu ajoutes une propriété
		''' Proprité en lecture seule, c'est notre résulat
		''' </summary>
		Public ReadOnly Property PressionBar() As Double
			Get
				Return pression / 100000
			End Get
		End Property

		Private temperature As Double
		''' <summary>
		''' Température en °Kelvin
		''' </summary>
		Public Property TemperatureK() As Double
			Get
				Return temperature
			End Get
			Set(ByVal value As Double)
				temperature = value
				Calcul()
			End Set
		End Property

		''' <summary>
		'''  Température en °Celcius
		''' </summary>
		Public Property TemperatureC() As Double
			Get
				Return temperature - 273.5
			End Get
			Set(ByVal value As Double) 'là j'affecte la propriété, comme ça elle déclenchera le nouveau calcul
				TemperatureK = value + 273.5
			End Set
		End Property
		#End Region

		Private Sub Calcul()
			pression = pressionInitiale * temperature / temperatureInitiale
			GenerePressionChanged()
		End Sub

		#Region "Méthodes"

		''' <summary>
		''' Setter
		''' </summary>
		''' <param name="Value"></param>
		Public Sub SetCelcius(ByVal Value As Double)
			TemperatureC = Value 'là j'affecte la propriété, puisqu'elle fait déjà la conversion et qu'ensuite elle déclenche le calcul
		End Sub

		''' <summary>
		''' Getter
		''' </summary>
		''' <returns></returns>
		Public Function GetBar() As Double
			Return PressionBar
		End Function

		''' <summary>
		''' Methode qui demande un truc et en retroune un autre
		''' </summary>
		''' <param name="Celcius"></param>
		''' <returns></returns>
		Public Function BarFromCelcius(ByVal Celcius As Double) As Double
			TemperatureC = Celcius
			Return PressionBar
		End Function

		#End Region

		#Region "Evénement"

		Public Delegate Sub PressionChangedEvent(ByVal PressionBar As Double)

		Public Event PressionChanged As PressionChangedEvent

		Private Sub GenerePressionChanged()
			'on vérifie s'il y a un abonné à l'evenement
			RaiseEvent PressionChanged(PressionBar) 'si oui on génère
		End Sub
		#End Region


et dans la classe cliente
			Dim maThermo As New Thermondynamique(100000, 300, 1)

			maThermo.TemperatureC = 25
			Dim pression2 As Double = maThermo.PressionBar

			maThermo.SetCelcius(40)
			Dim pression3 As Double = maThermo.GetBar()

			Dim pression4 As Double = maThermo.BarFromCelcius(55)

0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
19 avril 2016 à 14:00
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
19 avril 2016 à 14:26
Rebonjour,
J'ai pas très bien compris ce que tu m'expliquer mais ce que j'ai compris c'est qu'il me faut un constructeur pour ma forme qui vas afficher la valeur de la variable.

Du coup j'en est créer un puis j'ai changer ma fonction "déplace" qui justement me permet de deplacer mon fichier et de la renommer à l'endroit qui est contenue dans la variable qui ne veux pas se transmettre dans l'autre formulaire.

Voila j'ai réaliser ceci :

Mon constructeur :

Public Class NewDOE
    Public Property namepath As String
 
 
    Public Sub New()
        namepath = "SANSNOM"
    End Sub
 
 
    Public Sub New(namepath As String)
        Me.namepath = namepath
    End Sub
End Class


Ma fonction déplacer :

Public Shared Sub deplacer(namepath As String)
 
       Dim equipname As String = Form3.ComboBox1.SelectedItem
       Dim FileToMove As String = Form3.ListBox1.SelectedItem
       Dim MoveLocation As String = "C:\test\" + namepath
       Dim samename As String = Directory.GetFiles(MoveLocation).ToString
 
       For Each increm As String In samename
           Form3.ListBox1.Items.Add(increm)
       Next
       If System.IO.File.Exists(FileToMove) = True Then
           System.IO.File.Move(FileToMove, MoveLocation)
           MessageBox.Show("fichier déplacer vers" + MoveLocation)
       End If
   End Sub


L'appel de ma fonction lors du clic :

Private Sub OriginButton2_Click(sender As Object, e As EventArgs) Handles OriginButton2.Click
       Dim val As String
       val = "DOE_" + Form2.TextBox1.Text + "_" + Form2.TextBox2.Text
       allfunction.deplacer(val)
 
   End Sub


Malheureusement toujours la même erreur , la variable ne veut pas être transférer :/
Merci de pouvoir me secourir :p
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
Modifié par Whismeril le 19/04/2016 à 16:51
Le constructeur n'est pas une obligation, c'est une option.

Ta fonction deplacer est une méthode de classe, donc elle fonctionne sans instance, comme File.Exist, donc y a pas de constructeur appelé puisqu'il n'y a pas d'instance.

Ensuite quelle variable n'est pas transférée car dans cette méthode il y a plein de choses qui n'ont déjà rien à faire dans une méthode d'instance mais encore moins dans une méthode de classe.
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
22 avril 2016 à 09:30
Bonjour,
Désolé de mon absence j'étais malade.
En gros je vais tout vous expliqué ( ça risque d'être long ) :
Les fichiers que j'ai : Form1 , Form2 , Form3 , Form4, allfunction (stocke mes fonctions)

Mon problème c'est que dans ma Form2 qui ressemble à ça :



( Le bouton " Next " tenez pas compte c'était juste un vieux test )
Je récupère les trois champs que vous voyez à l'aide de cette fonction qui est stocké dans allfunction :


Public Shared Sub begindoe()

If (String.IsNullOrEmpty(Form2.TextBox1.Text) Or String.IsNullOrEmpty(Form2.TextBox2.Text) Or String.IsNullOrEmpty(Form2.TextBox3.Text)) Then
MsgBox("Remplisser toute les cases pour pouvoir poursuivre la création du DOE", vbCritical)
Else
Dim nomcodefolder As String = Form2.TextBox1.Text
Dim nomdoc As String = "DOE_" + Form2.TextBox1.Text + "_" + Form2.TextBox2.Text
Dim nomcodefile As String = Form2.TextBox3.Text
My.Computer.FileSystem.CreateDirectory("C:\test\" + nomdoc)
MsgBox("Vérification des données entrées :" & vbNewLine & vbNewLine & "Code du dossier : " + nomcodefolder & vbNewLine & "Code des fichiers : " + nomcodefile & vbNewLine & "Nom du DOE : " + nomdoc, vbInformation, "Récapitulatif")
Form3.Show()
Form2.Close()
End If

End Sub


Et que j’appelle de cette manière :


Private Sub OriginButton1_Click(sender As Object, e As EventArgs) Handles OriginButton1.Click
allfunction.begindoe()

End Sub


Et donc comme vous voyez je récupère bien mon contenue dans trois variables bien différentes qui sont : "nomcodefolder" , "nomcodefile" et "nomdoc" .
Et à ce moment là j'aimerais bien les envoyés dans ma Form3, donc j'ai eu l'idée de créer un constructeur qui vas prendre en paramètre ces trois variables et qu'au lieu de faire Form3.Show() uniquement , j'instancie ma form3 comme ça :


Dim p As New Form3(nomcodefolder,nomcodefile,nomdoc)


Voilà c'est comme ça que je le vois , je sais pas si c'est la meilleure façon de penser ...
Merci de votre aide et j'espère que j'ai étais clair :)
0

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

Posez votre question
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 avril 2016 à 09:33
Bonjour,

Oui c'est très clair.
Et ça ne marche pas?

Peux tu montrer le constructeur de Form3
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
22 avril 2016 à 10:26
Re,
Beh en gros je sais pas comment m'y prendre...
Je sais pas ou écrire mon constructeur , je sais pas ou mettre le constructeur que visualbasic génère ( InitializeComponent ) ...
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 avril 2016 à 10:52
Voici un exemple avec form2

Public Class Form2

    Public Sub New()

        ' Cet appel est requis par le concepteur.
        InitializeComponent()

        ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().

    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub
End Class


juste après avoir tapé new, ut cliques sur Entrée et VS écrit le reste pour toi.
Il ne te reste plus qu'à ajouter tes paramètres entre les parenthèses, c'est une méthode comme les autres.
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
22 avril 2016 à 11:16
Non mais en faite je sais pas comment m'y prendre ...
Est-ce qu'il faut que je fasse ce constructeur :


Public Property p1 As String
Public Property p2 As String
Public Property p3 As String

Public Sub New(nomcodefolder As String, nomcodefile As String, nomdoc As String)
Me.p1 = namepath
Me.p2 = namepathsuite
Me.p3 = nomdoc
End Sub


Si oui je le met ou ?
Et ça je le met ou ? :


Public Sub New()

InitializeComponent()



End Sub


Comme je l'ai dis j'ai : Form2.vb , Form3.vb et allfunction.vb ...
Parce qu'il faut bien le créer ce constructeur , si je lui dis pas de prendre trois variables de type string en paramètre à aucun moment il vas le savoir ... Et c'est ça qui me bloque je sais pas ou le mettre quoi .
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 avril 2016 à 11:47
Oui ca c'est bien, mais il ne faut pas oublier InitializeComponent()

    Public Property p1 As String
    Public Property p2 As String
    Public Property p3 As String

Public Sub New(nomcodefolder As String, nomcodefile As String, nomdoc As String)
    Me.p1 = namepath
    Me.p2 = namepathsuite
    Me.p3 = nomdoc

    InitializeComponent()
End Sub 

0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
22 avril 2016 à 13:36
Ah d'accord merci et juste pour justement initialiser les valeurs dans mon fichier allfunction.vb je fais comment ?
Parce que j'ai fais ça et j'ai une erreur de type : Fin d'instruction attendue.


Dim p New Form3(nomdoc,nomcodefile,nomcodefolder)
Form3.Show()
Form2.Close()
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 avril 2016 à 13:59
Ces trois lignes doivent se suffirent à elles mêmes.
Il manque peut être un end quelque chose, if, sub, Fuction, etc...
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
22 avril 2016 à 14:04
Bizarre....
Pourtant quand je passe ma souris sur Form3.Show() il me dise :
"Une référence à un membre non partagé requiert une référence d'objet " ...
Serieux la :/
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
22 avril 2016 à 18:03
ha oui, j'avais mal lu ton code.
           Dim p New Form3(nomdoc,nomcodefile,nomcodefolder)

l'instance de Form3 est dans la variable p.
Donc c'est avec p qu'il faut travailler par la suite.

0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
25 avril 2016 à 09:01
Bonjour,
Ca veut dire qu'il faut simplement faire un "p.Show()" ???
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2016 à 09:53
Oui
0
NarqoArts Messages postés 23 Date d'inscription lundi 18 avril 2016 Statut Membre Dernière intervention 25 avril 2016
25 avril 2016 à 09:16
Rebonjour,
Pour éviter de surchargé ce sujet je vais en créer un nouveau avec de nouvelles problématiques :)
0
Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
25 avril 2016 à 10:09
Par contre, de ce que tu montres ici,
tu n'utilise pas VB.Net de la façon dont il est prévu.

En effet, c'est un langage objet, la philosophie serait de faire un ou des objets métiers.
Certes juste pour déplacer et renommer des fichiers ça peut paraître riche, mais il est plus aisé de passer un objet de form en form (qui sont elles même des objets), il aurait sa vie propre et prendrait ou donnerait des infos là ou c'est nécessaire.

Ce que tu as écrit ça fait plutôt VB6 ou VBA.

Je ne te dis pas de tout reprendre, mais d'essayer sur un futur projet de penser objet, d'une part .Net fonctionne comme ça et d'autre part une fois compris c'est très puissant.
0
Rejoignez-nous