Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pantalla de proceso y barra de progreso (https://www.clubdelphi.com/foros/showthread.php?t=96780)

elrayo76 11-07-2024 02:29:50

Pantalla de proceso y barra de progreso
 
Buenas a todos,


Tengo una pantalla en mi aplicación Delphi que cuando se clickea sobre un botón para procesar información muestra una barra de progreso que está en otro formulario. El problema es que el formulario de la barra de progreso no se puede mostrar con ShowModal porque el formulario dejaría de procesar.


El problema es que si alguien presiona sobre el formulario de proceso la barra pasa a estar en un segundo plano, cosa que no debería, esta debería estar en primer plano siempre y cerrarse cuando se termina el proceso de los datos.


Hay alguna forma de solucionar esto?. Hay montón de aplicaciones que mientras procesa un formulario muestra una barra de progreso y esta no se puede pasar a segundo plano. Si se presiona sobre el formulario que la abrió no te deja poner a este en primer plano.


Desde ya muchas gracias por las respuestas
El Rayo

Arturo.Molina 11-07-2024 09:47:08

Hola,
¿y por qué no pones la barra de progreso en el mismo formulario que el botón?

Puedes colocar su propiedad visible a false y luego:
Código Delphi [-]
barra.visible := true;
// proceso que actualiza la barra
barra.visible := false;

Neftali [Germán.Estévez] 11-07-2024 10:23:39

Cita:

Empezado por elrayo76 (Mensaje 556659)
Tengo una pantalla en mi aplicación Delphi que cuando se clickea sobre un botón para procesar información muestra una barra de progreso que está en otro formulario. El problema es que el formulario de la barra de progreso no se puede mostrar con ShowModal porque el formulario dejaría de procesar.


Aunque no muestres el formulario con ShowModal, puedes ponerle en la propiedad FormStyle el valor fsStayOnTop.
Eso no lo muestra modal, pero debería mantenerlo siempre en primer plano.
https://docwiki.embarcadero.com/Libr...Form.FormStyle

elrayo76 11-07-2024 20:26:27

Cita:

Empezado por Arturo.Molina (Mensaje 556661)
Hola,
¿y por qué no pones la barra de progreso en el mismo formulario que el botón?

Puedes colocar su propiedad visible a false y luego:
Código Delphi [-]
barra.visible := true;
// proceso que actualiza la barra
barra.visible := false;

Esto que dices lo he pensado. Hasta pense en poner todo lo de la barra en un Frame que luego lo cargo por código y tengo todo centralizado en un solo lugar de como debe funcionar la barra. Porque imaginate que hoy tienes la barra en distintos formularios, el día de mañana la tienes que cambiar, vas a tocar unos cuantos formularios para el cambio?, y si te olvidas de algo y alguna queda distinta, horrible eso.

Igualmente he visto varias aplicaciones que tienen un formulario independiente para la barra. En uno la puedes mover por la pantalla (no es lo que busco) pero no puedes hacer click en el formulario que la inicio porque no te deja trabajar sobre este hasta que no se termine el proceso o sea cancelado.

Saludos
Saludos

elrayo76 11-07-2024 20:28:19

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 556662)
Aunque no muestres el formulario con ShowModal, puedes ponerle en la propiedad FormStyle el valor fsStayOnTop.
Eso no lo muestra modal, pero debería mantenerlo siempre en primer plano.
https://docwiki.embarcadero.com/Libr...Form.FormStyle


No recuerdo si lo he probado, pero voy a ver que resultados da y comentare por si a alguien le puede servir.

Saludos

elrayo76 18-07-2024 02:39:42

Buenas noches,

Paso a comentarles que al parecer la solución de poner el formulario StayOnTop funcionó, pero no como todos puedan creer. Para que funcionara cuando se crea el formulario en el evento "formCreate" tuve que poner lo siguiente como primera línea:

Código Delphi [-]
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

y el el evento "FormDestroy" del formulario por seguridad puse lo siguiente:
Código Delphi [-]

SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

Esta fue la única forma de que funcionara porque no se que pasa que ninguna de las versiones de Delphi que he probado funciona la propiedad "stayOnTop". La última versión que probé y con la que realmente vengo trabajando es con la 11.2

Saludos

Neftali [Germán.Estévez] 18-07-2024 08:41:39

Cita:

Empezado por elrayo76 (Mensaje 556755)
Paso a comentarles que al parecer la solución de poner el formulario StayOnTop funcionó, pero no como todos puedan creer.

Habría que ver qué códigos estás utilizando en tu aplicación en los eventos OnCreate, OnShow, ... o cómo estás gestionando los formularios. Ver si estás redefiniendo procedimientos como los CreateParams o similares.
La propiedad fsStayOnTop funciona correctamente. Yo la estoy usando y la he probado en diferentes versiones.
Si la activas para un formulario lo mantendrá por encima del resto de los formularios de la aplicación.

Estaría bien, que si comentas que no te ha funcionado, explicaras el porqué.

Cita:

Empezado por elrayo76 (Mensaje 556755)
Para que funcionara cuando se crea el formulario en el evento "formCreate" tuve que poner lo siguiente como primera línea:

Comentaba lo anterior, porque al final si revisas el código de la VCL, la propiedad fsStayOnTop en un formulario acaba haciendo lo siguiente:

Código Delphi [-]
SetWindowPos(Handle, HWND_STYLE[FFormStyle = fsStayOnTop], 0, 0, 0, 0,
          SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOOWNERZORDER);

Si te fijas es bastante similar o igual a lo que tú has puesto en tu código.
Si ver tu código (que sólo conoces tú) es difícil saber porqué esa línea no ha funcionado (o no se ha ejecutado) y sí la que tú has puesto en el FormCreate.


La franja horaria es GMT +2. Ahora son las 23:52:05.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi