Ver Mensaje Individual
  #4  
Antiguo 27-07-2023
Delphi01 Delphi01 is offline
Miembro
 
Registrado: nov 2015
Ubicación: Barcelona,España
Posts: 68
Reputación: 10
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 10:46:31. Razón: Poner etiquetas [delphi] [/delphi] al código.
Responder Con Cita