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 6 et antérieur Discussion :

[VB6]Tableau d'objet withevents


Sujet :

VB 6 et antérieur

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut [VB6]Tableau d'objet withevents
    Bonjour,
    Lorsqu'on utilise un objet (classe) qui possède des evenements, et qu'on veut trapper les evenements on met une déclaration comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private WithEvents m_oBelObjet As TypeObjet
    dans un module de classe ou dans un formulaire et là au miracle on voit apparaitre quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub m_oDist_MonEvenement(ByVal Param1 As typeParam1,...)
    Dans lequel on met le code spécifique qui traite cet évenement.

    Mais je n'ai pas trouvercomment on peut faire ce genre de chose pour un nombre indéterminé d'objets.
    J'avais bien pensé à déclarer un tableau mais le withEvents est interdit avec les tableaux, ou une collection.
    Pour l'instant je sais instancier un tableau ou une collection mais je ne sais pas si l'evenement MonEvenement s'est produit, et pour quel item du tableau ou de la collection.
    Quelqu'un a des idées?
    Merci de votre aide,
    Soazig

  2. #2
    Membre du Club

    Inscrit en
    Décembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 21
    Points : 49
    Points
    49
    Par défaut
    As-tu pensé à passer par un module de classe ?

    Dans le module de classe "clsBidule"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public WithEvents MonBidule As Bidule
     
    Private Sub MonBidule_Click()
       ' ...
    End Sub
    Et pour en faire un tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim TableauBidule(1 To 10) As clsBidule
    For I = 1 To 10
       Set TableauBidule(I) = New clsBidule
       Set TableauBidule(I).MonBidule = New Bidule
    Next I

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Je n'ai pas compris ta réponse.
    Tu suggère que ma classe principale, celle dont je veux faire un tableau ne possède pas d'evenement, mais possède une classe fille qui elle soit avec evenement, du genre une seule instance de la fille pour tous les éléments du tableau.
    Je finirais peut être par modifier ma classe mère, mais pour l'instant, la question est comment faire sans modifier la classe mère que j'ai appelé TypeObjet, comme si TypeObjet était dans une dll dont je ne possède pas les sources.
    A+
    Soazig

  4. #4
    Membre du Club

    Inscrit en
    Décembre 2003
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 21
    Points : 49
    Points
    49
    Par défaut
    Non non, tu n'as pas à toucher à la classe principale.

    Je prends un exemple concret : sur un Form, tu veux créer par programme 5 contrôles ListView (composant extérieur à VB, issu de ComCtl32.ocx). Tu veux manipuler l'événement Click de ces contrôles dans uns seule procédure, par l'intermédiaire d'un tableau de variables WithEvents. C'est bien en gros ce que tu veux faire ?

    1) Comme on ne peut pas utiliser un tableau de variables WithEvents, je crée un nouveau module de classe dans mon projet, que j'appelle "clsListView". J'y déclare une variable WithEvents qui contiendra mes ListViews, et j'y place ma procédure événementielle MyListView_Click :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public WithEvents MyListView As MSComctlLib.ListView
     
    Private Sub MyListView_Click()
       MsgBox "Clic sur " & MyListView.Name
    End Sub
    La procédure MyListView_Click m'est fournie par le contrôle, je ne fais ici que l'implémenter.

    2) Dans le code de mon formulaire, :

    - Je déclare un tableau de 5 éléments de type clsListView. Chacun de ces éléments contiendra indirectement un objet ListView.

    - Je crée mes 5 contrôles ListView

    - Par boucle, j'initialise les éléments de mon tableau en créant pour chacun une nouvelle instance de clsListView, et dans chacune de ces instances j'affecte chacun des 5 ListViews créés à la variable WithEvents "MyListView".

    - A l'exécution, quand je cliquerai sur l'un de mes ListViews, la procédure unique MyListView_Click sera exécutée automatiquement. Ca marcherait de même avec 20 ou 50 ListViews.

    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 tabListViews(1 To 5) As clsListView
     
    Private Sub Form_Activate()
     
       ' Création des ListViews
       Dim I As Integer, Pos As Integer
       For I = 1 To 5
          With Me.Controls.Add("MsComCtlLib.ListViewCtrl.2", "ListView" & I)
             .Visible = True
             If Pos Then .Left = Pos + 10
             Pos = Pos + .Width + 10
          End With
       Next I
     
       ' Remplissage du tableau de classe clsListView
       For I = 1 To 5
          Set tabListViews(I) = New clsListView
          Set tabListViews(I).MyListView = Me.Controls("ListView" & I)
       Next I
     
    End Sub
    J'espère que cet exemple est plus parlant, sinon j'ai mal compris la question.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    rebonjour,
    Oui je comprends ce que tu veux dire, c'est un peu comme un héritage.
    Et ça oblige a redéclarer toutes les procédures publiques et les propriétés publiques.
    Comme j'ai la maitrise de la classe TypeObjet (dans ton Exemple ListeView), je vais mettre mon code à la place du RaiseEvent.
    Mais s'il y a un moyen simple de faire ce que je veux sans modifier ma classe, je prends.
    Merci à toi Bazoom
    Si quelqu'un d'autre à des idées, n'hésitez pas.
    A+
    Soazig

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Rebonjour,
    Finalement mettre mon code à la place du raise_event ne résoud pas tout.
    Car quid si le code dépend du sexe des anges, de la valeur de textbox sur un formulaire?
    En fait dans mon cas c'est un évenement ErreurImprevue, qui doit déclencher, la fermeture propre de mon application, avec désallocation, envoie de mail etc.. Et je ne peux pas faire cela dans la classe.
    La seule solution que je vois mais ça sent la bidouille à plein nez, ce serait de mettre un booléen ErreurGrave dans la classe, et de mettre un timer qui scrute toutes les X ms si pour tous les éléments de mon tableau le booléen erreurGrave n'est pas passé à VRAI.
    Maintenant s'il y a un moyen de récupérer ces satanés evenements, je suis preneuse.
    Merci de votre aide et de votre patience
    Soazig

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    J'ai l'impression de ne pas inspirer les foules...
    J'ai finalement trouvé une solution de contournement, mqis qui est lourde et difficile à expliquer.
    Donc si quelqu'un sait comment trapper les evenements d'une collection ou d'un tableau d'élément d'une classe (sans modifier cette classe), j'achète.
    A+
    Soazig

  8. #8
    Rédacteur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 608
    Points : 1 561
    Points
    1 561
    Par défaut
    J'ai trouvé cette page où ils contournent le problème, des fois que ça te donne des idées :

    http://www.mvps.org/vbvision/collections.htm

    Mais il faudra rajouter quelques méthodes à ta classe.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Merci Nightfall c'est ce que je cherchais.
    Mais je pense que je vais garder ma solution batarde qui fonctionne.
    J'ai déporté tous les évenements dans un classe CEvt. et je n'ai qu'une instance de cette classe, pour tous les éléments de la collection.
    A+
    Soazig

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

Discussions similaires

  1. Sauvegarde / Chargement d'un tableau d'objets
    Par Naruto dans le forum Langage
    Réponses: 3
    Dernier message: 18/05/2004, 14h34
  2. [VB6] Taille d'objet en mémoire
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/01/2004, 16h23
  3. [VB6]Sérialiser un objet
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 11/10/2003, 10h05
  4. [VB6] Copie d'objets
    Par austin49 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 19/05/2003, 18h05
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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