Exécuter une méthode d'un objet [Résolu]

Signaler
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour à tous !

Dans mon projet VB6, j'ai créé des classes, dont la classe CSlot qui contient un objet Public de type Winsock (déclaré en WithEvents) appelé "Socket".

Public WithEvents Socket As Winsock

Dans le programme principal, j'ai créé un tableau d'objets CSlot (Appelé "Slots()") déclaré en Private :

Private Slots() As CSlot

J'aimerai appeler la méthode "Accept" de l'objet Socket contenu dans l'objet Slots(0) (1er objet CSlot du tableau Slots).
Impossible d'exécuter la ligne de code :

Slots(0).Socket.Accept requestID

Erreur obtenue : "Variable de type objet ou bloc With non défini."

Comment faire ? Connaissez-vous une alternative ?
Ce problème serait-il contourné en VB.NET ?

Cordialement,
Joffrey

12 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
si tu n'instancies pas de nouvelle classe dans ton tableau, l'erreur est tout ce qu'il y a de plus normal
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

J'ai oublié de préciser :
J'ai bien ajouté un objet CSlot dans l'array Slots() à l'index 0 !

Cordialement,
Joffrey
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
salut,
peux tu nous montrer tout le code concernant le remplissage, la redimension etc.... de ton tableau Slots()?

il y a un bien un set xxx as new ...?
et cette classe winsock, d'où vient-elle?
pas de conflit avec un contrôle portant le même nom?
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

Il n'y a pas de "set as new".
Dans la Form principale, je déclare le tableaux de CSlots :
Private Slots() As New CSlot(D'ailleurs je m'étais trompé dans mon 1er post)

Dans ma classe CSlot, je déclare un objet Winsock; un simple contrôle Winsock quoi :
Public WithEvents Socket As Winsock

J'utilise la gestion d'un tableau dynamique avec des fonctions "maison", c'est peut-être ça le souci ?
Aucun conflit de nom de controle, non...

Cordialement,
Joffrey
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

Ce que tu dis m'a fait réfléchir et effectivement j'instancie mal mes classes.
Le problème vient du fait que mon tableau est dynamique.

En fait mon programme est destiné à un petit jeu en réseau rudimentaire. Mais il m'est plus facile d'utiliser des classes pour gérer les différents joueurs car ces derniers peuvent se connecter et se déconnecter du serveur à tout moment. Il me faut donc pouvoir gérer aisément la présence ou non des joueurs, et donc l'utilisation ou non de chaque entrée du tableau.
Si une entré n'est pas utilisée, alors elle peut être attribuée au joueur qui vient de se connecter.

J'utilise des fonctions que j'ai trouvées ici pour gérer le tableau dynamique.
Mais je pense à une solution toute bête pour savoir si une entrée du tableau est libre :
Chaque "objet" de type CSlot est pourvu d'un Winsock. Il me suffit donc de "parcourir" le tableau de type CSlot jusqu'à trouver une entrée dont le Winsock n'est pas utilisé !

Je tiens à utiliser un tableau dynamique car je ne sais pas combien d'utilisateurs se connecteront. Ca serait dommage de fixer la limite à 15 par exemple si en fait 20 personnes veulent se connecter. De même, il serait dommage de charger un tableau de 30 objets CSlot en mémoire si ce n'est pour en utiliser que 15 ou 20...

Je vais essaye comme ça, ça devrait marcher.
Si tu vois une autre solution je suis preneur ! :D

M'enfin vive la vraie POO. En VB.NET, ce problème se gèrerait plus facilement ?

Cordialement,
Joffrey
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

Wooups ! Quel nul ! J'ai oublié : un autre problème ce pose alors :
Je ne peux pas indiquer l'index de mon tableau où je veux instancier ma nouvelle classe via une variable ; uniquement par une constante.
D'où l'utilité de gérer vraiment dynamiquement le tableau.

Je ne peux pas faire :
    Dim Index As Integer
    Index = 0
   
    Dim Slots(Index) As New CSlot

Je peux en revanche faire :
    Dim Index As Integer
    Index = 0
   
    Set Slots(Index) = New CSlot

Mais cette deuxième solution implique que Slots(Index) soit déjà créé, or ce n'est pas le cas dans le cas d'utilisation d'un tableau dynamique étant donné que je n'ai pas précisé le nombre de "cases" du tableau.
Je suis donc contraint à déclarer un tableau constant...? Au pire ce n'est pas grave...peut-être même pas plus mal...!?

Cordialement,
Joffrey
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
M'enfin vive la vraie POO. En VB.NET, ce problème se gèrerait plus facilement ?


en dotnet on est obligé de faire de la POO mais on peut tout à fait coder objet en VB6, suffit juste de réfléchir avant (et un peu plus) au fonctionnement

pourquoi pas un type, used booléan, sock objet, ou traiter test clients avec une collection....
ou un usercontrol (sans interface) pour pouvoir hériter de ta classe winsock et bénéficier des index qui seront traités par VB directement....

des idées il y en a, faut juste isoler tes besoins
VB6 ets tout à fait capable d'être utilisé proprement ^^

++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

Effectivement...
Je pense que créer un UserControl avec des Winsocks indexés chargés dynamiquement serait la meilleure solution.
Mais un UserControl est-il exploitable dans une Classe ?

Cordialement,
Joffrey
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
.... l'inverse puisque je parle d'héritage :)
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

L'inverse ? Comment faire ?

En fait, dans mon projet j'ai 2 classes :
CPlayer et CSlot

CSlot doit contenir un objet de type CPlayer (appelé "Player"), et un objet Winsock (appelé "Socket").
Mon programme principal charge un tableau (appelé "Slots") de type CSlot, et charge donc dynamiquement des objets de type CSlot.

Le prog principal a aussi un Winsock en écoute sur le port 7000. Je voudrais qu'à chaque "ConnectionRequest" un objet CSlot soit chargé dans Slots (la tableau contenant les CSlot), et pouvoir faire accepter la requête de connexion sur le Winsock de l'objet CSlot. En gros :

1. Demande de connexion sur mon Winsock en écoute (Nommé WSockListen)
2. Procédure WSockListen_ConnectionRequest(requestID as Long) appelée
3. Dans cette procédure, faire par exemple : Slots(3).Socket.Accept requestID

Est-ce possible ?

Cordialement,
Joffrey
Messages postés
78
Date d'inscription
lundi 13 mai 2002
Statut
Membre
Dernière intervention
4 mai 2008

Re,

Voilà une image de ce que je voudrai faire. Ca sera peut-être plus clair :

Cordialement,
Joffrey
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
c'est possible oui, mais il n'y a alors plus aucun rapport avec ce que je te conseillais avant :)

jète un oeil sur ma source URBISock, je pense que çà peut te donner une bonne base
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp