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

Windows Forms Discussion :

Pointeur en VB


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut Pointeur en VB
    Bonjour
    J'ai du mal à faire un pointeur/référence sur une variable.
    J'ai un form1 dans lequel il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Public C As New class
    Dans cette classe, il y a une structure publique déclarée nommée Entry, et également Public Entries As New ArrayList 'contient que des types Entry
    Dans un autre formulaire, disons form2, il y a dans le Load :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim NewEntry As class_cMoney.Entry
                For Each NewEntry In Form1.C.Entries
                    If NewEntry.Key = Me.Tag Then
                        GoTo suite
                    End If
                Next
    Avec cela, je localise donc une Entry dans l'array Entries par sa propriété Key. J'aimerai sauvegarder "l'adresse" de cette entrée dans une variable pour pouvoir éditer par la suite cette entrée de l'array sans avoir à refaire un For Each et je ne vois pas comment faire, j'ai essayé plusieurs choses mais à chaque fois, mes 2 variables (l'entrée de l'array et la variable censée pointer) ont des valeurs indépendantes.
    Sauriez vous comment faire ?

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    salut,

    je suis pas un pro mais ça devrait marcher :

    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
     
    Dim MyEntrie As New class_cMoney.Entry
     
    Dim NewEntry As class_cMoney.Entry
    For Each NewEntry In Form1.C.Entries
         If NewEntry.Key = Me.Tag Then
              MyEntrie = NewEntry
              NewEntry.Key = "toto"
              GoTo suite
         End If
    Next
     
    suite :
     
    If MyEntrie.Key = "toto" Then
         MessageBox.Show("ça marche !")
    end if

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Non ça ne fonctionne pas, la valeur de MyEntry reste indépendante de NewEntry trouvé dans la boucle.

    J'ai écrit un exemple, en gros, ça donne ça

    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
    Public Class Form1
     
        Dim Array As New ArrayList
        Dim Pointeur as ???
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Array.Add("truc")
            Array.Add("machin")
     
            Dim ArrayItem As String
            For Each ArrayItem In Array
                If ArrayItem = "machin" Then
                    Pointeur = Adress(ArrayItem)
                    '...
                    'mes opérations
                    '...
                    Exit Sub
                End If
            Next
        End Sub
     
        Private Sub Routine()
            pointeur = "nouveau text" 'on veut ici modifier le ArrayItem trouvé dans la boucle ayant comme valeur "machin"
        End Sub
    End Class

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Je dois être fatigué mais la je pige plus !
    A la ligne Pointeur = Adress(ArrayItem), si on fait ArrayItem = "nouvelle valeur", la valeur de Array(2) reste à "machin"

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Je viens de tester ce code :

    dans un Userform, j'ai 5 Label
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim MyLabel As New Label
     
    		Dim NewLabel As Label
    		For Each NewLabel In Me.Controls
    		     If NewLabel.Text = "label3" Then
    		          MyLabel = NewLabel
    		          NewLabel.Text = "Label Trouvé"
    		     End If
    		Next
     
    		If MyLabel.Text = "Label Trouvé" Then
    		     MessageBox.Show("ça marche !")
    		End If
    => c'est bien ce qu'il me semblait, il fonctionne. Remarque, ceci marche uniquement pour des variables objets : pour les tableaux, il faut utiliser une autre methode.

    Il faut comprendre qu'une variable Objet contient la référence, le pointeur de l'objet, mais pas l'objet lui même.


    Sinon pour ton exemple, je ne vois pas d'autre solution que celle-ci (ton code sera plus lent) :
    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
    Dim Array As New ArrayList
     
    		Array.Add("truc")
            Array.Add("machin")
    		Array.Add("bidule")
    		Array.Add("chose")
     
            Dim Indice As Integer
            DIm i as Integer
     
            For i=0 to (Array.Count - 1)
                If Array(i) = "machin" Then
                    Indice = i
                    Array(i) = "Toto"                
                End If
            Next
     
            If Array(Indice) = "Toto" Then
            	MessageBox.Show("ça marche !")	        	
            End If
    ... mais il doit certainmenent exiter une methode pour pointer directment l'element...personne ne sait ?

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Merci pour ton aide, c'est vrai que ton exemple fonctionne mais les structures sont des variables par valeur...
    Le code avec l'indice va parfaitement également, avec un code simple comme nous en avions ici, mais quand j'essaye d'appliquer cela au mon programme, quand j'essaye n'affecter une valeur à une entrée de l'array, j'ai une erreur :

    "Assignation de liaison tardive à un champ de type valeur 'Entry' non valide lorsque 'Entry' représente le résultat d'une expression de liaison tardive."

    Ca se produit sur chaque ligne de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.C.Entries(CurrentEntry).Obj = txtName.Text
    Où CurrentEntry et un Integer qui contient l'équivalent de "Indice" de ton code, txtName est sur la forme contenant cette ligne, form1 une autre ou il y a une instance de la classe class_cMoney de type public, qui elle même contient une déclaration publique de l'arrayList Entries qui contient des objets de structure Entry définie dans cette même classe en public
    J'imagine que le prob vient de tout ce bazzar mais je ne vois pas pourquoi
    En tout cas merci !

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    il existe des logiciels qui peuvent convertir du code C#.NET en VB.NET (et vis versa) mais je ne ma rappel plus le nom.

    Le mieux c'est peut-être de convertir ton code en C# puis d'utiliser les pointeurs grace au C# et de reconvertir ton code en VB pour voir ce que ça donne (attention, fait une sauvegarde de ton projet car je ne suis pas sure que la convertion VB => C# => VB ne te modifie pas ton code d'origine)

    Remarque : il me semble que tout ce que tu peux faire en C#.NET, tu peux le faire en VB.NET (et vis versa)

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Oui, c'est vrai faudrais essayer, ou peut être même aller directement en C# parce que la, je flotte un peu avec ces histoires d'affectation !!! J'ai trouvé ça pour les liaisons tardives/anticipées mais bon, ça ne m'aide pas beaucoup : http://www.microsoft.com/france/msdn...imization.mspx
    Je vais regarder du coté de C#, d'ailleurs, VB ne sais pas faire tout ce que peux faire C#, comme par exemple les pointeurs et d'autres choses, sinon, il n'y aurai aucun intéret d'avoir 2 langages différents :p

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Citation Envoyé par azerty25
    Je vais regarder du coté de C#, d'ailleurs, VB ne sais pas faire tout ce que peux faire C#, comme par exemple les pointeurs et d'autres choses, sinon, il n'y aurai aucun intéret d'avoir 2 langages différents :p
    => je vais peut-être te dire une connerie mais il me semble que tout ce que tu peux faire en C#, tu peux le faire en VB (après il suffit de savoir comment) : l'interet d'avoir deux languages est que les personnes qui ont commencées par apprendre le language C, peuvent plus facilement s'adapter (ça leur evite d'avoir à apprendre le VB)...

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 68
    Par défaut
    Oui peut être alors, je vais pas te contredire, ne je ne m'y connais pas assez en .NET. La preuve j'ai encore une merde...
    J'ai décidé d'utiliser des tableaux, comme ça, pas de problème de référence, liaisons tardives etc. J'ai fait une fonction pour utiliser les tableaux comme des piles ou arrayList, qui permet de redimensionner +1 la limite haute du tableau à la volée et d'ajouter une donnée. Elle va bien, mais VB me lance "Impossible d'effectuer un cast d'un objet de type 'System.Object[]' en type 'System.String[]'." après avoir éxécuté le End Sub de la routine AddInArray et avant d'éxécuter le msgbox, pourtant, le tableau est redimensionné et la valeur insérée...

    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
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim Tab(0) As String
            AddInArray(Tab, "test")
            MsgBox(Tab(0))
        End Sub
     
        Public Sub AddInArray(ByRef array() As Object, ByVal data As Object)
            If UBound(array) = 0 And array(0) = Nothing Then
                array(0) = data
                ReDim Preserve array(1)
            Else
                array(UBound(array)) = data
                ReDim Preserve array(UBound(array) + 1)
            End If
            MsgBox(array(UBound(array) - 1))
        End Sub
    L'erreur ne se produit pas si l'on enleve de AddInArray les ligne avec le Redim Preserve...

    Si des fois tu sais pourquoi cette erreur parce que je commence à m'arrache les cheveux avec mes histoires de variables... et casser les couilles aux autres lol

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Normal qu'il y ai une erreur, tu affectes une variable de type object dans un tableau de type string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Sub AddInArray(ByRef array() As string, ByVal data As string)
    J'ai fait quelques recherches sur les pointeurs en C# => mauvaise nouvelle : a priori, en C#, on ne peut pas utiliser les pointeurs...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Citation Envoyé par azerty25
    Oui peut être alors, je vais pas te contredire, ne je ne m'y connais pas assez en .NET. La preuve j'ai encore une merde...
    J'ai décidé d'utiliser des tableaux, comme ça, pas de problème de référence, liaisons tardives etc.
    Bienvenue dans la logique merveilleuse de Grosoft. Désolé les gars, mais en VB (et sûrement le reste de .NET) toute assignation se fait par référence, que ce soit objets ou tableaux. ... celà dépend du type définit pour le tableau.
    Donc les pointeurs, ben tu les utilise déjà...
    Mais le plus drôle dans tout çà, c'est que ce n'est pas le cas lors de l'utilisation des méthodes fournies dans le framework... Ca dépends et bien entendu c'est pas marqué dans la documentation (byref ou byval des params, et suivant le code même qui au final peut avoir utilisé l'objet passé par référence ou l'a cloné).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim res(2) As Object
    Dim res2(2) As Object
     
    res = res2
    res(0) = New ListViewItem("un")
    res(1) = New ListViewItem("deux")
    For Each it As ListViewItem In res
    <div style="margin-left:40px">it.Text = "zob"</div>Next
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim res(2) As Integer
    Dim res2(2) As Integer
     
    res = res2
    res(0) = 1
    res(1) = 2
    For Each it As Integer In res
    <div style="margin-left:40px"> it = 3</div>Next
    Vous les voyez les deux zob? Tout est par ref dans le 1er code, dans le deuxième... ben le for each il marche pas. Pourquoi? Car un entier est un type de base, pas un objet.

    A ne pas oublier: string est un objet!!!!

    Donc conclusion, recode tout, fait bien gaffe au passage par référence, gave ton code de .clone et .copyTo quand tu dois passer par valeur, et tu ne fera pas comme moi: te planter car trop l'habitude des langages avec passage par valeur par défaut.

    Au passage, ce système est totalement débile (insertion de bugs, etc...)... Mais sûrement mis en place pour la gestion évènementielle.

    Mon problème est l'opposé du tiens: ne pas utiliser de pointeurs!!... ou comment copier une collection dans une autre, ou un objet dans un autre quand celui-ci n'a pas de méthode de clonage...

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    Citation Envoyé par nem&sys
    A ne pas oublier: string est un objet!!!!
    tu es bien sure car dans cet exemple, ça ne marche 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
    Dim MesString(3) As String
     
    		Dim MonString As String
     
    		MesString(0) = "a"
    		MesString(1) = "b"
    		MesString(2) = "c"
    		MesString(3) = "d"
     
    		MonString = ""
     
    		For Each Element As String In MesString
    			If Element = "b" Then
    				MonString = Element
    				Element = "bb"
    			End If	
    		Next Element
     
    		MsgBox (MonString)
    => MonString est different de "bb"
    Et comment fais-tu pour pointer sur un integer ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 33
    Par défaut
    Citation Envoyé par Emcy
    tu es bien sure car dans cet exemple, ça ne marche pas...

    => MonString est different de "bb"
    Et comment fais-tu pour pointer sur un integer ?
    Sur, je suis un gars!..

    Je suis sûr sur le fait qu'une string est un objet: un élément string contient la méthode "clone", qui copie une instance... A quoi elle sert cette méthode?.. Ben on va le voir bientôt...

    Regarde, rajoute 2 lignes dans ton code... et regarde la définition de la méthode ReferenceEquals...
    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
    Dim MesString(3) As String
    		
    		Dim MonString As String
    		
    		MesString(0) = "a"
    		MesString(1) = "b"
    		MesString(2) = "c"
    		MesString(3) = "d"
    		
    		MonString = ""
    		
    		For Each Element As String In MesString
    			If Element = "b" Then
    				MonString = Element
                                    [Object].ReferenceEquals(MonString , Element)
    				Element = "bb"
                                    [Object].ReferenceEquals(MonString , Element)
    			End If	
    		Next Element
    		
    		MsgBox (MonString)
    Pour rappel, une string en java, si l'on veut la modifier, ben on la clone en mémoire... Ben là, c'est pareil (Ca sent le pompage)...
    Mmmm alors on va me dire, oui mais c'est pas des objets, donc la méthode réagit comme çà!

    ?[Object].ReferenceEquals(16, 16) -> false
    Où alors la définition de cette méthode est bidon, mais bon... çà serait vraiment pousser le bouchon trop loin Maurice.

    En fait les autres types de bases... sont apparemment aussi des objets... désolé, c'est là mon erreur . Mais les méthodes et accesseurs les font paraitre comme non objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              Dim i, j As Integer
              i = j
              [Object].ReferenceEquals(i, j)
    Dans mon précédent code, j'utilise la propriété ListViewItem.Text... qui est une string... pouquoi çà clone pas et sa passe par référence!!!



    Comme je disais, bienvenue dans la logique Grosoft! C'est donc les accesseurs et méthodes qui font la différence. On peut le récupérer le code source de .NET, histoire de savoir réellement ce qu'il en est?

    Toujours envie de coder avec .NET? Perso, j'ai envie de refaire du c++, je sais que j'ai des variables qui ne sont pas des objets, et ce que font mes objets au moins...
    Si ils pouvaient soit filer le code, soit rester dans la même politique pour tous les objets, soit faire une MSDN expliquant si la méthode calcul entièrement par référence ou non...

    Neo! Abelman! Au secooooouuuuuurs!!!!

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    je ne vois toujours pas comment faire pour que MonString soit egal à "bb"....

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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