Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 24-09-2014
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
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,
Responder Con Cita
  #3  
Antiguo 24-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 24-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #5  
Antiguo 24-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 24-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que no entiendo cómo lo haces. ¿Puedes poner el código?
Responder Con Cita
  #7  
Antiguo 24-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 24-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 24-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 24-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Espartaco.

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

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 25-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.
Responder Con Cita
  #12  
Antiguo 25-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Entonces en el 3º form no tienes ningún código, está vacio.
Responder Con Cita
  #13  
Antiguo 25-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Espartaco.
Cita:
Empezado por Espartaco Ver Mensaje
...
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 25-09-2014 a las 15:06:49.
Responder Con Cita
  #14  
Antiguo 25-09-2014
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
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...
Responder Con Cita
  #15  
Antiguo 25-09-2014
engranaje engranaje is offline
Miembro
 
Registrado: may 2011
Posts: 163
Poder: 13
engranaje Va por buen camino
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.
Responder Con Cita
  #16  
Antiguo 25-09-2014
Avatar de Espartaco
[Espartaco] Espartaco is offline
Miembro Premium
 
Registrado: oct 2005
Posts: 107
Poder: 19
Espartaco Va por buen camino
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.

Última edición por Espartaco fecha: 25-09-2014 a las 12:46:36.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda en anidación de transacciones crcmartell Conexión con bases de datos 1 04-01-2008 08:05:11
Cursores y anidación de procedimientos almacenados david.rguez SQL 1 02-08-2007 17:06:31
MDI Forms karocs Varios 8 12-07-2007 16:38:03
dll con forms Rafa Varios 10 15-02-2005 20:43:11
Forms.....por fa buitrago Varios 1 19-11-2003 22:42:52


La franja horaria es GMT +2. Ahora son las 14:21:52.


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