Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008
-
3 mai 2008 à 17:22
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
4 mai 2008 à 20:07
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 ?
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 3 mai 2008 à 18:00
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
Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008 3 mai 2008 à 21:01
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008 4 mai 2008 à 00:53
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 ?
Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008 4 mai 2008 à 01:14
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...!?
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 4 mai 2008 à 16:58
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
Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008 4 mai 2008 à 18:35
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 ?
Noxid
Messages postés78Date d'inscriptionlundi 13 mai 2002StatutMembreDernière intervention 4 mai 2008 4 mai 2008 à 19:42
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
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 4 mai 2008 à 20:07
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