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éation d'objets à la demande [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut Création d'objets à la demande
    Bonjour.
    Plutôt que de me lancer dans une solution qui peut se révéler inadaptée, je prends les devants en vous exposant mon problème.

    Je crée la classe ClasseDeTrucs dans un module de classe, constituée de diverses variables avec les méthodes et les propriétés correspondantes.
    J’y ajoute la méthode Bouge().
    Dans la fenêtre Form1 je crée une procédure Creation() qui crée un Truc1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Creation()
    Dim Truc1 as New ClasseDeTrucs
    . . .
    . . .
    End Sub
    Ce qui fait que l’objet Truc1 est Privé pour la procédure Creation, je ne peux donc pas, dans une autre procédure, utiliser Bouge(Truc1), il ne reconnait pas l’existence de l’objet.
    Par contre si je le déclare en tête de Form1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class Form1
    Dim Truc1 as New ClasseDeTrucs
    Il sera reconnu par la procédure Bouge(Truc1) mais je ne peux plus en créer et en disposer à ma guise.

    Dans son tutoriel p49 Serge Tahé présente un tableau d’objets sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim TabTrucs(10) as ClasseDeTrucs
    qui peut être Public et accessible partout. Ce qui permet d’écrire par exemple :
    En gardant la possibilité de construire et disposer de mes objets comme je le souhaite. Je pourrai aussi les désigner par un TabTrucs(i) qui me paraît plus simple à gérer que leur nom Truc1, Truc2, etc.

    Est-ce la meilleure technique ?
    Les Classes ne créent –elles pas ce type de tableau avec une indexation automatique des objets créés ?
    Merci de me conseiller
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    Les Classes ne créent –elles pas ce type de tableau avec une indexation automatique des objets créés ?
    par défaut non, mais c'est faisable

    à quoi sont liés tes trucs ? est-ce qu'un identifiant numérique te suffit pour les retrouver ? sinon il est possible de retrouver un truc lié à une instance d'une autre classe par exemple
    genre si à chaque fois que tu as un machin il te faut un truc il est alors possible d'avoir une méthode GetTruc(monmachin as machin) as Truc
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Personnellement (ce qui veut dire que ce n'est pas forcément la "bonne" méthode), j'aurais mis en property une liste de trucs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Public Class Form1
     
        Private _listeDeTrucs As List(Of ClasseDeTrucs)
        Public Property listeDeTrucs As List(Of ClasseDeTrucs)
            Get
                Return _listeDeTrucs
            End Get
            Set(value As List(Of ClasseDeTrucs))
                _listeDeTrucs = value
            End Set
        End Property
    Ainsi dans ta procédure Creation() tu peux instancier et stocker ton objet dans la property.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Private Sub Creation()
            Dim Truc1 As New Personne
     
            listeDeTrucs.Add(Truc1)
        End Sub
    Par cette méthode tu auras une liste de tes Trucs, et tu auras accès à leurs méthodes avec listeDeTrucs(i).LaMethodeQuiSeTrouveDansLaClasse


    Ou alors tu peux faire une classe ListeDeClasseDeTrucs qui hériterait de ICollection et IEnumerable et ta property serait typé de cette classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Class Form1
     
        Private _listeDeTrucs As ListeDeClasseDeTrucs 
        Public Property listeDeTrucs As ListeDeClasseDeTrucs 
            Get
                Return _listeDeTrucs
            End Get
            Set(value As ListeDeClasseDeTrucs)
                _listeDeTrucs = value
            End Set
        End Property
    Tu aurais ainsi la possibilité de faire évoluer ta liste comme tu le souhaites (méthodes, etc) (ex: si un jour tu souhaites remplacer la collection par un dictionnary(key/Value), tu n'auras plus qu'à remplacer ICollection par IDictionnary, plutôt que de devoir parcourir ton code et remplacer partout List(Of T) par Dictionnary(Of TKey, TValue))
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  4. #4
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Merci pour vos réponses je vais me pencher sur ce concept de List qui a l'air plus performant qu'un tableau. Une dernière question, s'il y a 4 éléments, indexés de 0 à 3, que l'on supprime le 2ème élément (indexé 1) est-ce que les éléments suivants sont réindexés 1 et 2 ou gardent-ils leurs index 2 et 3 d'origine ?
    Pour répondre à Pol63 mes Trucs sont des PictureBox avec quelques variables supplémentaires, qui ne sont reliés à rien d'autre. C'est toujours le même projet de déplacement de cellules, dans une fenêtre, de façon plus ou moins aléatoire.
    Salutations
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  5. #5
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Ils sont réindexés, le 3éme élément se postionnera à l'index 1 et le 4éme à l'index 2, et la taille de la liste est réajusté au nombre d'items restants (3 selon notre exemple).

    Je pense que dans ton cas la liste est préférable dans la mesure où le nombre de "Trucs" instanciés est variable.

    MAIS, si tes picturesbox ont des identifiants uniques pour les différencier, tu peux passer par un Dictionnary(Key/Value), key étant l'identifiant et Value ton objet de type ClasseDeTrucs, ce qui te facilitera certains traitements en jouant avec la key plutôt que l'objet.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    list n'est pas plus performant qu'un tableau (enfin en théorie, ca dépend ce qu'on en fait) c'est juste plus pratique à utiliser

    en passant par un dictionary tu peux éviter le changement d'index, vu que l'index est spécifié lors de l'ajout, plutot qu'un auto incrément
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    En résumé le Tableau c'est possible mais il faut a priori le dimensionner, pas pratique pour créer et disposer de nombreuses fois.
    La Liste c'est mieux mais les index sont réajustés donc on ne retrouve plus un objet grâce à son index.
    Il me reste à passer par un Dictionnary. N'ayant aucune idée de ce que c'est je vais étudier la question.

    Peut-être que ça pourra (ou non) répondre à une autre question qui a, je crois, déjà été abordée sur le forum : le problème de nommer les objets que l'on déclare, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim NomDeLobjet as New ClasseDeLobjet
    Ce qui amène à devoir spécifier dans le code un nom particulier. Si ce code figure dans une procédure qui boucle ça coince, on ne peut utiliser cette procédure qu'une fois.
    D'où les questions :
    Peut-on créer un objet sans le nommer ?
    Peut-on créer un objet en le nommant plus tard par "incrémentation" d'une String ?
    Merci de l'intérêt que vous portez à mes questions
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  8. #8
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par horemheb Voir le message
    Il me reste à passer par un Dictionnary. N'ayant aucune idée de ce que c'est je vais étudier la question.
    le dictionary est en gros un list dont on choisit la clé (et elle est du type qu'on veut)

    Citation Envoyé par horemheb Voir le message
    Peut-on créer un objet sans le nommer ?
    Peut-on créer un objet en le nommant plus tard par "incrémentation" d'une String ?
    Merci de l'intérêt que vous portez à mes questions
    une instance n'est jamais nommée
    c'est une variable qui est nommée, et plusieurs variables peuvent contenir la même instance
    pour remplacer un dim quelquechose dans une boucle tout en pouvant retrouver la chose il faut un dictionary, la clé peut alors être de type string si on a un nom unique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dim d as new dictionary(of string,picturebox)
    for i as integer = 1 to 10
      dim p as new picturebox
      d.add("p" & i.tostring,p)
    next
    ici dans une variable p on met 10 picturebox chacun leur tour puis on range les différentes instance dans le dictionnaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dim p as picturebox = d("p1") ' pas de new, le dim n'est là que pour créer la variable, ce qu'elle contient se trouve déjà dans le dico
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Si j'ai bien compris il y a un parallèle entre le Dictionnary et la structure de fichier d'Access par exemple, avec un enregistrement et son index. La "position" dans la liste n'a plus d'importance puisque l'index de l'objet est unique et "permanent". Ca va m'être très utile pour la suite (gestion des déplacements de plusieurs cellules).

    une instance n'est jamais nommée
    Je ne comprends pas, quand on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Nom as New ClasseDobjet
    Il y a bien création d'un objet spécifique associé à un nom, avec des méthodes qui permettent de le personnaliser. Si on réutilise cette instruction l'objet précédent est "perdu" et remplacé par le nouveau, sauf si, comme dans le cas du Dictionnary, on a pris la précaution de le stocker ailleurs avant. C'est comme ça que je l'interprète.
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

  10. #10
    Membre chevronné Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Points : 1 961
    Points
    1 961
    Par défaut
    Pour le Dictionnary il est très bien expliqué dans le cours de P.Lasserre : Dictionnary (Of)

    Et non une instance n'est pas nommée.

    Dans ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Nom as New ClasseDobjet
    Tu déclares une variable et l'instancie à la même ligne, c'est une facilité d'écriture que Vb.NET autorise mais il ne faut pas se laisser tromper la syntaxe originelle est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim Nom As ClasseDobjet
            Nom = New ClasseDobjet()
    En premier lieu on déclare(et nomme) la variable, en 2éme on l'instancie. On ne nomme pas l'instance.
    Aider les autres, c'est encore la meilleure façon de s'aider soi-même. Martin Gray

    ToDo : Faire une ToDo List

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    j'ajouterais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Nom as New ClasseDobjet
    Dim Nom2 as ClasseDobjet = Nom
    qui équivaut donc à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim Nom as ClasseDobjet
    Nom = New ClasseDobjet
    Dim Nom2 as ClasseDobjet
    Nom2 = Nom
    ici on a 2 variables avec 2 noms différent, mais une seule instance

    si on fait Nom.Prop1 = 5 alors que Prop1 valait 6, sur Nom2 Prop1 vaudra 5 aussi, vu que ca pointe vers la même instance (et le même espace mémoire)

    si on fait Nom = Nothing, Nom2 continu de stocker l'instance
    si on fait ensuite Nom2 = Nothing, plus aucune variable ne pointe vers cette instance, elle sera supprimée de la mémoire quand .net fera son ménage

    à noter que pour les variables faites par un dim dans un membre comme une sub, à la fin du membre la variable est mise à nothing
    par contre si les instances ont été placées entre temps dans d'autres variables comme une variable de classe l'instance ne sera pas supprimée de la mémoire
    seule les instances non référencées par un morceau de programme vivant sont supprimables
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre régulier Avatar de horemheb
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2010
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2010
    Messages : 122
    Points : 77
    Points
    77
    Par défaut
    Ok, merci, tout cela est très clair. Il ne reste plus qu'à laisser reposer pour que ces notions soient assimilées.
    Bonne journée
    Mille jours d’entraînement pour forger, dix milles jours d’entraînement pour polir.
    Shimen Musashi - Gorin-no-sho Rouleau de l’eau

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

Discussions similaires

  1. [PowerBuilder] Création d'objets dynamiques
    Par Béné123456789 dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 00h33
  2. création d'objet en mémoire partagé
    Par BigNic dans le forum C++
    Réponses: 6
    Dernier message: 28/11/2005, 18h41
  3. Réponses: 11
    Dernier message: 16/10/2005, 20h21
  4. [JMenuBar] Création d'objets à la volée
    Par Rampa dans le forum Composants
    Réponses: 5
    Dernier message: 29/06/2005, 13h56
  5. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00

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