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 26-07-2023
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Formulario con ProgressBar cierra al principal

Buenas a todos,

Tengo una aplicación con un TreeView el cual se carga desde un archivo. Mientras se carga el archivo se abre un formulario que tiene una barra de progreso que se va incrementando. El formulario de la barra de progreso lo abro en no modal para que se pueda ir ejecutando el código del formulario principal.

El tema es que esa misma barra de progreso la uso para cuando se hace click sobre alguno de los nodos del TreeView y se carga un ListView que está también en el formulario principal.

Ahora es donde viene el problema. Lo que sucede es que se ve como la barra de progreso se muestra y se actualiza, el Listview se carga perfecto pero al terminar la carga el formulario principal es como que se pone por detrás de todo lo que se tenga abierto (puede ser el entorno de Delphi)

Les pongo algo de código de como llamo al formulario con la barra de progreso al hacer click en un nodo y se carga el ListView.

Código Delphi [-]
frmProgressBar := TfrmProgressBar.Create(nil);

try
   frmProgressBar.Init('Leyendo archivo', 0, 1);  // Incializa el título, el mínimo y máximo de la barra de progreso.
   frmProgressBar.Message := 'Carga del ListView';  // Mensaje adicional en el form de barra de progreso.
   frmProgressBar.Show;

   // Método que va actializando el progreso de la barra.
   frmProgressBar.UpdateProgress(intEndRecord - intStartRecord);

   // Acá se lee el archivo y se va cargando el ListView.
   // Esto es un ciclo y dentro lo primero que hace es actualizar la barra por cada 1000 lineas leídas
   if (intRecord mod 1000) = 0 then
   begin
      frmProgressBar.Message := Format('Cargando el ListView... %s', [intRecord]);
      // Lo que se hace en este método es actualizar la posición de la barra,
      // Actualizar el mensaje, hacer un Update del formulario y un "Application.ProcessMessages

      frmProgressBar.UpdateProgress(intRecord - intStartRecord);
   end;

   // Acá toda la lógica para cargar el ListView con los datos leídos del archivo   

finally
   frmProgressBar.Release;
end;

Esto es todo. Espero que se entienda y sino es así me lo hacen saber.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #2  
Antiguo 26-07-2023
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 diversos formularios compartidos con barras de progreso y siempre los libero con free. O bien directamente, o bien a través de un procedimiento finalizar del propio formulario en el que se realizan otras tareas necesarias antes del free.
Responder Con Cita
  #3  
Antiguo 26-07-2023
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
kuan-yiu yo en los proyectos que trabajado en distintas empresas siempre los liberaban con Release. Siempre me dijeron que es mejor que Free en alguna forma.

Dejo la web de Embarcadro donde esta esto.

https://docwiki.embarcadero.com/Libr...omForm.Release

¿Igualmente eso tiene que ver en algo con lo que consulto?
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #4  
Antiguo 27-07-2023
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Poder: 9
Delphi01 Va por buen camino
Cita:
Empezado por elrayo76 Ver Mensaje
Buenas a todos,

Tengo una aplicación con un TreeView el cual se carga desde un archivo. Mientras se carga el archivo se abre un formulario que tiene una barra de progreso que se va incrementando. El formulario de la barra de progreso lo abro en no modal para que se pueda ir ejecutando el código del formulario principal.

El tema es que esa misma barra de progreso la uso para cuando se hace click sobre alguno de los nodos del TreeView y se carga un ListView que está también en el formulario principal.

Ahora es donde viene el problema. Lo que sucede es que se ve como la barra de progreso se muestra y se actualiza, el Listview se carga perfecto pero al terminar la carga el formulario principal es como que se pone por detrás de todo lo que se tenga abierto (puede ser el entorno de Delphi)

Les pongo algo de código de como llamo al formulario con la barra de progreso al hacer click en un nodo y se carga el ListView.

Código Delphi [-]
frmProgressBar := TfrmProgressBar.Create(nil);

