Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Barra de progreso modal (https://www.clubdelphi.com/foros/showthread.php?t=94844)

juggern 20-08-2020 08:49:57

Barra de progreso modal
 
Perdón si últimamente molesto mucho con temas que lo mismo son fáciles pero es que estoy empezando con Delphi.

Verán, ya he puesto en algunos formularios la típica barra de progreso para mientras carga o hace actualizaciones en base de datos, etc...

Mi cuestión es, hay a veces, que no tengo el proceso en un formulario, por ejemplo, al darle a un botón de menú, recalcula todos los precios o cosas así. En este caso, mi intención era hacer una especie de ventanita de carga modal que simplemente fuera una barra de progreso.

No estoy seguro como hacerlo, porque si hago un formulario solo con una barra de progreso y lo abro de forma modal, el proceso se está realizando en otro formulario, no puedo actualizar el modal no?
Es decir, quería tener una ventana de barra de progreso genérica, modal, a la que poder invocar cada vez que quiera hacer un proceso que va a tardar y que solo muestre eso, la barra de progreso y la vaya actualizando desde otro formulario.

No se si se puede hacer eso o no.

Muchas gracias

dec 20-08-2020 10:45:23

Hola a todos,

Se me ocurren tres posibles soluciones, lo que no quiere decir que no pueda haber otras también:

1º Utilizar hilos. Si el proceso que quieres llevar a cabo se realiza en un hilo diferente del principal, dicho hilo podrá actualizar el formulario modal / barra de progreso.

2º "Mover" el proceso que quieres llevar a cabo al formulario modal, esto es, realizarlo en el propio formulario modal, de modo que podrás también actualizar la barra de progreso.

3º No usar un formulario modal sino uno "StayOnTop" (acaso dicho formulario podría / debería tener como "Parent" al formulario principal).

Acaso otros compañeros puedan aportar otras posibles soluciones también. :)

juggern 20-08-2020 10:49:57

Hola dec,

Gracias por responder.

La opción 2 ya la tengo hecha y me funciona bien... y según te estaba respondiendo he pensado... bueno pues uso esta forma y puedo tener un form de barra de progreso con los distintos procesos que no necesiten un formulario propio, así yo creo que me iría bien y agruparía todos esos procesos en un mismo form.

Un saludo!

Neftali [Germán.Estévez] 20-08-2020 12:11:23

1 Archivos Adjunto(s)
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í:

Código Delphi [-]
proceso;

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.

juggern 20-08-2020 12:16:51

Ese es exactamente el que tenía en mente!!! voy a echarle un ojo.

Lo que yo tenía pensado es que el contador estuviera en la barra de progreso, es decir, que el usuario supiera cuanto falta de proceso, pero eso es lo que creo que no se puede hacer

Muchas gracias!

kuan-yiu 20-08-2020 12:49:50

Yo uso una barra dentro de un pequeño formulario con un formato unificado para toda la aplicación. La llamo siempre que lo necesito con este código.

Código Delphi [-]
//Creo el formulario    
   Application.CreateForm(TF_barra, F_barra);
   
//Inicializo la barra. (Función definida dentro del formulario de la barra)
   F_barra.caption := 'Texto para mostrar en la ventana.';
   F_barra.Panel1.caption := 'Texto para mostrar sobre la barra.';
   F_barra.ProgressBar1.Position := 0;
   F_barra.ProgressBar1.Max := cTamanho;  //Constante definida en cada uno de los procesos que hacen uso de la barra
   F_barra.Show;
   F_barra.Update;
   
//Cada vez que tengo que mover la barra. (Función definida dentro del formulario de la barra pero puedes hacerlo directamente así)    
   F_barra.ProgressBar1.StepIt;
//Aquí puedes poner el estado del proceso en número pero yo no lo tengo
   F_barra.Panel1.caption := 'Estado: '+ IntToStr(F_barra.ProgressBar1.Position) +' / '+ IntToStr(F_barra.ProgressBar1.Max);
   F_barra.Update;
   
//La libero cuando acabo. (Función definida dentro del formulario de la barra)
   F_barra.ProgressBar1.Position := F_barra.ProgressBar1.Max;
   F_barra.close;
   F_barra.free;


La franja horaria es GMT +2. Ahora son las 22:09:21.

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