| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Vie 18 Jul, 2008 1:33 pm Asunto: ¿Alternativa a Show()? |
|
|
Estoy tratanto de descubir un error en una aplicación. Cuando llevo muchas llamadas seguidas de un formulario a otro se produce un extraño efecto; el Form que llama se queda completamente en blanco. Luego ocurre lo mismo con el Form llamado.
Para hacer una prueba he hecho lo siguiente. He creado dos formularios, uno llama al otro:
(Esto en un boton).
| Código: |
for (int a = 0;a < 1000; a ++)
{
Form2->Show();
Form2->Label1->Caption = AnsiString(a);
Application->Title = AnsiString(a);
//Sleep(100);
Form2->Close();
}
|
El Form2 debe tener la propiedad WindowsState a Maximized. En la últmia llamada Se produce el efecto al que hago alusión: el form llamado se queda en blanco. Cuantos más objetos añades a este form (no te digo si pones colores degradados y bitmaps) más se nota este form en blanco.
Si haces operaciones con BD y muestras los datos, etc. el problema aumenta mucho.
¿Hay alguna otra manera de llamar a un formulario? Sospecho que el problema está en hacer tantas veces Show() y Close();
Ultima edición por laremi400 el Lun 21 Jul, 2008 8:41 am, editado 3 veces |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 18 Jul, 2008 4:06 pm Asunto: |
|
|
Repite el mensaje marcando la casilla Deshabilitar HTML en este mensaje que hay más abajo para ver mejor el código.
| Código: | for (int a = 0;a < 1000; a ++)
{
Form2->Show();
Form2->Label1->Caption = AnsiString(a);
Application->Title = AnsiString(a);
//Sleep(100);
Form2->Close();
} |
Hay cosas en el código (que imagino es así) que no entiendo muy bien: ¿Haces el close del Form2 desde Form1? ¿Y te funciona bien? No sé, es la primera vez que lo veo. Yo probaría esto otro:
| Código: | for (int a = 0;a < 1000; a ++)
{
Application->CreateForm(__classid(TForm2), &Form2);
Form2->Label1->Caption = AnsiString(a);
Application->Title = AnsiString(a);
Form2->ShowModal();
//Sleep(100);
delete Form2;
} |
_________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 21 Jul, 2008 8:40 am Asunto: |
|
|
Ok Ángel. Muchas gracias.
Efectivamente el código es como lo has puesto tú. Perdón a todos por el empanamiento mental.
Sí, el Close del Form2, lo hago desde el Form1 y funciona, pero me hace esa cosa rara.
Lo hago así, por que estoy hacienco pruebas y no conseguía cerrar el Form2 si hacía ShowModal.
Lo curioso es que si lo haces una vez no pasa nada, pero si lo haces unas cuentas, falla.
Ahora mismo pruebo tu sugerencia.
Gracias de nuevo. |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 21 Jul, 2008 8:50 am Asunto: |
|
|
Bueno, pues lo he probado y hace lo mismo, o incluso peor.
El form1 se pone "en blanco", y los dos formularios acaban haciendo cosas raras.
Si dejo el sleep(100) para que se vea mejor el efecto, un formulario se queda en blanco, el otro desaparece hasta que minimizas todo, y además el contador que le he puesto para se vea en el Aplication->Title, deja de contar.
Supongo que son problemas de referesco de la pantalla, pero no sñe como hacerlo para estos problemas no se produzcan. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 21 Jul, 2008 8:58 am Asunto: |
|
|
A ver. Como no sé que es exactamente lo que quieres hacer, te he puesto ese código. Está claro que si creas y destruyes un formulario de forma muy rápida puede ocurrir que se llegue a "pisar" unos a otros. En lugar de Close() prueba a utilizar Hide(); prueba así:
| Código: | Application->CreateForm(__classid(TForm2), &Form2);
for (int a = 0;a <1000>Label1->Caption = AnsiString(a);
Application->Title = AnsiString(a);
Form2->Showl();
Sleep(100);
Application->ProcessMessages();
Form2->Hide();
}
delete Form2; |
Prueba añadiendo Application->ProcessMessages();. Con esto, hasta que no se han procesado todos los mensajes pendientes no continúa la ejecución del programa. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 21 Jul, 2008 9:09 am Asunto: |
|
|
OK.
Gracias Angel. Así va mucho mejor.
Te explico lo que quiero hacer. Tengo una aplicación en la que se da esta situación, un formulario llama a otro.
El Form2 tiene una consulta SQL, muestra un inventario de una determinada referencia. El objeto de la aplicación es que usuario pueda seleccionar que producto tiene que enviar.
Hasta ahí todo bien. Hace la consulta, se muestra en el Form2 y el usario selecciona con un doble clic.
El problema es que se ha pasado de 100 productos a enviar a 800. Y cuando llevan hechas unas cuantas consultas el Form2 y el Form1 se ponen en blanco. Y salen otros errores (pero voy uno a uno hasta ver que ocurre).
Con este ejemplo intento emular la situación para evitarla. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 21 Jul, 2008 9:47 am Asunto: |
|
|
¿Y si reempalzas ese Form2 por, por ejemplo, un ListView con la propiedad Checkboxes activada. Cargas el ListView a partir de la consulta con todos los productos y dejas que el usuario seleccione aquellos que le interesa. Una vez que los haya seleccionado en el ListView, ejecutas un bucle en el que si está marcada la casilla se haga el proceso que sea necesario en cada caso. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 21 Jul, 2008 12:52 pm Asunto: |
|
|
| Eso suele ser lo usual. El problema aquí es la cantidad de datos que tienen que consultar, es tan grande que necesito ese formulario. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 21 Jul, 2008 3:35 pm Asunto: |
|
|
Mezcla los dos sistemas.
1. Presentas en el ListView las referencias para que las seleccione.
2. Te metes en un bucle for con los caption del ListView y vas mostrando el formulario para cada selección.
3. En el Form2 ejecutas lo que te haga falta para cada ítem seleccionado. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
|