Bueno la verdad soy MUY malo explicando asi que voy a tratar de hacer lo mejor posible.
Hay una duda y/o problema recurrente, como enviar e interpretar instrucciones usando winsock, voy a intentar mostrar una tecnica muy simple de hacerlo utilizando CallByName a ver si terminan las preguntas y PMs con respecto a este tema.
En un Form
Option Explicit
Private Const DELIMITER As String = "|" ' delimitador para separar instrucciones
Private Const inst_MSG As String = "inst_MENSAJE" 'nombre de nustra instruccion
Private Const inst_BEEP As String = "inst_BEEP" 'nombre de otra instruccion
Private Sub Form_Load()
'esto es simplemente para imitar el arrivo de datos
TestDataArival inst_MSG & DELIMITER & "Hello"
TestDataArival inst_BEEP
TestDataArival inst_MSG & DELIMITER & "Bye Bye"
End Sub
'sData seria la variable con los datos que llegaron del socket
Private Sub TestDataArival(sData As String)
Dim cInstInt As New cInstructionInterpreter
'Vemos si la funcion tiene o no parametros
If UBound(Split(sData, DELIMITER)) > 0 Then
'llamamos a la funcion con parametros
CallByName cInstInt, Split(sData, DELIMITER)(0), VbMethod, sData
Else
'llamamos una funcion sin parametros
CallByName cInstInt, Split(sData, DELIMITER)(0), VbMethod
End If
End Sub
bueno en el primer code lo que vemos es muy simple tenemos 3 llamadas a TestDataArival pasandole unos parametros que en este caso serian nustras instrucciones o comandos a ejecutar. la estructura del mensaje es simple [instruccion/delimitador/dato/.../delimitador/dato] en este caso los declare como constantes para evitar errores y facilitar su modificacion (nada misterioso hasta aca)
en la funcion TestDataArival, lo primero que vemos es [ Dim cInstInt As New cInstructionInterpreter] simplemente creamos una instancia de nuestra clase, luego un simple if que va a llamar a CallByName de 2 maneras diferentes dependiendo de si tenemos o no datos para pasarle a la instruccion
En una clase (yo la llame cInstructionInterpreter)
Option Explicit
Private Const DELIMITER As String = "|"
Public Sub inst_MENSAJE(ByVal sData As String)
Dim svData() As String
If SplitData(sData, 1, svData) Then
MsgBox svData(1)
End If
End Sub
Public Sub inst_BEEP()
Call Beep
End Sub
'funcion generica para dividir y validar los datos
Private Function SplitData( _
ByVal sData As String, _
ByVal lExpectedParams As Long, _
ByRef svData() As String) As Boolean
svData = Split(sData, DELIMITER)
If UBound(svData) >= lExpectedParams Then
SplitData = True
End If
End Function
Bueno la clase en si tampoco tiene mucho, 2 funciones declaradas como publicas que son nustros comandos, los nombres de estas funciones tienen que coincidir con los que utilizamos para llamarlar y una tercera que es privada simplemente para dividir y validar los datos.
bueno para los que no tienen idea de como usar CallByName aca les dejo unos links
http://msdn.microsoft.com/en-us/library/chsc1tx6(VS.80).aspx
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/153-callbyname.htm Si alguno quiere agregar algo para hacer esto mas claro que lo haga sin problemas se que puede ser un poco confusa mi explicacion.
Espero que sea util.