Club Delphi  
    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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
ProgressBar+tiempo en hacer POST HTTP

Hola, estoy haciendo una aplicación a modo de aprender, que me sirve para poder insertar noticias en mi página web, o mas bién una web que hice solo para estas pruebas, bueno, en localhost no hay problema por la velocidad con lo que hace, ahora la cosa llega cuando está en internet, se poner un poco lento el tiempo que tarda en hacer todo, vamos.. como todo, parecería que se congela o cuelga la aplicación y estoy queriendo poner un ProgresBars o un Gauge ( también saber la diferencias de usar uno u otro, creo que se usan igual xD )

Bueno sin mas que decir aquí les dejo mi código con el que hago el post sin problemas

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try
    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := http.Post('http://localhost/pruebas/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;
  end;
end;

tengo el componte Indy idHTTP, y he visto que tiene unos eventos, pero desconosco la forma de usarlos, me gustaría mucho poder saber que tiempo durará el post y que mejor forma mirando un lindo progresBars, en un FTP ya lo he logrado, pero en esto no tengo idea, supongo que es parecido, pero no lo sé.

saludos
Responder Con Cita
  #2  
Antiguo 22-04-2007
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,

Los componentes "ProgressBar" y "Gauge" cuentan con dos propiedades básicas en para su utilización: "MaxValue" y "Progress" -en el caso del "Gauge"-, y "Max" y "Position" en el caso del "ProgressBar". Estas dos propiedades indican el máximo valor que represente la barra de progreso, y el progreso actual, la posición actual del progreso. No dejes de revisar la ayuda para informarte sobre estas y otras propiedades.

Por otro lado, algunos componentes del paquete Indy añaden una serie de eventos para echarnos una mano a la hora de mostrar el progreso de las tareas que se llevan a cabo con ellos. Estos eventos son "OnWorkBegin", "OnWork" y "OnWorkEnd". También deberías revisar la ayuda sobre estos eventos, por supuesto.

Esto es lo que podría codificarse en el evento "OnWorkBegin" del componente "IdHttp" que estás usando:

Código Delphi [-]
procedure TForm1.IdHTTP1WorkBegin(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  Gauge1.MaxValue := AWorkCountMax;
  ProgressBar1.Max := AWorkCountMax;
end;

"AWorkMode" indica qué está haciendo el componente: ¿está escribiendo datos (enviando) o los está leyendo (recibiendo)? Empero, como ves no tengo en cuenta este parámetro y me limito a usar "AWorkCountMax", que ha de indicar el número de "bytes" que se estiman necesarios para realizar la tarea. Este mismo número, sin más, lo usamos para las propiedades "MaxValue" y "Max" del "Gauge" y del "ProgressBar", respectivamente.

Ahora veamos el evento "OnWork":

Código Delphi [-]
procedure TForm1.IdHTTP1Work(Sender: TObject;
 AWorkMode: TWorkMode; const AWorkCount: Integer);
begin
  Application.ProcessMessages();
  Gauge1.Progress := AWorkCount;
  ProgressBar1.Position := AWorkCount;
end;

Aquí como ves lo primero que hacemos es decirle a la aplicación "Oyes, procesa tus mensajes, no te quedes parada"... y aprovechamos este evento para ello puesto que será el que más se ejecute de los tres que estamos tocando, y para evitar, obviamente, que la interfaz de la aplicación "se congele". En todo caso, como ves, nos limitamos a usar el parámetro "AWorkCount", que indica el número de "bytes" leídos o escritos por el componente a la hora del evento.

Es decir, teníamos antes el máximo número de bytes que iban a ser necesarios para realizar la tarea, y ahora tenemos el número de "bytes" que llevamos leídos o escritos... y ya con esto podemos perfectamente mostrar el progreso de la tarea que estemos llevando a cabo. Como ves en el evento "OnWork" nos limitamos a establecer las propiedades "Progress" y "Position" de los componentes "Gauge" y "ProgressBar", respectivamente, con el valor de "AWorkCount".

Por último tal vez nos interese tratar con el evento "OnWorkEnd":

Código Delphi [-]
procedure TForm1.IdHTTP1WorkEnd(Sender: TObject;
 AWorkMode: TWorkMode);
begin
  Gauge1.Progress := 0;
  ProgressBar1.Position := 0;
end;

Y como ves aquí no nos queda sino reinicializar a cero los valores del "Gauge" y del "ProgressBar", puesto que el trabajo (petición HTTP o POST en este caso) ya llegado a su término. Nota que estos eventos están presentes en varios componentes de Indy, no sólo en "IdHttp", y así tratar con ellos será siempre igual, sea cual sea el componente que los implemente.

Adjunto un sencillo ejemplo que descarga (pero no hace más que descargarlo) cierto programa de Internet, y va mostrando el progreso en un "Gauge" y en un "ProgressBar".
Archivos Adjuntos
Tipo de Archivo: zip Progreso de tareas con IdHttp.zip (2,8 KB, 64 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 22-04-2007 a las 17:43:00.
Responder Con Cita
  #3  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola Dec la verdad es que me ha gustado mucho tu explicación, haz sido muy detallista. así da dusto aprender lo he entendido todo, pero no lo he podido poner en práctica con mi aplicación, no se por que pero el ProgressBar no se mueve, la aplicación se sigue congelando miemtras está enviando/recibiendo los datos, y lo he echo igual que tu, no se.. la única idiferencia es que yo hago POST nada mas, lleno un formulario, y nada mas.. pero como lo he dicho, el progressBar no se mueve, aquí dejo mi código que tengo en los 3 eventos del componente idHTTP

Código Delphi [-]
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PBProgreso.Max := AWorkCountMax;
  gProgreso.MaxValue := AWorkCountMax;
end;

procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  Application.ProcessMessages();
  PBProgreso.Position := AWorkCount;
  gProgreso.Progress := AWorkCount;
end;

procedure TForm1.IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  PBProgreso.Position := 0;
  gProgreso.Progress := 0;
end;

también he pueso un gauge, por que pensé que el problema no era el código, pero tampoco funcionó, no se que pueda ser, tampoco no entiendo por que devería afectar lo que haga con el componente idHTTP, si según lo que entiendo la barra avanzará de acuerdo a lo que el idHTTP se lo indique, osea que no tiene que afectar si uso un código o no, uso el mismo componente y tienen esos mismos eventos como dices, pero pues no se que pasará
Si es necesário pongo mi código que tengo, pero repito NO creo que sea problema del código, por que igual realiza bién el trabajo.


saludos y muchas gracias de nuevo Dec
Responder Con Cita
  #4  
Antiguo 23-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si la aplicación se "congela" vas a tener que usar anticongelante Y no estoy bromeando, entre los componentes Indy encontraras uno que se llama TIdAntiFreeze, colocalo sobre tu formulario y la aplicación ya no se congelara, y el código de dec debería de funcionar.
Responder Con Cita
  #5  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
haha, en un principio pensé que estaba bromeando Seoane pero luego me di cuenta que no xD
Ahora con el código de Dec si que devería funcionar, pero no lo hace :S

Acabo de probar el antifreeze y dio buenos resultados por que ya no se queda así como congelado el form, pero igual me gustaría mucho que se pueda ver que tiempo tardará, y que el usuario vea el lindo ProgressBar avanzar leeeentamente miestras va por un vaso de agua

Como podrán ver tengo bién mi código, pero no he logrado hacerlo funcionar, alguna idea ?

PD Seone por cierto he visitado tu blog o web xD y esta interesante, aunque me haya gustado comentar, pero no podía, saludos y suerte
Responder Con Cita
  #6  
Antiguo 23-04-2007
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,

Bueno. Pues no sé. Si te fijas en el ejemplo que puse más arriba, mientras está descargándose el archivo todo "fluye" más o menos como se espera. Las barras de progreso se mueven como se espera y la interfaz de la aplicación no se congela. Sin embargo, haciendo unas pruebas, he hecho que el archivo que descargamos se guarde en disco y verás.

Mientras descargamos el archivo todo sigue yendo bien. Sin embargo, cuando se ha terminado de descargar el archivo y este va a ser escrito... (¿cerrado? ¿comprobado?) en el disco... son pocos segundos, uno o dos, pero, la aplicación se congela, efectivamente. ¿Y para qué demonios digo todo esto?

Pues porque me parece que acaso el mismo "HTTP POST" congele la interfaz de la aplicación, es decir, al fin y al cabo no estamos tratando con muchos bytes, supongo, es decir, que no ocurre como con el ejemplo que puse más arriba, que mientras se están descargando bytes va bien, pero, justo al terminar... la aplicación se congela.

No he probado el componente "IdAntiFreeze" (aunque lo conocía) y quizás esto solucionara el tema, empero, para mí que es algo que va un poco más allá, y que en el caso de un "HTTP POST" y acaso también dependiendo del tiempo de respuesta del Servidor que sea, la aplicación va a terminar congelándose más o menos...

Claro que nada de esto es una solución... pero, chico, ahora mismo no se me ocurre otra cosa que levantar este Hilo arriba del todo a ver si otro compañero se atreve con otra respuesta más oportuna que esta.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #7  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola:
Dec si, ya he visto y probado tu aplicación y todo anda perfecto, no necesita un anticongelante ni nada, todo lo muestra en el progresBar o el gauge, que se mueven a la par con la descarga, pero en mi caso no, no se por que, pero no quiere mostrar nada, el HTTP POST que tengo, lo tengo dentro de un bucle, pero como dije antetiormente, no creo que afecte en nada el código, pues el que hace el trabajo ahi es el idHTTP, Dec no se si será el problema mio o que sera, pero si tienes tiempo o alguien mas quisiera probarlo aquí les dejo un código con el cual rellenar un formulario por http POST

el formulario es este, es algo simple, pero que pienso que servirá a mas de uno.
http://tekkenbolivia.net/archivos/ph...ar_noticia.php

Ahora puden ver el código fuente y sacar los nombres de las variables que tenemos en nuestro envia_noticias.php como habrán podido ver.

Y aquí les dejo el código en delphi que se encarga de llenar los datos

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try
    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := http.Post('http://tekkenbolivia.net/archivos/php/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;
  end;
end;

para poder visualizar las noticias aqui.

http://tekkenbolivia.net/archivos/ph...cia_puesta.php

Bueno, ese no es mi código, pero el otro la única diferencia es que hace un POST a google y busca una palabra, pero en un bucle, una especie de robot google, pero mientras está buscando en google no muestra en el progresbar que tanto ya buscó, si quieren les pongo el código fuente.

saludos y gracias por las respuestas Dec
Responder Con Cita
  #8  
Antiguo 23-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
¿Donde asignas los eventos (IdHTTPWorkBegin, IdHTTPWork, IdHTTPWorkEnd) al objeto TidHttp?
Responder Con Cita
  #9  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Si, en los eventos del componente idHTTP, no es ahí donde devería asignarlos ??
Así me lo ha explicado Dec, y así lo tiene en si adjunto. también ya puse el código con anterioridad de como lo hago, pero lo pongo de nuevo.

Código Delphi [-]
procedure TForm1.IdHTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PBProgreso.Max := AWorkCountMax;
  gProgreso.MaxValue := AWorkCountMax;
end;

procedure TForm1.IdHTTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  Application.ProcessMessages();
  PBProgreso.Position := AWorkCount;
  gProgreso.Progress := AWorkCount;
end;

procedure TForm1.IdHTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
  PBProgreso.Position := 0;
  gProgreso.Progress := 0;
end;

En este caso estoy usando un ProgressBar y un Gauge, pero ninguno se mueve.

Lo estoy haciendo mal seoane ? he entendido mal ?

saludos
Responder Con Cita
  #10  
Antiguo 23-04-2007
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,

Seoane te lo preguntaba porque en el código que has puesto más arriba:

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try
    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := http.Post('http://tekkenbolivia.net/archivos/php/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;
  end;
end;

... estás creando el objeto "http" pero no estás asignándole luego a los eventos oportunos los métodos que se han de hacer cargo de los mismos...

Es decir, fijo que tú tienes un componente "IdHttp" en el formulario, para el cual preparas los eventos (ayudándote del Inspector de Objetos de Delphi), pero, a la hora de la verdad (al menos en el código que muestras) usas otro objeto ("http") y no el que se crea porque lo añadiste al formulario en tiempo de diseño... ¿se comprende la idea?

Si fuera esto tienes dos opciones: o bien utilizar el objeto "IdHttp" que añades en tiempo de diseño al formulario (y para el que preparas los eventos correspondientes), o bien al componente que creas tú mismo en tiempo de ejecución le asignas los métodos correspondientes a los eventos que quieres utilizar. Algo así:

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  http: TIdHttp;
  params: TStrings;
  respuesta: string;
begin
  http := TIdHTTP.Create(Self);
  params := TStringList.Create;
  try
   { Aquí puede estar la madre del cordero }
    http.OnWork := MetodoParaWork;
    http.OnWorkEnd := MetodoParaWorkEnd;
    http.OnWorkBegin := MetodoParaWorkBegin;

    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := http.Post('http://tekkenbolivia.net/archivos/php/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    http.Free;
    params.Free;
  end;
end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 23-04-2007 a las 22:51:08.
Responder Con Cita
  #11  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola, bueno creo que he respondido antes de que se actualice la página, por eso sale mi respuesta arriba de la de usted Dec
Bueno, ahora siguiendo con el tema, lo que no entiendo es esta parte

Código Delphi [-]
   { Aquí puede estar la madre del cordero }
    http.OnWork := MetodoParaWork;
    http.OnWorkEnd := MetodoParaWorkEnd;
    http.OnWorkBegin := MetodoParaWorkBegin;

Bueno esa frase no la entendí bién, sobre la madre del cordero, supongo que significa algo como " aquí puede estar el problema "
Ahora con lo otro no se que quisiste decir con
MetodoParaWork;

Entiendo que hayas querido decir : hey tu, aquí pones el método
para el evento Work pero.. que método pongo ahí ?

Osea que tendría que quitar los eventos que había asignado en
los eventos del componente idHTTP ??
Creo que tendré que pegar mo código para que vean lo que estoy
es una busqueda en gogle con un rango nada mas.. por eso se
quiero que muestre un progressbar mientras realiza la búsqueda,


saludos Dec, Seoane
Responder Con Cita
  #12  
Antiguo 23-04-2007
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,

Bueno. "La madre del cordero" quiere decir lo que imaginabas: que ahí podía estar el "problema". Y entrecomillo problema, porque, si se trata de lo que últimamente estamos comentando no es un problema, sino que no se asignan métodos para ningún evento y así estos ni llegan a "dispararse" siquiera.

A ver. Si en tu aplicación estás usando un componente "IdHttp" que has añadido previamente a un formulario, y utilizas los eventos de este componente, lo que tienes que hacer es utilizar dicho componente para realizar la tarea.

En el código que muestras más arriba haces uso de un componente "IdHttp", pero lo creas tú en tiempo de ejecución:

Código Delphi [-]
http := TIdHTTP.Create(Self);

Ahora bien, ¿dónde asignas los métodos oportunos para los eventos que necesitas usar en el componente? En ningún lado... así que los eventos no se dispararán nunca en la vida.

Si añadiste un componente "IdHttp" al formulario y este se llama "IdHttp1", por ejemplo, lo que tienes que hacer es utilizar este componente y no crear otro... ¿para qué vas a crear un componente "IdHttp" si ya añadiste uno al formulario? No es lo habitual... o una cosa u otra, pero no ambas.

Ahora supongamos que el componente "IdHttp" que añadiste al formulario se llama "IdHttp1". Entonces podrías cambiar tu código de este modo:

Código Delphi [-]
procedure TFrmPrincipal.BEnviarClick(Sender: TObject);
var
  params: TStrings;
  respuesta: string;
begin
  params := TStringList.Create;
  try
    params.Add('titulo='+ETitulo.Text);
    params.Add('autor='+EAutor.Text);
    params.Add('noticia='+MNoticia.Text);
    respuesta := IdHttp1.Post('http://tekkenbolivia.net/archivos/php/noticias/envia_noticias.php', params);
    ShowMessage('Respuesta: ' + respuesta);
  finally
    params.Free;
  end;
end;

¿Se coge la idea?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #13  
Antiguo 23-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
ohhhh!!!
Bueno que tonto he sido al hacer eso, ahora ya me han quedado las cosas super claras, tienes razón Dec ahí estoy creando el mismo componte y el otro no me serviría para nada... por eso nunca se movian los progressbar, ahora si por lo menos ya se mueven Pero estan medio locos, por que suben y bajan, por ej llega a 10 % baja a 0, luego sube a 30 % y baja.. luego así se la pasa hasta que termina de realizar las peticiones/recepciones de datos pero claro.. ahora se que pueda ser por el bucle que estoy usando, por el momento tengo que salir un rato, mas tarde regreso y continuaré leyendo sobre el tema que me gusta mucho como trabaja delphi+internet creo que es cosa de aprender nada mas.. y yo lo veía complicado
aquí les dejo mi código que estoy usando para las búsquedas.

Código Delphi [-]
procedure TForm1.SBBuscarClick(Sender: TObject);
var
  params: TStrings;
  respuesta: string;
  I : Integer;
begin
  params := TStringList.Create;
  try

  I := 0;
  while (I <= Final) do
  begin
    I := I + 10;
    respuesta := IdHTTP.Get('http://www.google.com.bo/search?hl=es&q='+EPalabra.Text+'&hl=es&start='+IntToStr(I)+'&sa=N');
    MHtml.Text := MHtml.Text + respuesta;

  end;
  finally
    IdHTTP.Free;
    params.Free;
  end;
end;

final es una variable tambien.

y tengo en los eventos de mi componente idHTTP lo mismo que tenía antes, no he tocado nada, osea está en mis ateriores post

saludos Dec
Responder Con Cita
  #14  
Antiguo 30-04-2007
andresilvaus andresilvaus is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
andresilvaus Va por buen camino
Cita:
Empezado por dec
Hola,

Los componentes "ProgressBar" y "Gauge" cuentan con dos propiedades básicas en para su utilización: "MaxValue" y "Progress" -en el caso del "Gauge"-, y "Max" y "Position" en el caso del "ProgressBar". Estas dos propiedades indican el máximo valor que represente la barra de progreso, y el progreso actual, la posición actual del progreso. No dejes de revisar la ayuda para informarte sobre estas y otras propiedades.

Por otro lado, algunos componentes del paquete Indy añaden una serie de eventos para echarnos una mano a la hora de mostrar el progreso de las tareas que se llevan a cabo con ellos. Estos eventos son "OnWorkBegin", "OnWork" y "OnWorkEnd". También deberías revisar la ayuda sobre estos eventos, por supuesto.

Esto es lo que podría codificarse en el evento "OnWorkBegin" del componente "IdHttp" que estás usando:

Código Delphi [-]procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode; const AWorkCountMax: Integer); begin Gauge1.MaxValue := AWorkCountMax; ProgressBar1.Max := AWorkCountMax; end;


"AWorkMode" indica qué está haciendo el componente: ¿está escribiendo datos (enviando) o los está leyendo (recibiendo)? Empero, como ves no tengo en cuenta este parámetro y me limito a usar "AWorkCountMax", que ha de indicar el número de "bytes" que se estiman necesarios para realizar la tarea. Este mismo número, sin más, lo usamos para las propiedades "MaxValue" y "Max" del "Gauge" y del "ProgressBar", respectivamente.

Ahora veamos el evento "OnWork":

Código Delphi [-]procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin Application.ProcessMessages(); Gauge1.Progress := AWorkCount; ProgressBar1.Position := AWorkCount; end;


Aquí como ves lo primero que hacemos es decirle a la aplicación "Oyes, procesa tus mensajes, no te quedes parada"... y aprovechamos este evento para ello puesto que será el que más se ejecute de los tres que estamos tocando, y para evitar, obviamente, que la interfaz de la aplicación "se congele". En todo caso, como ves, nos limitamos a usar el parámetro "AWorkCount", que indica el número de "bytes" leídos o escritos por el componente a la hora del evento.

Es decir, teníamos antes el máximo número de bytes que iban a ser necesarios para realizar la tarea, y ahora tenemos el número de "bytes" que llevamos leídos o escritos... y ya con esto podemos perfectamente mostrar el progreso de la tarea que estemos llevando a cabo. Como ves en el evento "OnWork" nos limitamos a establecer las propiedades "Progress" y "Position" de los componentes "Gauge" y "ProgressBar", respectivamente, con el valor de "AWorkCount".

Por último tal vez nos interese tratar con el evento "OnWorkEnd":

Código Delphi [-]procedure TForm1.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode); begin Gauge1.Progress := 0; ProgressBar1.Position := 0; end;


Y como ves aquí no nos queda sino reinicializar a cero los valores del "Gauge" y del "ProgressBar", puesto que el trabajo (petición HTTP o POST en este caso) ya llegado a su término. Nota que estos eventos están presentes en varios componentes de Indy, no sólo en "IdHttp", y así tratar con ellos será siempre igual, sea cual sea el componente que los implemente.

Adjunto un sencillo ejemplo que descarga (pero no hace más que descargarlo) cierto programa de Internet, y va mostrando el progreso en un "Gauge" y en un "ProgressBar".
hola,

más onde está o ficheiro download? (googledestokp?)
Responder Con Cita
  #15  
Antiguo 30-04-2007
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:
más onde está o ficheiro download? (googledestokp?)
Si te entiendo bien te sorprende que descargamos el archivo (googledesktop.exe) pero este no aparece en ningún lado... y esto es porque únicamente lo descargamos "en memoria", pero, luego no lo guardamos a ningún archivo. Ten en cuenta que se trataba sólo del ejemplo, de ver funcionar a las barras de progreso, pero, nada más.

Adjunto ahora el mismo ejemplo, modificado para guardar el "googledesktop.exe" que descargamos. En realidad las modificaciones son mínimas y las muestro en negrita aquí:

Código Delphi [-]
procedure TfrmPrincipal.btnDescargaClick(Sender: TObject);
var
  fs: TFileStream;
begin
  btnDescarga.Enabled := false;
  try
    fs := TFileStream.Create(rsRutaArchivo, fmCreate);
    try
      IdHTTP.Get(rsUrlDescarga, fs);
    finally
      fs.Free;
    end;
  finally
    btnDescarga.Enabled := true;
  end;
  ShowMessage(rsFinDescarga);
end;
Archivos Adjuntos
Tipo de Archivo: zip Progreso de tareas con IdHttp.zip (2,6 KB, 26 visitas)
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #16  
Antiguo 30-04-2007
andresilvaus andresilvaus is offline
Miembro
 
Registrado: abr 2007
Posts: 10
Poder: 0
andresilvaus Va por buen camino
my spanish is very BAD! sorry...

si, este nuevo code is work 100% (file save in c:\)!! now i'm change other directory :P ehehhe

gracias, vale!!
Responder Con Cita
  #17  
Antiguo 30-04-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Alguna idea Dec con mi anterior post ??
Ese es el código en el que empleo la barra de progreso, pero creo que tendría que hacerlo de otra forma verdad ??
Creo que tendría que ser en el buble.

saludos
Responder Con Cita
  #18  
Antiguo 30-04-2007
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,

Disculpa, pero, pensaba que el tema quedaba solucionado.

Y la verdad es que no sé. Creo que en el código que refieres sólo hay algo extraño: destruyes el objeto "IdHttp", pero, no es lo habitual destruir objetos que "creamos" en tiempo de diseño, puesto que dejaríamos de tenerlos disponibles, además de que el propio formulario se encargará de su destrucción.

Es lo único raro, puesto que, lo que dices de que las barras de progreso "suben y bajan"... creo que es inevitable. Yo no conozco mucho los componentes conque tratamos, pero, creo que no puede evitarse ese "sube y baja", puesto que es lo que realmente está pasando, es decir, que las barras de progreso reflejan la realidad.

No sé si me explico. Si haces varias peticiones, en un corto período de tiempo, y estas se completan rápidamente (porque no requieren el transporte de muchos datos al fin y al cabo) pues verás que las barras de progreso "suben y bajan" aparentemente sin orden ni concierto, o al menos no como cuando descargas un archivo de cierto tamaño.

Pero, si todo esto que digo tiene algún sentido, insisto: creo que ese es el comportamiento que cabe esperar. Otra cosa es que convenza más o menos.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 04-05-2007 a las 02:25:59.
Responder Con Cita
  #19  
Antiguo 04-05-2007
Avatar de BlackDaemon
BlackDaemon BlackDaemon is offline
Miembro
 
Registrado: dic 2006
Ubicación: Bolivia - Santa Cruz
Posts: 206
Poder: 18
BlackDaemon Va por buen camino
Hola Dec, si, si te entiedo, y sobre destruir el objeto idHTTP tienes razón, otra tontería que he cometido, pero creo que todo está bién, ya me han quedado las cosas bién claras.

saludos y gracias por todo
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ajax.class.js - Sencilla forma de hacer peticiones HTTP en segundo plano dec PHP 10 11-01-2007 04:50:49
Librería para hacer peticiones HTTP para delphi 5 rlago Internet 3 06-11-2006 11:28:18
mandar un post http con idHTTP hidal C++ Builder 6 16-08-2006 02:02:57
IBDatase Insert Post Edit Post ariefez Firebird e Interbase 4 12-10-2005 02:53:04
Como hacer petición HTTP Bauhaus1975 Varios 2 13-06-2005 22:12:38


La franja horaria es GMT +2. Ahora son las 11:15:14.


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