try
   frmProgressBar.Init('Leyendo archivo', 0, 1);  // Incializa el título, el mínimo y máximo de la barra de progreso.
   frmProgressBar.Message := 'Carga del ListView';  // Mensaje adicional en el form de barra de progreso.
   frmProgressBar.Show;

   // Método que va actializando el progreso de la barra.
   frmProgressBar.UpdateProgress(intEndRecord - intStartRecord);

   // Acá se lee el archivo y se va cargando el ListView.
   // Esto es un ciclo y dentro lo primero que hace es actualizar la barra por cada 1000 lineas leídas
   if (intRecord mod 1000) = 0 then
   begin
      frmProgressBar.Message := Format('Cargando el ListView... %s', [intRecord]);
      // Lo que se hace en este método es actualizar la posición de la barra,
      // Actualizar el mensaje, hacer un Update del formulario y un "Application.ProcessMessages

      frmProgressBar.UpdateProgress(intRecord - intStartRecord);
   end;

   // Acá toda la lógica para cargar el ListView con los datos leídos del archivo   

finally
   frmProgressBar.Release;
end;

Esto es todo. Espero que se entienda y sino es así me lo hacen saber.

Saludos,
El Rayo
El problema que se presenta es que después de cargar el ListView, el formulario principal se coloca detrás de todo lo que se tenga abierto, incluyendo el entorno de Delphi. Esto puede deberse a que el formulario de la barra de progreso se abrió en modo no modal y no se cerró correctamente después de que se cargó el ListView.
Para solucionar este problema, se puede cerrar el formulario de la barra de progreso después de cargar el ListView. Para hacer esto, se puede llamar al método Close() del formulario de la barra de progreso después de cargar el ListView. Además, se puede cambiar el modo en que se abre el formulario de la barra de progreso a modal para evitar que el usuario interactúe con el formulario principal mientras se carga el ListView.
Aquí hay un ejemplo de cómo se puede modificar el código para cerrar el formulario de la barra de progreso después de cargar el ListView y abrir el formulario de la barra de progreso en modo modal:
Código Delphi [-]
frmProgressBar := TfrmProgressBar.Create(nil);

try
   frmProgressBar.Init('Leyendo archivo', 0, 1);  // Inicializa el título, el mínimo y máximo de la barra de progreso.
   frmProgressBar.Message := 'Carga del ListView';  // Mensaje adicional en el form de barra de progreso.
   frmProgressBar.ShowModal;  // Abre el formulario de la barra de progreso en modo modal.

   // Método que va actualizando el progreso de la barra.
   frmProgressBar.UpdateProgress(intEndRecord - intStartRecord);

   // Acá se lee el archivo y se va cargando el ListView.
   // Esto es un ciclo y dentro lo primero que hace es actualizar la barra por cada 1000 lineas leídas
   if (intRecord mod 1000) = 0 then
   begin
      frmProgressBar.Message := Format('Cargando el ListView... %s', [intRecord]);
      // Lo que se hace en este método es actualizar la posición de la barra,
      // Actualizar el mensaje, hacer un Update del formulario y un "Application.ProcessMessages

      frmProgressBar.UpdateProgress(intRecord - intStartRecord);
   end;

   // Acá toda la lógica para cargar el ListView con los datos leídos del archivo   

finally
   frmProgressBar.Close;  // Cierra el formulario de la barra de progreso después de cargar el ListView.
end;

En este ejemplo, se llama al método ShowModal() en lugar de Show() para abrir el formulario de la barra de progreso en modo modal. Después de cargar el ListView, se llama al método Close() del formulario de la barra de progreso para cerrarlo.

Última edición por Casimiro Notevi fecha: 27-07-2023 a las 09:46:31. Razón: Poner etiquetas [delphi] [/delphi] al código.
Responder Con Cita
  #5  
Antiguo 28-07-2023
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Delphi01, si perdón copie el texto cuando estaba haciendo una prueba por algo que encontré en otro mensaje del foro, pero que no funcionó. En donde dices si va Show() y con este es con el que pasa lo que comenté.


Con el Close() que dices hace el mismo problema, con la diferencia de que si levanto el formulario principal el mismo queda bloqueado y no se puede hacer nada.



Saludos
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #6  
Antiguo 29-07-2023
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Delphi01, perdón entendí mal tu comentario.

Te cuento si pones ShowModal() en vez de Show() lo que haces es que lo que está en el formulario principal no se ejecute, ya que hasta que no se cierra el formulario de la barra no se puede ejecutar otra cosa. Así es como funciona ShowModal() no permite hacer otra cosa en la aplicación si no se tiene en el propio formulario abierto, cosa que no es lógico porque tendría que tener un formulario de progreso por cada otro formulario donde lo necesite.

Con Close() tampoco es la solución porque al cerrarse el formulario de la barra todo lo que quieras hacer en el principal queda bloqueado.

Esto que comento no es que me pase a mi solo, lo he vistos en muchos otros desarrollos y nunca lo solucionaron como corresponde.

Saludos
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno

Última edición por elrayo76 fecha: 29-07-2023 a las 23:13:32. Razón: Se corrigen las líneas en blanco que se agregan al guardar desde Firefox desde siempre
Responder Con Cita
  #7  
Antiguo 29-07-2023
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Poder: 9
Delphi01 Va por buen camino
Cita:
Empezado por elrayo76 Ver Mensaje
Delphi01, perdón entendí mal tu comentario.

Te cuento si pones ShowModal() en vez de Show() lo que haces es que lo que está en el formulario principal no se ejecute, ya que hasta que no se cierra el formulario de la barra no se puede ejecutar otra cosa. Así es como funciona ShowModal() no permite hacer otra cosa en la aplicación si no se tiene en el propio formulario abierto, cosa que no es lógico porque tendría que tener un formulario de progreso por cada otro formulario donde lo necesite.

Con Close() tampoco es la solución porque al cerrarse el formulario de la barra todo lo que quieras hacer en el principal queda bloqueado.

Esto que comento no es que me pase a mi solo, lo he vistos en muchos otros desarrollos y nunca lo solucionaron como corresponde.

Saludos
Hola ,
Tambien pudes utilizar threads (hilos), es una solución.
Saludos.
Responder Con Cita
  #8  
Antiguo 29-07-2023
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 290
Poder: 21
elrayo76 Va por buen camino
Buenas, si eso de threads podría ser pero por lo que es la aplicación no quiero complicarla mas. Igualmente ya buscando nuevamente por otros foros encontré la solución, que paso a contarles y es muy simple.

Luego de llamar al Release() para cerrar el formulario de la barra de progreso llamo al BringToFront() del formulario principal. Esto hace que el formulario nunca que de por detrás o minimizado luego de cerrar el otro que se llama con Show().

Gracias a todos por responder y espero que a alguien mas le pueda ser de utilidad.

Saludos
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno

Última edición por elrayo76 fecha: 29-07-2023 a las 23:43:52. Razón: Se corrigen las líneas en blanco que se agregan al guardar desde Firefox desde siempre
Responder Con Cita
  #9  
Antiguo 06-08-2023
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Poder: 9
Delphi01 Va por buen camino
Cita:
Empezado por elrayo76 Ver Mensaje
Buenas, si eso de threads podría ser pero por lo que es la aplicación no quiero complicarla mas. Igualmente ya buscando nuevamente por otros foros encontré la solución, que paso a contarles y es muy simple.

Luego de llamar al Release() para cerrar el formulario de la barra de progreso llamo al BringToFront() del formulario principal. Esto hace que el formulario nunca que de por detrás o minimizado luego de cerrar el otro que se llama con Show().

Gracias a todos por responder y espero que a alguien mas le pueda ser de utilidad.

Saludos
Genial , gracias
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
No cierra un formulario lbidi Varios 7 09-03-2012 17:39:11
Determinar en un Form Principal cuando se Cierra un Form Hijo Efren2006 OOP 5 26-02-2009 20:08:35
Actualizar ProgressBar de un formulario desde DataModule Jesús Pena Varios 2 13-04-2007 01:27:13
Formulario modal, se cierra ElDioni Varios 2 24-10-2005 20:19:08
Formulario con dos ProgressBar Javi2 Varios 1 06-09-2004 18:26:43


La franja horaria es GMT +2. Ahora son las 01:59:39.


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