Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

¿Alternativa a Show()?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿Alternativa a Show()? Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.