Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Question ¿Convertir los caracteres ASCII del ClientSocket.Socket.ReceiveText?

Hola a todos, foreros.

Mi duda es la siguiente:

¿Se pueden convertir los caracteres ASCII recividos del
"ClientSocket.Socket.ReceiveText" en caracteres normales
(el texto recivido es html)?
Es decir, que en vez de salir un "cuadrado blanco",
salga el intro (salto de pagina).

Lo que pretendo hacer es una aplicacion que recoja un html
usando el socket.recibetext, que este guarde lo recibido en un
archivo txt, y por ultimo decirle al programa que cargue una
determinada linea del archivo
( si alguien sabe un metodo mas directo mejor )
y la meta en un edit.

Pero el problema que tengo es que al no saltar de linea, lo que me
carga en el edit es un monton de basura.

Os dejo el archivo txt de lo que me guarda por si alguien
no me entendio.

Muchas gracias por adelantado!!!
Archivos Adjuntos
Tipo de Archivo: zip ejemplo.zip (934 Bytes, 40 visitas)
Responder Con Cita
  #2  
Antiguo 09-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Por lo que vi en tu archivo lo estas recibiendo bien, bueno, casi.

El problema son los caracteres "intro" como decis.

El tema que estos caracteres por algun motivo lo estas recibiendo como el caracter intro de Linux.

Para visualizar la pagina web no creo que tengas problemas, pero si tu interes es procesarlo, posiblemente si.

Tendrías dos posibilidades, recorrer el archivo, modificando este caracter.

o directamente podes cambiar el caracter delimitador, y manipularlo con el listbox:

Código Delphi [-]
ListBox1.Items.Delimiter := #algo; // nose cual es, fijate con un editor hexa o buscalo por ahi
ListBox1.Items.DelimitedText := TextoRecibido;

Espero que te ayude

Suerte
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 09-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Por si alguien le paso lo mismo que a mi el caracter
intro en hex es = 0A y en Dec= 10

Se podria hacer lo mismo en un memo?

Muchas gracias Crandel

¿Pero para un numero hexa no se utiliza $ ?
Si pongo # me pone "mising operator o semicolon"
Si pongo $ me pone que es incompatible char e integer...

¿Sabes que es lo que pasa?

Última edición por Kamikaze fecha: 09-07-2005 a las 18:35:09.
Responder Con Cita
  #4  
Antiguo 09-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
De que forma envias el texto del archivo?

linea por linea?

porque ahi es donde te puede estar desapareciendo los enter.

Si la idea es enviar el archivo entero es mejor usar un protocolo FTP, que para eso se diseño.
__________________
[Crandel]
Responder Con Cita
  #5  
Antiguo 10-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Hola Crandel !!!

El texto html me lo bajo de una pag web (el codigo html es la pag).

Yo recibo ese codigo mediante la función
Código PHP:
 procedure TForm1.ClientSocket1Read 
Le digo que, lo que lea lo pase a una String determinada
Código PHP:
 var
str:AnsiString;
begin
   str
:= Socket.ReceiveText
Y luego le digo que lo escriba en un memo
Código PHP:
 memo1.Lines.Add(str); 

Yo recibo el codigo fuente de la pag por que previamente
le envié con el
Código PHP:
 TForm1.ClientSocket1Connect 
Este texto:
Código PHP:
procedure TForm1.ClientSocket1Connect(SenderTObject;
  
SocketTCustomWinSocket);
begin
   with ClientSocket1 
