PDA

Ver la Versión Completa : Descargando archivos de actualizaciones de mi aplicación


madman
29-06-2003, 00:24:55
Hola!

Entre mis proyectos tengo un editor que me permite escribir programas en ensamblador.
Actualmente voy en la versión 3 (aunke más bien es 2.5, pero ya diseñe el entorno con el numero y presentaciones con el #3 :D :D :D :D )

He aki el unit que tengo para poder descargar un archivo de internet.


...
...
...
implementation

uses InfoDownForm;

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
FormInfoDown.ShowModal;
if FileExists(ExtractFileDir(Application.Exename)+'\infoupdates.txt') then
begin
Memo1.Lines.LoadFromFile(ExtractFileDir(Application.Exename)+'\infoupdates.txt');
Label3.Caption:=Memo1.Lines[7] //Aki esta el tamaño del archivo que se descargara,
//para compararlo con el tamaño del que se esta bajando.
end
else
begin
Memo1.Lines[0]:='No existe ninguna información sobre alguna actualización.';
BitBtn1.Enabled:=False;
CheckBox1.Enabled:=False;
end
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Timer1.Enabled:=True;
UrlDownloadToFile(nil, 'http://www.sitio.com/archivo.zip',
PChar(ExtractFileDir(Application.ExeName)+'\archivo.zip'), 0, nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
f: file of Byte;
size: Longint;
begin
if fileexists(ExtractFileDir(Application.ExeName)+'\archivo.zip') then
begin
AssignFile(f, ExtractFileDir(Application.ExeName)+'\archivo.zip');
Reset(f);
try
size := FileSize(f);
Label4.Caption:=IntToStr(Size); //Muestra los bytes bajados del archivo
finally
CloseFile(f);
end;
end;
end;

end.


Como podrán ver si descarga el archivo, todo funcionaría de maravilla, excepto... que al darle URLDownloadToFile, se para mi aplicación (aunke si esta descargando el archivo).

Mi problema es que mientras descargo intento mostrar el avance de la descarga, pero mi Form no se actualiza hasta que la misma descarga ha finalizado.

Intento hacerlo tambien con:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
stream: TFilestream;
begin
//Timer1.Enabled:=True;
stream:= TFileStream.Create(ExtractFileDir(Application.ExeName)+'\bnotas.zip',fmCreate);
try
IdHTTP1.Get('http://www.geocities.com/frogsoftx/updates/bnotas.zip',stream);
finally
stream.Free;
end;
//UrlDownloadToFile(nil, 'http://www.geocities.com/frogsoftx/updates/bnotas.zip',
PChar(ExtractFileDir(Application.ExeName)+'\bnotas.zip'), 0, nil);
end;

Pero tambien se congela.

¿Que alternativa existe para que yo pueda lograr mi objetivo?

Me imagino que tendría que meterme a descargar byte por byte 'manualmente' y así poder llevar la cuenta, pero no se como.

__hector
29-06-2003, 20:18:20
Lo que pasa es que parece que el componente no realiza conexiones asincronas, asi que espera que se descargue el archivo para continuar con el programa. Mira a ver si esto te sirve:

http://beta.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20349921.html

Sino, pues puedes utilizar otros metodos de descarga. Si no sales a flote con ese ejemplo, dejanos saber para evaluar otras opciones ;)

madman
30-06-2003, 06:47:09
Gracias hector!

Probare el contenido del link lo antes posible, y dare mis observaciones al respecto.

madman
30-06-2003, 17:32:05
Funciona perfectamente!

Con modificaciones se logra lo que uno quiere.

Gracias hector!