Una cuarta que se me ocurre a las que ha propuesto [dec], es crear un formulario de progreso "tonto" y pasarle el procedimiento que debe ejecutar.
De esta forma la lógica no está en el formulario, sino que símplemente se le pasa la referencia.
Además el mismo procedimiento sirve para ejecutarlo con y sin formulario.
El proceso sería el siguiente:
Código Delphi
[-]procedure TForm1.Proceso();
var
i:integer;
begin
for i := 0 to 100 do begin
Sleep(50);
Self.Caption := Format('Pasi %d de %d', [i, 100]);
Application.ProcessMessages;
end;
end;
La llamada normal sería así:
La llamada utilizando el formulario de progreso sería así:
Código Delphi
[-]TFormProgreso.ExecuteProcess(Proceso);
Y el form de progreso tendría un método de clase para ejecutarlo:
Código Delphi
[-]class procedure TFormProgreso.ExecuteProcess(aProceso: TProcess);
var
FormProgreso: TFormProgreso;
begin
FormProgreso := TFormProgreso.Create(Application);
FormProgreso.FProceso := aProceso;
FormProgreso.ShowModal;
FormProgreso.Free;
end;
Esta parte correspondería a la ejecución:
Código Delphi
[-]procedure TFormProgreso.FormShow(Sender: TObject);
begin
PostMessage(Self.Handle, WM_AFTER_SHOW, 0, 0);
end;
procedure TFormProgreso.WMAfterShow(var Msg: TMessage);
begin
if Assigned(FProceso) then
FProceso();
Close;
end;
Funcionando con ambos sistemas...
Os adjunto el código del ejemplo y lo subo al FTP.