do begin
Socket
.SendText('POST /game/reg/login2.php HTTP/1.0'+#13#10);
Socket.SendText('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*'+#13#10);
Socket.SendText('Referer: [url="http://ogame159.de/portal/?lang=es'+#1310"]http://ogame159.de/portal/?lang=es'+#13#10[/url]);
Socket.SendText('Accept-Language: es'+#13#10);
Socket.SendText('Content-Type: application/x-www-form-urlencoded'+#13#10);
Socket.SendText('Proxy-Connection: Keep-Alive'+#13#10);
Socket.SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)'+#13#10);
Socket.SendText('Host: ogame192.de'+#13#10);
Socket.SendText('Content-Length: 84'+#13#10);
Socket.SendText('Pragma: no-cache'+#13#10);
Socket.SendText(''+#13#10);
Socket.SendText('timestamp=1120575910&v=2&Uni=ogame192.de&login=XX&pass=XX&x=24&y=6'+#13#10);
Socket.SendText(''+#13#10);
Socket.SendText(''+#13#10);
   
end;
end
Todo ello por el puerto 80 y al host ogame192.de

Me interesaria muchisímo saber como puedo recivir linea por linea
el texto recogido por el scoket, por que asi me ahorraria un
monton de trabajo a la hora de programar y aumentaria la velocidad de
mi programa, ya que todo el texto recogido por el socket es
solamente para recoger unas determinadas cadenas de numeros,
que se repiten una sola vez pero que cada 5 minutos cambian,
pero no cambian de linea!!!!
Asi podria yo decirle al programa la linea exacta que me interesa
pasarla a un edit y ya esta.


Muchas gracias por todo!!!!
Responder Con Cita
  #6  
Antiguo 10-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Hola Kamikaze, muy interesante lo que haces, simulas ser un navegador para bajarte la pagina web.

El tema es que te esta mandando la pagina, pero con el fin de línea de Linux, que es sólo 0AH (10 dec).

En cambio en Windows es #13#10.

Igualmente si lo abris al archivo directamente como queres con el Memo, no tenes problemas, te separa correctamente las lineas.

Probalo
__________________
[Crandel]
Responder Con Cita
  #7  
Antiguo 10-07-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Si tu versión de Delphi cuenta con la función AdjustLineBeaks, supongo que bastará que pongas:


Código Delphi [-]
str:= AdjustLineBreaks(Socket.ReceiveText);

// Saludos
Responder Con Cita
  #8  
Antiguo 10-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Muchas gracias!!!!!!!

¿Alguien sabe donde me puedo informar
para que el Socket.ReceiveText
me envie linea por linea?

Asi podria recoger que linea necesito
mas rapidamente.

Muchas gracias por todo!!!!!!!



P.D.:Si no os molesta os colocaré dentro de la sección
de autores.
Responder Con Cita
  #9  
Antiguo 11-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Cita:
Empezado por roman
str:= AdjustLineBreaks(Socket.ReceiveText);
interesante función Roman,no la conocia.

Cita:
Empezado por Kamikaze
P.D.:Si no os molesta os colocaré dentro de la sección de autores.
no creo que nadie se enoje, pero creo que nos queda grande. Si realmente quieres nombrarnos,sería mas justo como colaboradores o algún titulo por el estilo.

En resumen, para obtener tus líneas puedes hacer lo siguiente:

Código Delphi [-]
var
  Lineas: TStringList;
begin
  Lineas = TStringList.Create;
  .....
  .....
  Lineas.Add(AdjustLineBreaks(Socket.ReceiveText));
  .....

y finalmente tenes separado por lineas !!!!
__________________
[Crandel]
Responder Con Cita
  #10  
Antiguo 11-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Hola Crandel !!!

Perdona, pero no entiendo el pedazo de codigo
que me colocastes en el anterior post.

¿Me lo podrías poner en algun contexto para que
pudiera ver la función de este, por favor?

Una cosa, odio hacer categorias con respecto a la gente,
si me ha ayudado, igualmente es uno de los
creadores aunque yo lo compile, ya que sin vuestro apoyo
no existiría el programa.
Responder Con Cita
  #11  
Antiguo 11-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Hola Kamikaze,

El TStringList, como su nombre lo indica, es una lista de string.

La primera parte del ódigo que escribí es solo la declaración y la creación del objeto, no tiene más.

El método Add, permite agregar texto al objeto, en este caso agregamos todo lo que recibiste desde Socket.ReceiveText.

Pero como a vos te interesa previamente convertir los caracteres de fin de línea para que sean compatible con windows usamos la función AdjustLineBreaks.

De esta forma tenemos cargado nuestro StringList, con todo el texto de la pagina web separada en líneas como querias.

Luego puedes acceder a la línea que te interese:

Código Delphi [-]
Edit1.Text := Lineas.Strings[NumeroLinea];

Suerte
__________________
[Crandel]
Responder Con Cita
  #12  
Antiguo 11-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
Ahora lo comprendo, gracias por todo Crandel!!!

Pero creo que el programa delphi no....

Me sale un error:

"Project Project1.exe raised exception class EStringListError with message
'List index out of bounds (1)' "
Responder Con Cita
  #13  
Antiguo 11-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
chekeaste no estar leyendo una línea que no existe?
__________________
[Crandel]
Responder Con Cita
  #14  
Antiguo 12-07-2005
Kamikaze Kamikaze is offline
Miembro
 
Registrado: abr 2004
Posts: 30
Poder: 0
Kamikaze Va por buen camino
He provado con mas de 25 lineas existentes y siempre me aparece lo mismo
Responder Con Cita
  #15  
Antiguo 12-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
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
  #16  
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
  #17  
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.932
Poder: 27
delphi.com.ar Va por buen camino
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
  #18  
Antiguo 13-07-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
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
  #19  
Antiguo 13-07-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
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
  #20  
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.932
Poder: 27
delphi.com.ar 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.
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
Respuesta



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 23:48:04.


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
Copyright 1996-2007 Club Delphi