Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   ¿Convertir los caracteres ASCII del ClientSocket.Socket.ReceiveText? (https://www.clubdelphi.com/foros/showthread.php?t=23194)

Mick 13-07-2005 19:57:02

Cita:

Empezado por Crandel
El problema es que con Add, lo agrega en una sóla linea a todo el texto.
Dentro de un ratito lo pruebo y te comento

En lugar de Add, se puede hacer algo tan sencillo como:
Código:

List.Text:= List.Text + TextoRecibido.
Aunque esto es computacionalmente mas costoso,
ya que se producen muchas conversiones de cadenas innecesarias.

Es preferible ir concatenando el texto en un String normal, y una vez
recibido todo el texto asignarlo una unica vez al TStringlist con un simple:
Código:

List.Text:= TextoRecibidoCompleto;
Tambien se pueden utilizar dos objetos TStringList uno para guardar los
textos parciales recibidos y otro para acumular el total usando AddStrings.
Código:

ListParcial.Text:= Socket.ReceiveText;
ListTotal.AddStrings(ListParcial);

Aunque no lo parezca este ultimo metodo (usando 2 strings) es el mas rapido
de todos y el que consume menos memoria (no lo he comprobado en la
practica, pero por la forma en que maneja delphi los strings y stringlists a
priori es el metodo que menos conversiones y reasignaciones de memoria
deberia usar).

Saludos

Crandel 13-07-2005 21:31:04

Bueno KamiKaze,

aca con la ayuda de nuestros amigos delphi.com.ar y Mick, ya tenemos nuestra solución, proba entonces este código final:

Código Delphi [-]
procedure TCliente_Ogame.ClientSocket2Read(Sender: TObject; Socket: TCustomWinSocket);
var
Lineas: TStringList;
begin
   Lineas := TStringList.Create;
   Lineas.Text := Socket.ReceiveText;
   Edit1.Text := Lineas.Strings[13];
end;

Segun te entendí, recibís todo el texto de una sóla vez, o lo haces por partes?, si es por partes puedes probar la última alternativa de Mick.

Termino siendo mas facíl de lo imaginado :eek: , lo que es ahogarse en un vaso de agua vacio :D , tantas vueltas por un simple fin de línea :p

Mick 14-07-2005 11:23:31

Solo una pequeñas correcciones, hay que destruir el objeto TStringList al final sino tendremos un memory leak bastante grave, ya que cada vez que se ejecute la funcion se creara un nuevo stringlist que no se destruira al salir de ella.

Código:

procedure TCliente_Ogame.ClientSocket2Read(Sender: TObject; Socket: TCustomWinSocket);
var
Lineas: TStringList;
begin
  Lineas := TStringList.Create;
  try
    Lineas.Text := Socket.ReceiveText;
    Edit1.Text := Lineas.Strings[13];
  finally
    Lineas.Free;
  end;
end;

Si se va a ejecutar muchas veces esta funcion tambien puede ser preferible tener creada con anterioridad el objeto Lineas y no destruirlo nunca, de ese modo nos ahorramos la frecuente creacion y destruccion del objeto.

Tambien seria necesario asegurarse de que existe por lo menos 13 lineas en el texto recibido, si no en el caso de recibir menos datos dara un error al intentar acceder a una linea no existente.

Saludos

Kamikaze 14-07-2005 15:35:39

:eek: Me he quedado asombrado del apoyo que he recibido,
creo que si este no es el mejor foro en cuanto a
programación, es el foro mas solidario que hay.:D

Muchísimas gracias por vuestro apoyo y por
el tiempo que os he podido costar.

Ya se que no os podre recompensar de manera directa,
ya que sabeis mucho mas que yo, pero a cambio
os pondré a todos como creadores del programa,
y si este coje algo de "popularidad" os podreis ver
en la lista.;)

:D Muchas gracias a todos otra vez.:D

Kamikaze.

P.D.: Si alguien, por lo que sea, no desea aparecer en tal lista,
por favor hagamelo saber.


La franja horaria es GMT +2. Ahora son las 00:19:06.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi