PDA

Ver la Versión Completa : Sockets-Reconocer una cadena de texto.


DarkByte
30-10-2003, 09:18:07
¡¡Hola!!:

Quisiera formularles una pregunta:

Yo, actualmente, para que el ServerSocket haga una acción, la pongo como

If Socket.ReceiveText = ' ' Then
begin
end;

y me funciona. Pero la cuestión es que si quiero que mi programa realize una función con el texto recibido, como veo que no me estoy explicando muy bien... pongo un ejemplo

If Socket.ReceiveText = 'MENSAJE Hola!!';

Que me muestre un mensaje diciendo lo que va detrás de MENSAJE, es decir, que separe el texto recibido en dos.

¿Existe alguna función al estilo..

If Socket.ReceiveText = 'MENSAJE' + ¿? Then

o no?, en caso de ser no, ¿cómo puedo hacer lo que quiero?



Gracias de nuevo :( :confused:

Descendents
30-10-2003, 12:56:00
No se si te he entendido bien, pero entiendo que tu quieres dividir un string en dos.Sabiendo que uno de ellos sera MENSAJE y que ocupa 7 caracteres no?

Supongo que lo quieres para que asi nadie se pueda colarse en tu chat o en tu lo que estes haciendo no?.

Pues haz un if pos ('MENSAJE' en tu string) <> 0 , DELETE(string que quieres,posicion inicial, cuantos caracteres quieres borrar);


Por ejemplo:
var
s:string;
s := 'MENSAJE hola como estas?'

If pos ('MENSAJE',s) <> 0 then
Delete(s,1,7);

S es igual a hola como estas?

Espero que te haya entendido y esto te sirva

Un saludo

DarkByte
30-10-2003, 21:34:44
Bien, funciona. El programa que estoy haciendo es un chat, con su servidor y todo eso, y quiero que, al conectarse un usuario, mande:

NICK Pepe

O algo así, y que después, el chat tiene una función de ver el estado anímico:

ESTADO Feliz.

O algo así. Por lo que necesito usar esa función para varias cosas.

El código funciona, pero no se si sería demasiado pedir que me lo comentases, pues así podría aprender más, y no solo resolver la duda. Muchas gracias


De verdad, mil gracias ;)

Viet
30-10-2003, 23:02:45
Otras funciones que te pueden ayudar son Copy y Lenght que las tienes muy bien explicadas en la ayuda de delphi.

Yo en tu caso, no usaria un encabezado de un largo variable, sino algun prefijo de un largo fijo, para poder cortar ese valor y usar un case

;)

DarkByte
31-10-2003, 08:53:31
Es buena la idea, pero no hace lo que quiero, pues si quisiese poner un case y los nick iguales, los podría hacer igualmente con
NICK Pepe, NICK Juan, sin tener que quitarles el nick. Si he abierto este hilo es porque no son predefinidos, sino cualquiera.

Si alguien me pudiese comentar el código de antes, le estaría muy agradecido, pues se que funciona, pero no se el POR QUÉ, que es lo que me interesa, sobre todo, aprender.


Muchas gracias de nuevo

Descendents
31-10-2003, 09:44:30
var
s:string;
begin
s:= 'MENSAJE hola como estas?'
If pos ('MENSAJE',s) <> 0 then
Delete(s,1,7);


s = hola como estas?



if pos -->> busca el primer parametro dentro del segundo.
Es decir Si 'MENSAJE' esta dentro de S.

I el delete -->> te borra del primer parametro(es decir S) desde el segundo paramentro(Es decir 1) hasta el tercer parametro (es decir 7).

O sea te borra de toda el string de 1 al 7 caracteres.

I por cierto ahora que lo pienso,tambien puedes utilizar leftstr();


Ejemplo

var
s,r:string;
begin
s:= 'MENSAJE hola como estas?'
r := (LeftStr(s,7));
if r = 'MENSAJE' then Delete(s,1,7);
end;


s = hola como estas?

Leftstr -->>Se recorre el string empezando por la izquierda, hasta el caracter que tu le indicas

Viet
31-10-2003, 18:33:05
Creo que me explique mal.

La idea de que en el texto de tus mensajes TCS o UDP pases un encabezado indicando que informacion contiene el Msg , si similar a decir que estas diceñando tu propio protocolo sobre TCS.

Lo que yo te decia era que te generes un estandar de encabezados de un largo definido, como por ejemplo

MSG = mensaje
LOG = datos de ingreso
NIK = nick
......

de esa forma puedes hacer una cosa asi :
case copy(msg, 1, 3) of
'MSG': // codigo para mostrar el msg que esta en copy(msg,4,lenght(msg)-4)
'LOG': // codigo para loguearse

....... etc

espero haber sido algo mas claro.

;)

DarkByte
31-10-2003, 19:03:26
Muxas gracias a los dos!!, voy aprobarlo y os kuento, ok??. Por cierto, Viet, no t explicaste mal, sino que yo soy algo ignorante .

Muxas gracias
volveré con la respuesta

DarkByte
14-06-2004, 16:52:55
Hola, hoy el vuelto a probar el código, ya que la última vez se me olvidó responder. He usado los dós codigos:


r := (LeftStr(s,4));
if r = 'MNSG' then
begin
Delete(s,1,4);
ShowMessage (s);
end;

Este, el de Descendents, que es el que más me gusta de momento (aunque he de reconocer que el otro parece más sencillo, pero me resulta más claro de comprender el de Descendents), me da error en LeftStr, más exactamente me dice:
[Error] Unit1.pas(814): Undeclared identifier: 'LeftStr'
Y respecto al segundo código, el del amigo Viet, lo copio tal como me viene, cambiando el msg que aparece al principio por la variable "s" que utilizo en el ejemplo de Descendents:

case copy(s, 1, 3) of
'MSG': ShowMessage (s);

El de Viet me interesa un poco menos (aunque reconozoco que está bien) porque no se usar el case poniendo begin's y end's, aunque se para que sirve. Bueno, los errores que me dan son:

[Error] Unit1.pas(820): Ordinal type required //Primera linea
[Error] Unit1.pas(821): Incompatible types: 'Integer' and 'String' //Segunda línea

Muchas gracias simplemente, por leerme

DarkByte
14-06-2004, 16:53:29
Añado que utilizo Delphi 7 Enterprise

__marcsc
14-06-2004, 17:45:43
Hola,

no puedes utilizar un tipo no ordinal (como un string) en un case en Delphi. Tendrás que hacerlo con if.

Otra cosa que podrías hacer seria codificar tus mensajes numéricamente en vez de alfanuméricamente para poderlos convertir a un tipo ordinal y poderlos utilizar en un case. Ejemplo:

000 = mensaje
001 = datos de ingreso
002 = nick

Saludos.

DarkByte
14-06-2004, 18:45:23
Vale, muchas gracias. Por cierto ¿cómo sería con el ejemplo de Descendents?, es que me resulta más fácil usar ese.

DarkByte
14-06-2004, 19:23:59
¿Estaría bien entonces...

r := copy(s, 1, 4)
if r = 'MNSG' then
begin
Delete(s,1,4);
ShowMessage (s);
end;

?

DarkByte
14-06-2004, 19:30:59
Mejor no sy bago y lo pruebo :p

DarkByte
14-06-2004, 22:37:29
Funciona xD Gracias a todos ;)