Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-08-2020
juggern juggern is offline
Miembro
 
Registrado: jun 2020
Posts: 79
Poder: 4
juggern Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 20-08-2020
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 20-08-2020
juggern juggern is offline
Miembro
 
Registrado: jun 2020
Posts: 79
Poder: 4
juggern Va por buen camino
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!
Responder Con Cita
  #4  
Antiguo 20-08-2020
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
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.
Archivos Adjuntos
Tipo de Archivo: zip FormularioModalProgreso.zip (53,6 KB, 20 visitas)
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 20-08-2020 a las 12:36:25.
Responder Con Cita
  #5  
Antiguo 20-08-2020
juggern juggern is offline
Miembro
 
Registrado: jun 2020
Posts: 79
Poder: 4
juggern Va por buen camino
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!

Última edición por juggern fecha: 20-08-2020 a las 12:20:54.
Responder Con Cita
  #6  
Antiguo 20-08-2020
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Barra de progreso nabucodonosor Delphi para la web 3 01-11-2012 10:57:04
Barra de Progreso XcamX MySQL 1 21-12-2010 11:24:52
TIdFtp y barra de progreso madmai Internet 3 25-02-2009 15:20:14
Barra de progreso? marlulipe Impresión 5 26-02-2008 16:51:55
Mostrar progreso de descarga de IndyFTP con barra de progreso devicer Internet 2 05-12-2005 14:59:32


La franja horaria es GMT +2. Ahora son las 22:54:30.


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
Copyright 1996-2007 Club Delphi