Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Como programar un ProgressBar (https://www.clubdelphi.com/foros/showthread.php?t=62138)

pablopessoa 05-12-2008 03:06:39

Como programar un ProgressBar
 
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.

Código Delphi [-]
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 14:54:30

Código Delphi [-]
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 20: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 23: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):
Código SQL [-]
insert into clientes (nombre, id) values ('pepe', 33);
delete from clientes where idcliente = 64

Ahora llega el Usuario 2: que ejecuta:
Código SQL [-]
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 03:44:05

Cita:

Empezado por xEsk (Mensaje 329861)
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.


La franja horaria es GMT +2. Ahora son las 14:39:06.

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