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 29-12-2010
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Continuar ejecución tras formHijo.Showmodal en formPadre

Hola de nuevo foreros

Seguramente será una pregunta tonta, pero no doy 'con la tecla'. Resulta que necesito mostrar un progressbar dentro de un formulario que abro mientras se realiza un proceso que tarda varios segundos (a modo de animación de espera). Y no sé cómo hacerlo porque al mostrar el formulario que contiene el progressbar, al hacer el '.show' se queda parada ahí la ejecución.

Pormenorizadamente:

Tengo un formulario (form1) donde se ejecuta un proceso. Y desde aquí llamo a otro form 'formEspera', que muestra el título de proceso que se está realizando y el progress bar:

Código Delphi [-]
formEspera := TformEspera.Create(Application);
                    try
                      formEspera.Inicio('ProcesoX', self);
                      // Lanzamiento del proceso
                      procesoX(...);
                      formEspera.Close();
                      showmessage('Proceso concluido');
                    finally
                      formEspera.Release;

Y formEspera, el formulario que se muestra a modo 'pop up' conteniendo el progressbar:

Código Delphi [-]
type
  TformEspera = class(TForm)
    ProgressBar1: TProgressBar;
    lbTitulo: TLabel;
    Timer1: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    accion : String;
    padre : TForm;
  public
    { Public declarations }
    procedure inicio(pAccion:String; padre:TForm);
  end;
var
  formEspera: TformEspera;
implementation

procedure TformEspera.FormShow(Sender: TObject);
begin
    self.padre.SetFocus;
end;
procedure TformEspera.inicio(pAccion:String; padre:TForm);
begin
    self.accion := pAccion;
    // Ponemos título
    if (self.accion = 'ProcesoX') then
        self.lbTitulo.Caption := 'Realizando proceso X';
    // Arrancamos timer para que controle el progress bar
    self.Timer1.Enabled := true;
    // Mostramos formulario
    self.showmodal;
end;

procedure TformEspera.Timer1Timer(Sender: TObject);
begin
    self.ProgressBar1.StepIt;
    self.update;
end;

procedure TformEspera.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    self.Release();
end;

// END UNIT
end.

¿Alguien puede decirme como hacer para que una vez mostrado el formEspera, quede en primer plano este formulario con el progrssbar andando, y siga la ejecución por form1?

Gracias y un saludo.
Responder Con Cita
  #2  
Antiguo 29-12-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Bauhaus1975.

Revisá este ( link ) del foro, si no te entendí mal, creo que el caso es muy parecido.

También podrías hacer uso de Threads. En el foro existen muchos ejemplos sobre el tema

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 29-12-2010 a las 18:45:22.
Responder Con Cita
  #3  
Antiguo 29-12-2010
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
Porque en lugar de mostrarlo con ShowModal, que deja la ejecución parada hasta que se cierra, no lo muestras normal, pero defines que quede "onTop" encima de todos los demás.
De esta forma a ejecución continuaría ejecutándose el proceso y el formulario de progreso quedaría encima de todos los demás.
__________________
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.
Responder Con Cita
  #4  
Antiguo 30-12-2010
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Hola Ecfisa y Neftali. Gracias por vuestra ayuda.

He probado ambas cosas, con la solución propuesta por Ecfisa consigo además visualizar modalmente. Y recupero la ejecución en el formulario padre, siempre que desde el formulario con el progrssbar (hijo) llame a un método del padre (sino creo que no se puede).

La verdad es que funciona, la ventana emergente se visualiza y el proceso se lanza, termina y se cierra la ventana emergente.

Aún así, resulta que el progress bar 'no progresa', es decir, parece que el timer no es capaz de de actuar. Supongo que es debido a que el proceso se apodera de toda la ejecución...
¿Quiere esto decir que no me queda más remedio que usar threads para mostrar la ventana con el progessbar en un proceso independiente?

No soy experto en Delphi ni mucho menos, aunque algunos me conoces aqui desde hace años, mi trabajo con Delphi es eventual. No me había topado nunca con este problema, meramente de presentación, pero el caso es que pensaba que esto era más sencillo y común...

Si tenéis más ideas os agradezco enormemente vuestra ayuda, enotrocaso empezaré a revisar los threads (que todavía no he usado)

Gracias y un saludo.
Responder Con Cita
  #5  
Antiguo 30-12-2010
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
Durante la ejecución del proceso del proceso puedes colocar (sobre todo si hay algun bucle) un:

Código Delphi [-]
Application.ProcessMessages;

Si el prolema es por el tema de formularios modales y que la ejecución va por otro sitio, sólo te queda usar threads. En el FTP hay algunos ejemlos de su uso.
__________________
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.
Responder Con Cita
  #6  
Antiguo 30-12-2010
Bauhaus1975 Bauhaus1975 is offline
Miembro
 
Registrado: may 2005
Ubicación: Málaga
Posts: 135
Poder: 20
Bauhaus1975 Va por buen camino
Cita:
Empezado por Neftali Ver Mensaje
Durante la ejecución del proceso del proceso puedes colocar (sobre todo si hay algun bucle) un:


Código Delphi [-]Application.ProcessMessages;



Si el prolema es por el tema de formularios modales y que la ejecución va por otro sitio, sólo te queda usar threads. En el FTP hay algunos ejemlos de su uso.
Cierto. Añadiendo dentro del bucle del proceso esa sentencia el timer funciona, y por tanto el progrssbar se refresca. Cada X iteraciones he puesto que se haga la llamada al
Application.ProcessMessages;No sé cómo de poco eficiente es para el sistema, pero ahora funciona.

Muchas gracias por la ayuda.
Responder Con Cita
  #7  
Antiguo 30-12-2010
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
Cita:
Empezado por Bauhaus1975 Ver Mensaje
No sé cómo de poco eficiente es para el sistema, pero ahora funciona.
Tal como su nombre indica, lo que hace esta instrucción es permitir que windows procese mensajes de la cola; Si no la colocas, dependiendo del proceso que estés ejecutando no le das tiempo a hacerlo, de ahí que el progressbar no se moviera en tu caso.

Está clar que pierdes algo de eficiencia al realizar tu proceso, en este caso el tiempo que se pierde en mover el progressbar, pero está claro que si has puesto el progressbar es porque quieres "perder" algo de tiempo del proceso en hacer que se mueva. ;-)
__________________
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.
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
continuar una numeracion con Qreport Alfredo Impresión 7 23-10-2007 11:05:53
Ejecutar sentencias tras ejecución de otro programa Novás Varios 2 30-08-2007 15:06:28
Key violation. Continuar con siguiente registro CHiCoLiTa Conexión con bases de datos 11 14-02-2007 21:48:37
Continuar numeracion en impresion !! Help RJF Impresión 2 07-11-2006 04:43:17
No se continuar pepelu1975 Varios 1 19-02-2004 11:02:22


La franja horaria es GMT +2. Ahora son las 22:58:43.


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