Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Me da error al quitar el componente ClientSocket1

Bueno como no dejo de ser novato pues tengo un problema que no veo como arreglarlo y a lo mejor me he opcecado y no lo veo.
Es un form que lo estoy mirando por programacion y en concreto con un componente no visual el TClientSocket.
Me da error al compilar
Si inclullo el componente visualmente en el form y no defino la variable en la seccion private, entonces me funciona bien.
Pero si quito el componente ClientSocket de form1 y lo defino en la seccion private ClientSocket1: TClientSocket; entonces me da un error al compilar.
seguro que hago algo mal.
Me podeis decir que es.
Muchas gracias.
Este es el form1
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ScktComp;
type
    TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    ClientSocket1: TClientSocket;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
   ClientSocket1.ClientType := ctNonBlocking;
   ClientSocket1.Name:= 'ClientSocket1';
   ClientSocket1.Host := 'www.villademostoles.da.ru';
   ClientSocket1.Port := 80;
   ClientSocket1.OnRead:= ClientSocket1Read;
   ClientSocket1.Active := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   with ClientSocket1.Socket do begin
      SendText('GET http://www.villademostoles.da.ru HTTP/1.1'+#13#10);
      SendText('Accept-Language: es'+#13#10);
      SendText('Accept-Encoding: gzip, deflate'+#13#10);
      SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'+#13#10);
      SendText('Host:www.villademostoles.da.ru'+#13#10);
      SendText(''+#13#10);
   end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
end;
end.
Responder Con Cita
  #2  
Antiguo 11-09-2005
Sirkius Sirkius is offline
Miembro
 
Registrado: jun 2004
Posts: 83
Poder: 20
Sirkius Va por buen camino
Si no lo pones como componente, que se crea automaticamente al crear el form, deberás crearlo antes de nada.

En el FormCreate antes de nada:

ClientSocket1 := TClientSocket.Create(Self);

Y para mayor seguridad en el FormClose:

ClientSocket1.Free;
__________________
SIN FIRMA :P
Responder Con Cita
  #3  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Ha sido un exito

Perfecto me funciona bien.
Muchas gracias
Como estoy aprendiendo y buscando cosas, y experimentando.
¿Se podria pasar el codigo del boton a una funcion?

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   with ClientSocket1.Socket do begin
      SendText('GET http://www.villademostoles.da.ru/index.html HTTP/1.1'+#13#10);
      SendText('Accept-Language: es'+#13#10);
      SendText('Accept-Encoding: gzip, deflate'+#13#10);
      SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'+#13#10);
      SendText('Host:www.villademostoles.da.ru'+#13#10);
      SendText(''+#13#10);
   end;
end;
Responder Con Cita
  #4  
Antiguo 11-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Antuan
¿Se podria pasar el codigo del boton a una funcion?
Una función tiene que devolver algún resultado... ¿Qué resultado tendría que devolver el código anterior? Si fuera el "ReceiveText" del "Socket" podrías probar a crear el mismo dentro del cuerpo de una función, inicializarlo y luego que la función devolviera una cadena de caracteres ("string") con el "ReceiveText", propiamente. Tal vez la función podría contar con un parámetro, también de tipo "string", en el que pudiera enviarse la dirección URL que parece ser necesaria y de la que se quiere obtener el "ReceiveText".
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Tiene que responder un texto

Como ves he caido de nuevo en delphi.
El el primer hilo tengo lo que devuelve
que es esto
Código Delphi [-]
memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
Pero lo logico es que lo devuelva como dices en el ReciveText en un EditText.
Intentare lo que dices pero al hacer la funcion me dice que el componente ClientSocket1 no esta definido y sin embargo en el apartado private lo tengo definido.
Volvere a dejarlo de nuevo y seguir con lo que estaba haciendo hasta que coja nivel.
Responder Con Cita
  #6  
Antiguo 11-09-2005
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
Lo mas apropiado para eso es utilizar un procedimiento en vez de una funcion.
Lo declaras en la seccion private

procedure PeticionWeb;

y en implementation

Código Delphi [-]
  procedure TForm1.PeticionWeb;
  begin
     with ClientSocket1.Socket do begin
       SendText('GET http://www.villademostoles.da.ru/index.html HTTP/1.1'+#13#10);
       SendText('Accept-Language: es'+#13#10);
       SendText('Accept-Encoding: gzip, deflate'+#13#10);
       SendText('User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'+#13#10);
       SendText('Host:www.villademostoles.da.ru'+#13#10);
       SendText(''+#13#10);
    end;
 
 end;
Lo podes mejorar para que en vez de que siempre realice la peticion de la misma pagina, que se le pasen los parametros de la web que se quiere llamar.
Espero que te haya servido...

Edicion: Declara la funcion de la misma forma que declaro este procedimiento y te va a reconocer el ClientSocket1.

Última edición por Sotrono fecha: 11-09-2005 a las 16:34:58.
Responder Con Cita
  #7  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Con el procedure he resuelto en problema

Bien pues eso, que con el procedure he resuelto el problema y he modificado el codigo para ver varias web con un edit1.text
Pero tengo que pulsar dos veces con el raton el en boton
La primera no aparece nada y la segunda vez si
Lo he intentado haciendo una funcion y no reconoces el ClientSocket1
Bueno muchas gracias y poco a poco creo que lo ire sacando. Supongo.
Aunque con vuestra ayuda tambien voy aprendiendo y bastante.
La siguiente fase sera evitar tener que pulsar 2 veces el raton y si lo consigo intentare que el resultado en vez de darlo en un memo me lo de en un EditText.
Responder Con Cita
  #8  
Antiguo 11-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Antuan, echando un vistazo a la ayuda de "TClientSocket" y temas relacionados me doy cuenta de lo poco que sé de ellos. Quiero decir que hacer la función, como dije arriba, no se ve tan sencillo como acaso di a entender. Se me ocurre una forma de rectificar, y es, ¿qué quieres conseguir exactamente? ¿qué información tratas de lograr? ¿Qué se supone que ha de haber en la propiedad "ReceiveText"? Lo digo por ver si podría lograrse de algún otro modo echarte una mano.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Ya lo he consegido y pongo el codigo a disposicion del que lo necesite.

Ya lo he conseguido y pongo el codigo a disposicion del que lo necesite pero dejo que alguien me ayude como siempre para no tener que pulsar el boton 2 veces.
Se trata de sacar todo el codigo de una url incluso las cabeceras.
Yo como soy un novato aun no esta del todo depurada pero funciona.
es un formulario con dos botones, una labe,l un EditText y um MemoEdit.
Este es el codigo
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ScktComp;
type
    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    ClientSocket1: TClientSocket;
    function PeticionWeb(var url: string):string;
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
   ClientSocket1 := TClientSocket.Create(Self);
   ClientSocket1.ClientType := ctNonBlocking;
   ClientSocket1.Name:= 'ClientSocket1';
   ClientSocket1.Host := 'www.auna.com';
   ClientSocket1.Port := 80;
   ClientSocket1.OnRead:= ClientSocket1Read;
   ClientSocket1.Active := False;
end;
function TForm1.PeticionWeb(var url: string):string;
  begin
    result:= ' ';
     with ClientSocket1.Socket do begin
     Memo1.Clear;
     ClientSocket1.Host := url;
     ClientSocket1.Active := True;
     SendText('GET / HTTP/1.0'+#13#10);
     SendText(''+#13#10);
     end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var url: string;
begin
url:= Edit1.Text;
PeticionWeb(url);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
   memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ClientSocket1.Free;
end;
end.
Responder Con Cita
  #10  
Antiguo 11-09-2005
Avatar de Sotrono
Sotrono Sotrono is offline
Miembro
 
Registrado: abr 2004
Ubicación: Buenos Aires - Argentina
Posts: 396
Poder: 21
Sotrono Va por buen camino
Hey, muchas gracias, justo estaba buscando como manejar los eventos de los objetos creados en tiempo de ejecucion
Código Delphi [-]
 ClientSocket1.OnRead:= ClientSocket1Read;
Con esta linea aprendi.

Una cosa, si la funcion PeticionWeb no va a devolver ningun resultado te conviene utilizar un procedimiento.
Responder Con Cita
  #11  
Antiguo 11-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Me interesa la funcion

Me interesa la funcion pero lo que no se hacer es como devolver el resultado del ClientSocket1.Socket.ReceiveText en un string en vez de en un MemoEdit.
Yo solo necesito las cabeceras y el codigo que he puesto da las cabeceras y la pagina completa.
Responder Con Cita
  #12  
Antiguo 12-09-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
Antuan, ahora que ya casi tienes el código, te recomiendo que avances al paso siguiente y crees una clase a que resuelva tu problema.

Aca te dejo algunas correcciones a tu código (los comentarios son todos códigos que no deben ir):
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sockets, ScktComp;
type
    TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    ClientSocket1: TClientSocket;
    // lo cambie
    procedure PeticionWeb(url: string);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
  ClientSocket1 := TClientSocket.Create(Self);
  ClientSocket1.ClientType := ctNonBlocking;
  //  ClientSocket1.Name:= 'ClientSocket1';   no modificar el name
  //  ClientSocket1.Host := 'www.auna.com'; para que asignarle una propiedad que vas a modificar despues
  ClientSocket1.Port := 80;
  ClientSocket1.OnRead:= ClientSocket1Read;
  ClientSocket1.Active := False;
end;
// esta función siempre devuelve una cadena vacia
// tampoco va el var
//function TForm1.PeticionWeb(var url: string):string;
procedure TForm1.PeticionWeb(url: string);
begin
  result:= ' ';
  with ClientSocket1.Socket do
  begin
    Memo1.Clear;
    ClientSocket1.Host := url;
    ClientSocket1.Active := True;
    // muy posiblemente este código no deba estar aca
    // sino en el evento onConnect para que te responda con un solo click
    SendText('GET / HTTP/1.0'+#13#10);
    SendText(''+#13#10);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
//var url: string;
begin
//  url:= Edit1.Text;
//PeticionWeb(url);
// reemplazamos todo por:
  PeticionWeb(Edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
begin
  memo1.Lines.Add(ClientSocket1.Socket.ReceiveText);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ClientSocket1.Free;
end;
end.
__________________
[Crandel]
Responder Con Cita
  #13  
Antiguo 12-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Muchas gracias

Hola Angel muchas gracias por las correciones, de esta manera es como se aprende.
Se me olvido comentar un pequeño fallo y es que mientras que este activo el ClientSocket1 mo me deja hacer una nueva peticion asi que me tendre que comer los puños como aqui se dice y seguir investigando.
Sobre la funcion que me devuelva la respuesta en un memo en vez que lo haga en un string. Me comentas que tengo que crear una nueva clase.
Llevo muy poco tiempo con Delphi pracicamente nada. Le estoy entrando al Pascal y atraves de esto voy cogiendo poco a poco a Delphi.
Asi que no seas malo y dame una idea de como hacerlo.
A ver si al final dejo una funcion en condiciones para que los amigos como yo que sabemos muy poco.
Muchisimas gracias por vuestra ayuda.
Responder Con Cita
  #14  
Antiguo 12-09-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 Antuan
Se me olvido comentar un pequeño fallo y es que mientras que este activo el ClientSocket1 mo me deja hacer una nueva peticion asi que me tendre que comer los puños como aqui se dice y seguir investigando.
Creo que deberias hacer es cerrar la conexión antes de abrir otra. Al hacer peticiones a las paginas web, la conexion se cierrar automaticamente cuando finaliza la transferencia, de otra forma tenes que cerrarla vos.
Cita:
Empezado por Antuan
Sobre la funcion que me devuelva la respuesta en un memo en vez que lo haga en un string. Me comentas que tengo que crear una nueva clase.
Son dos cosas diferentes, una cosa es crear una clase y otra es que la función te devuelva el string.
Lo que pasa que quien captura la respuesta de la pagina web es el evento OnRead y no tu procedimiento PeticionWeb.
Cita:
Empezado por Antuan
Llevo muy poco tiempo con Delphi pracicamente nada. Le estoy entrando al Pascal y atraves de esto voy cogiendo poco a poco a Delphi.
Asi que no seas malo y dame una idea de como hacerlo.
Lo de la clase lo vemos cuando termines tu aplicación web, porque aprender a crear clases es todo un tema y mejor lo manejamos por separado, una vez que lo tengas terminado.
Cita:
Empezado por Antuan
A ver si al final dejo una funcion en condiciones para que los amigos como yo que sabemos muy poco.
Muchisimas gracias por vuestra ayuda.
Me parece muy bien, y de nada.
__________________
[Crandel]
Responder Con Cita
  #15  
Antiguo 14-09-2005
Antuan Antuan is offline
Miembro
 
Registrado: jul 2005
Ubicación: Madrid
Posts: 73
Poder: 19
Antuan Va por buen camino
Como se escribe la etiqueta Citar

Como se escribe la etiqueta citar? No lo he visto en las etiquetas de VB
Tambien aprovecho y como se trata del mismo tema.
Como declaro el componente ClientSocket en una aplicacion DLL sin form para que se le puedan asignar las propiedades y los eventos.
Muchas gracias de nuevo.
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 19:23:44.


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