PDA

Ver la Versión Completa : Actualizar ProgressBar de un formulario desde DataModule


Jesús Pena
01-04-2007, 02:24:20
Necesito saber como realizar la actualización de una progressbar que está en un formulario desde un datamodule asociado (necesito poder acceder a los parámetros de maximo y posicion de la misma pues se actualizará desde un bucle y que se ejecute desde 1 hasta el número de registros a tratar).

Recuerdo haber visto algo al respecto por algún lado pero no lo encuentro.

Gracias.

Héctor Randolph
01-04-2007, 03:18:24
Un posible solución es la siguiente:

Puedes crear un evento en el DataModule que se dispare cada vez que procesas un registro, en este evento puedes enviar como parámetros el total de registros y el registro actual, después asignas ese evento desde el Form para que se reflejen los cambios en tu ProgressBar.

Te dejo un código de ejemplo:

Este es el código del DataModule para crear el evento con los parámetros


type
TMiEvento = procedure(Sender: TObject; RegActual, Total: Integer) of object;


Después creas un campo y una propiedad para poder asignar este evento desde otro módulo.


private
{ Private declarations }
FMiEvento: TMiEvento;//Creamos un campo
public
{ Public declarations }
property OnMiEvento: TMiEvento read FMiEvento write FMiEvento;
procedure Miproceso;
end;


Finalmente dentro de tu proceso disparas el evento cada vez que recorres un registro.


procedure TDataModule1.MiProceso;
var
Total:Integer;
begin
Table1.First;
Total:=Table1.RecordCount;
while not Table1.EOF do
begin
if Assigned(FMiEvento) then
FMiEvento(nil,Table1.RecNo,Total);//Enviamos los parametros
Table1.Next;
end;
end;


Finalmente desde tu formulario asignas este evento


var
Form1: TForm1;

implementation

uses
Unit2; // Este es el que contiene el DataModule

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DataModule2.OnMiEvento:=ActualizaProgreso; //Asignamos el evento que se encarga de mostrar la barra
end;

procedure TForm1.ActualizaProgreso(Sender: TObject; RegActual, Total: Integer);
begin
ProgressBar1.Max:=Total;
ProgressBar1.Position:=RegActual;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
DataModule2.Miproceso; //Ejecuto el proceso que está en el DataModule al pulsar un botón por ejemplo
end;

end.


Saludos

Jesús Pena
13-04-2007, 01:27:13
Problema resuelto.

Muchas Gracias.

:)