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)

Kamikaze 09-07-2005 17:00:14

¿Convertir los caracteres ASCII del ClientSocket.Socket.ReceiveText?
 
1 Archivos Adjunto(s)
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.

:D Muchas gracias por adelantado!!!:D

Crandel 09-07-2005 17:40:29

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

Kamikaze 09-07-2005 18:08:24

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

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

¿Sabes que es lo que pasa?

Crandel 09-07-2005 19:47:21

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.

Kamikaze 10-07-2005 12:21:37

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,
:p pero no cambian de linea!!!!:p
Asi podria yo decirle al programa la linea exacta que me interesa
pasarla a un edit y ya esta.


:D Muchas gracias por todo!!!!:D

Crandel 10-07-2005 21:15:56

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

roman 10-07-2005 22:01:28

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

Kamikaze 10-07-2005 23:13:40

:D Muchas gracias!!!!!!!:D

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

Asi podria recoger que linea necesito
mas rapidamente.

:D Muchas gracias por todo!!!!!!!:D



P.D.:Si no os molesta os colocaré dentro de la sección
de autores.

Crandel 11-07-2005 03:49:25

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 !!!!

Kamikaze 11-07-2005 16:11:47

:D Hola Crandel !!! :D

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

¿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.;)

Crandel 11-07-2005 17:52:43

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

Kamikaze 11-07-2005 18:32:24

:D Ahora lo comprendo, gracias por todo Crandel!!! :D

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)' "

Crandel 11-07-2005 19:01:31

chekeaste no estar leyendo una línea que no existe?

Kamikaze 12-07-2005 15:01:08

:( He provado con mas de 25 lineas existentes y siempre me aparece lo mismo:(

Crandel 12-07-2005 21:23:32

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.

Kamikaze 13-07-2005 15:24:14

:D Hola otra vez!!!:D

¿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......:( :(

delphi.com.ar 13-07-2005 16:40:24

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.

Mick 13-07-2005 17:14:19

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

Crandel 13-07-2005 19:17:56

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

delphi.com.ar 13-07-2005 19:38:39

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!


La franja horaria es GMT +2. Ahora son las 16:37:34.

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