PDA

Ver la Versión Completa : Como programar un ProgressBar


pablopessoa
05-12-2008, 02:06:39
Hola!
Bueno como se habran dado cuenta en mis otros post, jamas en mi vida programe una aplicacion que se conecte a un servidor por internet jajaja.
La cosa es que me gustaria mostrar una barra de progreso que muestre el estado del proceso de actualizacion de la base.
Por ahora empeze probando con algo simple, me conecto al server ftp, descargo a mi pc el archivo que tengo ahi y trato de mostrar en el progressBar el estado de la descarga ( mostrar cuanto falta en bytes para que termine de bajar el archivo). La cosa es que tampoco me sale, les pasteo mi codigo para que me digan, si pueden dedicarle un ratito de tiempo, que estoy haciendo mal.


procedure TForm16.FTPWork();
begin
Barra.Update;
end;

procedure TForm16.BitBtn1Click(Sender: TObject);
var
FTP: TIdFTP;
begin
FTP := TIdFTP.Create( nil );
FTP.OnWork := FTPWork(); // ya aca no se que parametro pasar
// por que desconozco los tipos
//(Sender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer)
// es decir, no logro entender como se usan
FTP.Username := usuario.Text;
FTP.Password := pass.Text;
FTP.Host := host.Text;
FTP.Port:=21;
try
FTP.Connect;
except
ShowMessage( 'No se ha podido conectar con el servidor ' + FTP.Host );
end;
if FTP.Connected then
begin
//showmessage('estoy conectado');
barra.Position:=0;
Barra.Max := FTP.Size('BPWOK.MDB') div 1024;
FTP.Get('BPWOK.MDB','c:\BPWOK.MDB',true);
FTP.Disconnect;
FTP.Free;
end
else
showmessage('No estoy conectado');
end;



Aclaro que este codigo lo fui armando por cosas que busque en internet y en tutotiales, cosa que no logro entender del todo..
perdon por las molestias y por tantas preguntas...
Un saludo a todos y siempre gracias por ser amables como son
Saludos!

xEsk
05-12-2008, 13:54:30
procedure TForm16.FTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer);
begin
Barra.Position:=AWorkCount;
end;

procedure TForm16.BitBtn1Click(Sender: TObject);
var
FTP: TIdFTP;
begin
FTP := TIdFTP.Create( nil );
// solo tienes que poner el nombre, ya que el componente usara
// este puntero para envierte la informacion
FTP.OnWork := FTPWork;
FTP.Username := usuario.Text;
FTP.Password := pass.Text;
FTP.Host := host.Text;
FTP.Port:=21;
try
FTP.Connect;
except
ShowMessage( 'No se ha podido conectar con el servidor ' + FTP.Host );
end;
if FTP.Connected then
begin
//showmessage('estoy conectado');
barra.Position:=0;
Barra.Max := FTP.Size('BPWOK.MDB') div 1024;
FTP.Get('BPWOK.MDB','c:\BPWOK.MDB',true);
FTP.Disconnect;
FTP.Free;
end
else
showmessage('No estoy conectado');
end;

Lo unico que te faltaba era programar el evento "OnWork" del componente FTP.

Cuando asignas eventos, solo tienes que pasarle el nombre de la funcion a llamar... ya que es el emisor el encargado de rellenar los parametros y mandartelo a ti.

Espero que se entienda un poquitin xD

Saludos

P.D.: No se si el codigo que has puesto funciona correctamente o no, pero la parte que te faltaba del progress bar deberia ser algo asi a lo que te he puesto yo.

pablopessoa
05-12-2008, 19:24:14
Gracias!! Anda perfecto!!
te pregunto esto por que capas vos puedas sacarme esta duda...
la cosa es asi : el motivo de hacer este sistema, es que varios clientes actualizen sus datos de una base general, pero a su veces, los datos de los clientes deben subirse a la base general y de esta manera todos tienen los datos de todos.
Supongamos que yo implemento este sistema de actualizacion (bajar la base del FTP, actualizar la base local, actualizar la base general con los datos de la local y por ultimo subir de nuevo la base general con los datos actualizados).
Que pasaria si dos clientes actualizan al mismo tiempo y los dos intentan subir sus datos al ftp a la ves?, como se podria controlar eso?
Muchas gracias por tu ayuda!

Lepe
05-12-2008, 22:28:58
Eso debería estar controlado a nivel del sistema gestor de bases de datos. Dicho de otra forma, no debes subir el archivo de base de datos, sino un script con los cambios a realizar en la base principal, me explico:

Ususario 1: modifca la base de datos y sube el script (puro sql):

insert into clientes (nombre, id) values ('pepe', 33);
delete from clientes where idcliente = 64


Ahora llega el Usuario 2: que ejecuta:

update clientes set apellido " gonzález" where idcliente = 64

error: el cliente 64 ha sido borrado previamente por otro usuario. La base de datos genera una excepción y ese usuario queda enterado del asunto.

Si te limitas a subir el archivo de bases de datos (el .fdb, .db o lo que sea), siempre será inconsistente, porque tendrá las modificaciones realizadas por el último usuario.

Lo que planteas creo es muy engorroso, lo ideal sería trabajar directamente por internet con la base principal, Firebird te puede servir perfectamente. Si no puedes hacerlo así, te recomiendo otro método:
- bajas a local la base principal
- cuando el usuario hace una modificación en la local, guardas esos cambios traducidos a sql en un archivo de texto (los scripts esos de que hablo)
- Cuando el usuario quiera actualizar la base principal, sólo tienes que enviar ese archivo de texto y ejecutarlo en la base principal. Controlando los posibles errores que pueda dar.

Saludos y espero te sirva de algo esta parrafada.

Cañones
15-10-2010, 02:44:05
Lo unico que te faltaba era programar el evento "OnWork" del componente FTP.

Cuando asignas eventos, solo tienes que pasarle el nombre de la funcion a llamar... ya que es el emisor el encargado de rellenar los parametros y mandartelo a ti.

Espero que se entienda un poquitin xD

Saludos

P.D.: No se si el codigo que has puesto funciona correctamente o no, pero la parte que te faltaba del progress bar deberia ser algo asi a lo que te he puesto yo.

Gracias. Voy a probarlo.