Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Anidacion de Forms (https://www.clubdelphi.com/foros/showthread.php?t=86738)

Espartaco 24-09-2014 14:39:12

Anidacion de Forms
 
Hola amigos, tengo un problema que me trae de cabeza. Utilizo Delphi 5. La gestion de ventanas en mis programas es crear un form a modo main y despues en las opciones del menu creo el form para ejecutar las opciones que sean, este form es fsnormal y lo muestro con showmodal y luego lo destruyo con free.


Código Delphi [-]
 
procedure TMenuPrincipal.Clientes1Click(Sender: TObject);
var ficha:TElecClientes;
begin
Ficha:=TElecClientes.Create(Self);
Ficha.DbClientes.Active:=True;
Ficha.Showmodal;
Ficha.DbClientes.Active:=False;
Ficha.Free;
end;



Hasta aqui todo bien, si necesito otro form desde este activo lo creo de la misma forma y bien, pero si desde el segundo intento crear un tercero se me cuelga.

No se que puede estar pasando.

Desde ya muchas gracias.

gatosoft 24-09-2014 16:09:00

Pues en principio veo tu código bien, No se si me escapa algún detalle, lo digo por que no eres muy específico en el "colgar"

Considero que deberías intentar una prueba simple, abriendo los formularios como lo indicas, pero sin activar la BD

Código Delphi [-]
procedure TMenuPrincipal.Clientes1Click(Sender: TObject);
var ficha:TElecClientes;
begin
Ficha:=TElecClientes.Create(Self);
//Ficha.DbClientes.Active:=True;
Ficha.Showmodal;
//Ficha.DbClientes.Active:=False;
Ficha.Free;
end;

De esta manera podría detectar si el problema está al activar tu BD, que al cargarse puede estar realizando alguna operación o consumiendo recursos...

También podría suceder que en el mismo oncreate o en el onshow esté realizando operaciones con recursos compartidos con los formularios gemelos...

Bueno, no se que mas decirte...

Por ultimo, te recomendaría (sugerencia personal) que revisaras la activación de la BD en el OnCreate del propio formulario...

Otra sugerencia sería que destruyeras el formulario en el evento OnClose, algo asi:

Código Delphi [-]
Procedure TForm1.OnClose(Var Action...)
BEgin
  Action:= caFree
end;

Con ésto aseguras que cada vez que cierre el formulario se libera la memoria...

saludo,

Espartaco 24-09-2014 18:38:52

gracias gatosoft por tu rapida respuesta, decirte que tras varias comprobaciones he comprobado que el 'cuelgue' se realiza tras ejecutar la linea que crea el form, no da lugar ni a abrir la tabla, es mas he hecho lo que me dices y igual. Cuando digo cuelgue me refiero a que la aplicacion no responde a nada teniendo que usar el administrador de tareas para pararla. Emiezo a pensar que es que Delphi 5 no permite anidar mas de dos form, porque no encuentro otra explicacion la verdad. Estoy desesperado, tengo que entregar la aplicacion y me ha surgido esto. Espero que le haya pasado a alguien y lo haya solucionado.

Muchas gracias.

Casimiro Noteví 24-09-2014 19:40:04

Si llamas al 3º form desde el 2º form, y destruyes el 2º form cuando llamas al 3º form... me parece que... tenemos un problema ;)

Espartaco 24-09-2014 20:05:05

No claro, la llamada al tercer form desde el segundo se hace antes de destruirlo. El proceso es ejecuto el primero, en un proceso de este se llama al segundo y en un proceso de este se llama al tercero, cuando se cierre el tercero se destruye, y cuando se cierre el segundo se destruye. El caso es que cuando son solo dos no hay ningun problema, solo me ha surgido al llamar al tercero y es lo que no entiendo.

Gracias por vuestra ayuda e interes.

Casimiro Noteví 24-09-2014 20:13:57

Creo que no entiendo cómo lo haces. ¿Puedes poner el código?

Espartaco 24-09-2014 20:29:43

Por supuesto.

Este es el codigo que llama al 1º form desde el menu principal:

Código Delphi [-]
procedure TMenuPrincipal.ModificarHojadeCarga1Click(Sender: TObject);
var ficha:TModificarCarga;
begin
     Ficha:=TModificarCarga.Create(Self);
     Ficha.DbCargas.Active:=True;
     Ficha.DbDCargas.Active:=True;
     Ficha.Showmodal;
     Ficha.DbCargas.Active:=False;
     Ficha.DbDCargas.Active:=False;
     Ficha.Free;
end;

Dentro del form TModificarCarga llamo al 2º cuando pulsamos el boton modificar carga:

Código Delphi [-]
procedure TModificarCarga.BitBtn4Click(Sender: TObject);
var ficha: TModificarAlbaranCarga;
begin
    Ficha:=TModificarAlbaranCarga.Create(Self);
  Ficha.DbMarcas.Active:=True;
  Ficha.DbClientes.Active:=True;
  Ficha.DbCargas.Active:=True;
  Ficha.DbConfCarg.Active:=True;
  Ficha.DbApoyo1.Active:=True;
  Ficha.DbApoyo1.Append;
  Ficha.DbSemanas.Active:=True;
  Ficha.DbGastos.Active:=True;
  Ficha.DbUltimaLecturaClientes.Active:=True;
  Ficha.DbDCargas.Active:=True;
  Ficha.Showmodal;
  Ficha.DbMarcas.Active:=False;
  Ficha.DbClientes.Active:=False;
  Ficha.DbCargas.Active:=False;
  Ficha.DbConfCarg.Active:=False;
  Ficha.DbApoyo1.Active:=False;
  Ficha.DbSemanas.Active:=False;
  Ficha.DbGastos.Active:=False;
  Ficha.DbUltimaLecturaClientes.Active:=False;
  Ficha.DbDCargas.Active:=False;
  Ficha.Free;
  DbGrid1.SetFocus;
end;

Dentro del form TModificarAlbaranCArga llamo al 3º form cuando pulso el boton añadir marcar:

Código Delphi [-]
procedure TModificarAlbaranCarga.BitBtn2Click(Sender: TObject);
var InputStr: string;
    Activado: Boolean;
    Existe: Boolean;
    I: Integer;
    ficha: TElecMarca;
begin
Activado:=False;
Existe:=False;
I:=0;
  InputStr:='';
  MarcaElegida:='';
  Ficha:=TElecMarca.Create(Self); // al ejecutar esta linea es cuando se cuelga
  Ficha.DbMarcas.Active:=True;
  Ficha.Showmodal;
  Ficha.DbMarcas.Active:=False;
  Ficha.Free;
  InputStr:=MarcaElegida;
  if InputStr<>'' then
  begin ........

Al ejecutar la linea para crear el 3º form es cuando se cuelga.
Espero que te lo haya aclarado es muy importante para mi resolverlo lo antes posible. Gracias.

ecfisa 24-09-2014 21:18:53

Hola Espartaco.

Lo único que podría estar provocando el error, pero desconozco su locación, es la línea:
Código Delphi [-]
...
  Ficha.Free;
  DbGrid1.SetFocus; // <--- ¿ Donde reside DbGrid1 ?
end;

Saludos :)

Espartaco 24-09-2014 21:32:01

Hola ecfisa, el dbgrid1 pertenece a la 1º form y esa linea no se ejecuta hasta que no se cierra el 2º form. Por tanto el error no se genera ahi. De hecho el 3º form no llega a crearse, el cuelgue es precisamente en la creacion.

Gracias.

ecfisa 24-09-2014 21:36:29

Hola Espartaco.

¿ Y escribiste algún código en el evento OnCreate de TElecMarca ?

Saludos :)

Espartaco 25-09-2014 00:47:03

No ecfisa de hecho ese form lo utilizo tambien desde otro form y no me da problemas porque es el 2º en la secuencia de apertura de forms. Pero cuando es el 3º entonces caput.

De hecho lo uso en TCrearAlbaranCarga y va sin problemas.

No se tu has probado a abrir un form desde otro y luego un tercero? a ver si te da el mismo problema? Porque yo no lo entiendo.

Casimiro Noteví 25-09-2014 00:55:53

Entonces en el 3º form no tienes ningún código, está vacio.

ecfisa 25-09-2014 01:48:16

Hola Espartaco.
Cita:

Empezado por Espartaco (Mensaje 482033)
...
No se tu has probado a abrir un form desde otro y luego un tercero? a ver si te da el mismo problema? Porque yo no lo entiendo.

Si, innumerables veces.

Acabo de generar el código de los cuatro formularios en juego (usando tu codigo de creación y liberación) y funciona correctamente en Delphi 7.

Te adjunto la prueba por si te sirve de ayuda.


Saludos :)

Edito: Quité el adjunto por estar sin visitas.

gatosoft 25-09-2014 05:44:04

Hola Espartaco... primero, considero que no deberias hablar de anidar formularios, pues no creo que este concepto aplique en lo que estas haciendo... de hecho, no se si ese concepto exista realmente

tu sencillamente estas creando formularios, uno tras otro con cada click de boton, como dice eficsa no deberia haber problema...

Como dije inicialmente, no veo problema en tu lógica... el tema debe estar en el evento OnCreate/Onshow del tercer formulario (TElecMarca)... busca aislarlo (abrirlo antes que los demás), busca abrirlo en un segundo lugar, en ligar de un tercero... si pasa todo bien .... quiere decir que entre tanta apertura de tablas puede estar sucediendo algo que bloque un proceso... me refiero a que con Bases de datos como Paradox, por ejemplo, se pueden generar bloqueos al intentar hacer varias operaciones sobre la misma tabla... ¿Que base de datos utilizas?, ¿Manejas algún evento al abrir tus tablas?, ¿que componentes de conexión utilizas?

el mensaje es que definitivamente debe haber algo que se genera en un EVENTO... y no podemos ayudarte mucho pues estamos ciegos porque no tenemos el contexto de tu aplicación

intenta poner un breakpoint en la linea que genera el error... cuando llegues ahí, avanza paso a paso con F7 y revisa por donde se va tu codigo al llegar a esa linea...

engranaje 25-09-2014 12:06:58

Por aportar algo... ¿estas seguro de que se te cuelga? No puede estar pasando que al último form que creas se te muestra por detras de los que estas viendo y que al mostrarlo como modal no puedas pulsar en ningún otro? Has probado ir al administrador de tareas y pulsar con el boton derecho sobre la aplicación diciendole que lo traiga al frente?, otra forma es cambialre la posición al form en el onshow para que se te ponga en una esquina.

Espartaco 25-09-2014 12:36:07

Ole, Ole, engranaje has dado en el clavo, el form estaba detras del que lo llamaba, pero no se como se ha podido cambiar la propiedad FormStyle de StayonTop a Normal ya que siempre la uso y en la otra parte del programa estaba bien.

Tienes razon gatosoft le mal llamo forms anidados cuando no lo son, sorry.

Bueno solucionado, muchas gracias a todos por vuestra ayuda e interes, con un foro como este se siente uno muy acompañado.

Saludos desde Sevilla.


La franja horaria es GMT +2. Ahora son las 10:15:40.

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