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 :

créer des instances "réelles" d'objets indéxées ! [Débutant]


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut créer des instances "réelles" d'objets indéxées !
    bonjour, encore moi !

    Je souhaite pouvoir travailler sur des instances de picturebox.

    en fait, je place des pions sur une "carte", chaque pion est représenté à travers une picturebox placée sur la carte.

    dans le tutoriel VB.net, il est très bien expliqué que l'indexation d'objets de VB6 n'est plus possible. ily est proposé une solution alternative (pour des textbox) :

    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
     
    Dim Textes(8) As TextBox           
     
    'puis dans le form_load
    Textes(0) = TextBox0
    Textes(1) = TextBox1
    Textes(2) = TextBox2
    ... 
    'ensuite, on peut bien utiliser la syntaxe de VB 6.0
     
    Dim i As integer
    For i = 0 To 8
     Dim MyTexte As Integer= Textes(i).Text
    ..
    Next

    J'ai donc suivi la procédure décrite, mais cela ne fonctionne pas comme je veux : les objects (textbox0, textbox1 doivent être créés en préalable "à la main".

    sinon, des que j'essaye Mypicture(1).image = ....
    il m'indique ne pas trouver d'objet à manipuler...

    Le problème, je pense est que cette déclaration : Dim mypicturebox(8) As picturebox
    créé des objets "virtuels" : il n'existe aucun objet réel dans lequel placer une image sans une affectation longue (text(1)=textbox1, text(2)=textbox2, etc...)
    j'ai plus de 300 picturebox possibles....

    je voudrais donc créer en code au fil du programme ces nouvelles instances "réelles"...

    pouvez vous me donner une piste de réflexion ?
    ou corriger ma méthode ?

    pour rappel, je veux pouvoir manipuler ces objets les uns après les autres grace à un for... next et qu'ils réagissent à des évènements communs (grâce à Handle je pense mais je suppose que ce sera ma question suivante !)


    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Dur dur de passer de VB6 à VBNet, on se reds compte que les percepts de l'objet ne sont pas du tout acquis !

    Breff...on va éviter le longs discours puisque tu as su identifier avec tes mots l'origine du problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim pcbs As New List(Of PictureBox)
    Tu ajoutes autant de pictureBox que tu veux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim pcb1 as new picturebox
    pcbs.add(pcb1)
    dim pcb2 as new picturebox
    pcbs.add(pcb2)
    '.....
    'etc....
    Tu travailles avec l'instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pcbs(0).image = new bitmap(.......)
    pcbs(1).image = new bitmap(.......)
    Il existe d'autres façons de faire mais on va dire que cela colle avec tes interrogations donc j'essai de rester dans le contexte.

    A+

  3. #3
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    argh....

    je dois m'en sortir sans pouvoir déguster cela.

    il me tarde de revenir de cette $£*%@&# de soirée !


    tout s'éclaire... ou presque.

    mais je vais tester d'abord en rentrant et poser mes questions s'il en reste.

    mille milliards de mercis !

  4. #4
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    re bonjour,


    cela
    je comprends donc ce que tu me proposes mais...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    dim pcb1 as new picturebox
    pcbs.add(pcb1)
    dim pcb2 as new picturebox
    pcbs.add(pcb2)
    '.....
    'etc....
    implique que je tape chaque ligne pour pcb1, pcb2... j'en ai peut être trois cent !

    est il possible d'automatiser ceci ?
    je suppose que je peux pas créer de nom d'objet avec une variable ?



    par ailleurs, cette déclaration DIM que je fais dans form1.load (n'est ce pas ? ) ne limite-t-elle pas la portée de ces instances en limitant l'accès d'autres procédures ? je peux les manipuler dans d'autres sub... ?

  5. #5
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Je ne saisi pas bien l'intérêt ou le but de tout cela mais pour répondre à tes questions :

    Si tu souhaites accéder à ta liste de pictureBox au niveau de ta classe Form1 alors tu la déclares ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Class Form1
        Dim pcbs as new list(of picturebox) ' Ou Private pcbs as new list(of picturebox) c'est une portée au niveau de la classe uniquement
     
        Sub New()
            InitializeComponent()
            'Tu n'oublies pas sur cette ligne d'instancier des PictureBox et de les ajouter à ta liste "pcbs" !!!!
        End sub
     
    End class
    Ton problème de portée est un synonyme de méconnaissance des fondamentaux de la programmation :

    Si tu veux accéder à ta liste depuis n'importe quelle classe de ton projet alors tu places cette dite liste avec un attribut Shared dans une autre classe, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Public Class LaListe
     
        Public shared pcbs as list(of picturebox)
     
            Shared sub new()
                pcbs = new  list(of picturebox)
            end sub
     
    end class
    Pour palier au problème de la redondance de code, il faut créer tes PictureBox dynamiquement tout en gardant à l'esprit qu'un contrôle quel qu'il soit nécessite qu'on lui affecte :

    - un nom
    - une taille (utile pour une pictureBox)
    - et surtout un abonnement dynamique à au moins un événement : l’événement Click te sera fort utile si tu as besoin plus tard d'effectuer une action lorsque l'utilisateur clic sur une de ces PictureBox préalablement ajouté sur un formulaire !!!

    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
     
    Public Class Form1
        Private pcbs as new list(of picturebox)
     
        Sub New()
            InitializeComponent()
            InitPcbs
        End sub
     
        private sub InitPcbs
            for i% = 0 to 299
                Dim pcb as new picturebox With {.Name = "Pbx" & i.tostring, .Size = New Size(20, 20)}
                Addhandler pcb.Click, AddressOf pcb_Click
                pcbs.Add(pcb)     
            next
        end sub
     
        Private Sub pcb_Click(ByVal sender As Object, ByVal e As EventArgs)
            Dim pbx as PictureBox = Trycast(sender,PictureBox )
            Msgbox(pbx.name) ' Si tu places un jour la picturebox sur ton form1 alors lorsque tu cliqueras dessus ca retournera le nom de la pcb qui a été cliqué !
        end sub
     
    End class
    A+

  6. #6
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    oui, la route est longue...



    Mais ce sont les seuls aspects "difficiles" que j'ai à gérer : le reste sera "simplement" de l’algorithme...

    je crois que cette fois ça marche !


    jusqu'à la prochaine fois, bien sûr !


    merci pour ton aide précieuse.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Pour rester dans optique de wallace1, tu peux faire un dictionnaire de classe qui encapsulent les contrôle.

    Ainsi par ses propriété et ses méthodes, tu personnalises son utilisation.

    Tu peux ainsi intercepté l'événement click, et entreprendre l'action qui va bien en fonction de l'utilité que tu lui destines!

    Dim pcbs as new dictionary (of string, classe1)

  8. #8
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    merci, n'en jetez plus.

    J'ai retenu l'option proposée par Wallace1, d'abord parce que les prénoms débutant par "W" sont un gage de qualité et aussi parce que je pense la comprendre... en gros(et aussi parce que le copier/coller était facile ! )

    J'ai eu un problème pour insérer le code (où mettre chacun des bouts ?! ) mais tout fonctionne très bien maintenant.
    Enfin, ce n'est pas encore fini... même en essayant d'en faire 2 heures tous les soirs, c'est long. D'autant que comme il a été dit, je ne connais certainement pas toutes les astuces qui me ferait gagner des lignes de codes.

    Je me demandais s'il était de pratique ici de montrer les résultats obtenus ? Cela encouragerait peut être d'autres débutants à franchir le pas.

    Nom : flattop.png
Affichages : 289
Taille : 384,0 Ko

    c'est pas le futur succès PC et c'est très moche mais ça tourne jusque là.

    Je fais mon malin, mais c'est encore compliqué de faire la partie "réflexion" du bignou (car je veux que mon ordi soit mon futur adversaire ! on peut réver ) mais au moins l'affichage des pions et de la carte étant réglés, je n'ai plus qu'à bosser sur leur manipulation, ce qui est assez facile avec l'option de Wallace remplacée par un mousedown(plutôt que click).

    Pas mal de travail d'ergonomie aussi, à ma surprise ! C'est marrant comme dans un jeu acheté le clic gauche/droit est intuitif, et quand on veut les mettre en place il y a des tas de possibilités à arbitrer !
    Si j'ai déjà un pion sélectionné et que je clique sur un autre, est-ce pour changer de pion, ou pour amener le premier sur le second ? comment sélectionner un pion dans une pile ?
    Si un clic sur la carte signifie "mets ce pion là", alors comment faire si la case est déjà couverte par un autre pion ? etc ...

    M'enfin je m'amuse bien et me couche un peu moins ignare après quelques lectures VB ici ou là !
    Et c'est le plus important !

    Je ne serai jamais informaticien mais j'en sais un peu plus chaque jour.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A ta demande, je n'en rajouterai plus, mais gérer ton projet en collection de classe te permet d'intégrer les évènements click mai également ça propre intelligence!

    Ainsi quand tu click sur un élément tu sais du quel il s'agit et de sa position dans la liste, tu peux donc faire inter réagir les éléments.

    Je suis là donc je fais ça et je le dis à l'autre qui en fonction de ça sais ce qui lui reste à faire.

    En d'autres termes chaque élément est autonome, li fait son Job, et les autres non qu'a s'aligner!

    Comme je l'ai dit plus haut je suis dans la même veine que wallace1, mais en plus chaque contrôle gère indépendamment les actions à entreprendre en exonérant le programme principale de la corvée!
    Dernière modification par Invité ; 03/02/2016 à 08h17.

  10. #10
    Membre à l'essai
    Homme Profil pro
    passionné
    Inscrit en
    Janvier 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : passionné
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2016
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    le problème est que je ne connais pas du tout : il faut savoir manipuler ce genre de choses... Et puis aussi, j'ai un peu la flemme de tout revoir.

    C'est tout de même très gentil de me le proposer et peut être que je reviendrai sur ce choix s'il est vraiment peu pratique à un moment donné...

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

Discussions similaires

  1. [GMF] Créer des instances d'éléments par programmation
    Par hashas dans le forum Eclipse Modeling
    Réponses: 1
    Dernier message: 03/08/2010, 23h20
  2. Créer des instances de classes EMF dans Eclipse avec une jolie IHM
    Par obernard dans le forum Eclipse Platform
    Réponses: 3
    Dernier message: 24/02/2009, 19h21
  3. Créer des instances en boucle
    Par chat'mar dans le forum Collection et Stream
    Réponses: 12
    Dernier message: 08/06/2008, 12h08

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