Ir al contenido


Foto

Sentido ahora con el OnCreate de forms


  • Por favor identifícate para responder
4 respuestas en este tema

#1 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 292 mensajes

Escrito 08 junio 2021 - 02:52

Como principiante siempre he creado los form desde Archivo->Nuevo Formulario. Mala praxiS según expertos. Y cuando he querido que algo se cargue en él, lo indico en el evento OnCreate.
 
Pero cuando se carga el form1? pues con todo al ejecutar la aplicación, ejecutándose al mismo tiempo el Oncreate, cierta mi reflexión?
 
1. Esta reflexión me ha surgido (a ver si explico), porque tengo un form1 que visualiza un dbgrid y un botón para lanzar otro form2 tambien con su dbgrid.
2. Cargo un dato en el dbgrid del form1 y perfecto me lo visualiza en el dbgrid del form1.
 
Pero al lanzar con el botón el form2, para ver el mismo contenido que tiene el dbgrid del form1, no se actualiza con el dato introducido.
 
El form2 tiene el evento OnCreate donde hago un recorrido para visualizar todo los datos, directamente al dbgrid cuando cargo el form2, por eso lo hago en el Oncreate.
 
Luego mi problema, es porque el Oncreate del form2, se ejecuta una sola vez al ejecutar la aplicación, y el botón que lanza el form2, ya no hace nada, o ese he sacado en conclusión.
 
Ahora para que no pase eso, en el botón para lanzar el form2 indico que en ese momento se cree el form2. Pero ya lo tengo creado por IDE y ejecutado el ONCREATE cuando se ejecutó la aplicación que es el problema, Lo cierro con .free, pero me da error al trabajar sobre el, aunque sí ejecuta correctamente.
 
procedure TForm1.button1();
begin
        Form2.free;                            // Destruir el form2 por IDE pero en ejecución salta algun error, aunque compila.
        Form2:=TForm2.create(self); // Según he leído, debe estar creado previamente.
        Form2.show; 
end;
 
Como añado componentes a este form2 visualmente como hacía hasta ahora al crear por IDE para que al cargar con .show lo vea completo?
 
Una pequeña lección de los expertos a mi caso concreto?. Estoy contento, aunque tenga este problema, porque he aprendido de esto.

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 10 junio 2021 - 05:43

Tienes un poco de lío.

Una cosa es crear con el IDE un Formulario y otra es crear un objeto de la clase.

 

Con el IDE vas a diseñas tu formulario y es muy raro que precises añadir componentes en fase de ejecución aunque se puede y no es difícil. Entiendo que lo que realmente necesites es actualizar tu formulario.

 

Cuando creas un formulario en fase de diseño (IDE) por defecto se establece como autocreado, es decir, al arrancar tu aplicación se crea aunque no lo veas. Puedes diseñarlo como no autocreado, en cuyo caso lo tienes que crear TForm2.create(self) antes de mostrarlo y es recomendable que te encargues de su destrucción.

 

Dado que lo que necesitas es actualizar tu formulario, es una buena practica escribir un método público que haga esa tarea. En tu caso cargar dbgrid y quizás otras cosas. Después de eso puedes llamar a ese método desde OnCreate o desde donde quieras. Así, tras mostrar tu formulario autocreado puedes hacer esto:


php
  1. procedure TForm1.button1();
  2. begin
  3. Form2.Actualiza;
  4. Form2.Show;

Saludos.


  • 0

#3 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 292 mensajes

Escrito 10 junio 2021 - 03:22

Gracias Escafandra. La bofetada me la he dado por esa actualización que necesito, haga el dbgrid cuando cargo el form, y que la primera vez me lo hace, pero cuando vuelvo a cargar el form, ya no me lo hace.

 

Lo que he hecho es crear el form con .create(self) cuando lo necesito, (aunque ya lo haya hecho en fase diseño) , y así si actualiza siempre cuando entra, y lo destruyo en Onclose (action:=cafree;), pero claro el form se ha autocreado tambien mediante IDE. He intentado liberar el form autocreado con .free y crearlo a continuación con .create(self) pero me da error en ejecución cuando trabajo sobre él.

 

La opción que me indica ,es crear un procedimiento que actualice, pero claro si lo añado en el evento Oncreate estaríamos igual. Pasaria un vez y al visualizar el form nuevamente, ya no actualizaria. 


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.991 mensajes
  • LocationMadrid - España

Escrito 11 junio 2021 - 05:21

Unos consejos:

1. Estudia como se diseñar un formulario no autocreado. Son opciones en el IDE.

2. No destruyas o trates de usar un objeto ya destruido.

3. Mira el código que te puse. Resuelve tu problema.

 

Saludos 


  • 0

#5 dooper

dooper

    Advanced Member

  • Miembros
  • PipPipPip
  • 292 mensajes

Escrito 11 junio 2021 - 03:00

Mil gracias Escafandra.


  • 0