Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
yo me equivoque, cambia la linea

Código Delphi [-]
Lineas.Add(AdjustLineBreaks(Socket.ReceiveText));

por

Código Delphi [-]
Lineas.AddStrings(AdjustLineBreaks(Socket.ReceiveText));

te estaba agregando una sóla linea, por eso el error.
__________________
[Crandel]
Responder Con Cita
  #2  
Antiguo 13-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Hola otra vez!!!

¿Tendría que quedar más o menos asi?

Es que me sale un error:

"Incompatible types: 'TStrings' and 'String' "


Código PHP:
procedure TCliente_Ogame.ClientSocket2Read(SenderTObject;
  
SocketTCustomWinSocket);
var
LineasTStringList;
begin
   Lineas 
:= TStringList.Create;
   
Lineas.AddStrings(AdjustLineBreaks(Socket.ReceiveText));
   
Edit1.Text := Lineas.Strings[13];
end
P.D.: Y pensaba que se solucinaría facil todo este problema......
Responder Con Cita
  #3  
Antiguo 13-07-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.964
Poder: 29
delphi.com.ar Va camino a la fama
Cita:
Empezado por Crandel
yo me equivoque, cambia la linea

Código Delphi [-]
Lineas.Add(AdjustLineBreaks(Socket.ReceiveText));

por

Código Delphi [-]
Lineas.AddStrings(AdjustLineBreaks(Socket.ReceiveText));

te estaba agregando una sóla linea, por eso el error.
Mmmmm... AddStrings requiere que el parámetro pasado sea un TStrings, por lo que Add es el método apropiado para el resultado de la función AdjustLineBreaks.
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 13-07-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 24
Mick Va por buen camino
Solo comentar que usar AdjustLineBreaks antes de asignar los
textos a un TStrings es marear la perdiz, una perdida de ciclos
de cpu ya que no es necesario.
Un objeto TStrings o derivado de él como un TStringList
o el mismo Lines de un TMemo, entiende perfectamente y
separa las lineas de los textos que tengan solo el
caracter #10 o solo el caracter #13.
De modo que basta asignar el contenido al
TStrings (con Add por ejemplo) y listo.

Saludos
Responder Con Cita
  #5  
Antiguo 13-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
El problema es que con Add, lo agrega en una sóla linea a todo el texto.

El memo lo reconoce perfectamente, pero no se porque el StringList no.

Dentro de un ratito lo pruebo y te comento
__________________
[Crandel]
Responder Con Cita
  #6  
Antiguo 13-07-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.964
Poder: 29
delphi.com.ar Va camino a la fama
Cita:
Empezado por Crandel
El problema es que con Add, lo agrega en una sóla linea a todo el texto.
Se me ocurren varias formas de hacer esto, una es abusando de la función ExtractStrings:
Código Delphi [-]
var
  S: TStringList;
begin
  S := TStringList.Create;
  try
    ExtractStrings([], [], '1'#13#10'2'#13#10'3'#13#10'4', S);
    ShowMessageFmt('Líneas: %d'#13#10, [S.Count]);
  finally
    S.Free;
  end;
Otra es armando una funcioncita para poder usar AddStrings
Código Delphi [-]
  procedure AddLines(AStrings: TStrings; const AText: string);
  var
    S: TStringList;
  begin
    S := TStringList.Create;
    try
      S.Text := AText;
      AStrings.AddStrings(S);
    finally
      S.Free;
    end;
  end;
begin
  { AStrings es el TStrings que le anexaremos las nuevas líneas }
  AddLines(AStrings, '1'#13#10'2'#13#10'3'#13#10'4');
  ShowMessageFmt('Líneas: %d'#13#10, [AStrings.Count]);
end;


Cita:
Empezado por Crandel
El memo lo reconoce perfectamente, pero no se porque el StringList no.
Seguramente utilizas la propiedad Lines que es un TString en lugar de Text

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 13-07-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 24
Mick Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 13-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 25
Crandel Va por buen camino
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 , lo que es ahogarse en un vaso de agua vacio , tantas vueltas por un simple fin de línea
__________________
[Crandel]
Responder Con Cita
  #9  
Antiguo 14-07-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 24
Mick Va por buen camino
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:31:59.


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