Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Formulario Auxiliar (https://www.clubdelphi.com/foros/showthread.php?t=20756)

jzk 25-04-2005 11:18:44

Formulario Auxiliar
 
Hola a tod@s,

Veamos, tengo el siguiente problemilla.

Quiero crear un formulario auxiliar cuando pulso un determinado botón en mi aplicación. Lo hago de la siguiente manera:

Código:

                Try
                        Application.CreateForm(TForm3histor,Faux);
                        Faux.ShowModal;
                Finally
                        Faux.Free;
                End;

El funcionamiento es correcto hasta que ejecuto varias ocasiones este formulario, entonces me aparece un error de memoria tal que así:
Cita:

Violacion de acceso a la dirección 0000000666. Leer de dirección 0000000666
En otras ocasiones al primer intento obtengo este mismo error y tengo que cerrar la aplicación.

He seguido paso a paso el proceso y el error se produce cuando va a ejecutar la linea Faux.Showmodal, porque en el paso anterior que es donde crea el formulario con sus tablas y demás no existe/generá ningún error.

¿Se os ocurre algo?

Neftali [Germán.Estévez] 25-04-2005 11:37:13

¿Tienes definido código en los eventos Create o Show del formulario auxiliar?
Si lo tienes ¿Qué codigo tienes colocado?

En principio el trozo de código que colocas es correcto, así sólo con eso no debería fallar.

¿Tienes algun componente no estandard en ese formulario? (que te pueda provocar ese error). Prueba a eliminar código y componentes a ver si te sigue dando.

jzk 25-04-2005 12:15:42

Voy a hacer las comprobaciones que me indicas y luego te cuento, porque tengo lineas de código en el Create del formulario lo que ocurre es que como realiza todos los pasos que hay en ese evento correctamente creía que el problemas derivaba del Showmodal que es donde me mete el petardazo.

jzk 25-04-2005 17:52:37

He comentado todas las lineas de programación incluidas en los eventos;

OnCreate, OnClose y OnCloseQuery

Y sin embargo el problemas persiste y no utilizo ningún objeto que no sea standard.

¿se os ocurre algo?, gracias.

Lepe 25-04-2005 18:47:17

Código:

                Try
                        Application.CreateForm(TForm3histor,Faux);
                        Faux.ShowModal;
                Finally
                        Faux.Free;
                        Faux := nil;
                End;

Yo intentaría esto.

Si te da error, entonces probaría esto otro:
Código:

        Faux := TForm3historic.Create(nil);
                Try
                        Faux.ShowModal;
                Finally
                        Faux.Free;
                        Faux := nil;
                End;

Si te furula bien alguna de las formas, ya explicaré la diferencia :D

Un saludo

jzk 25-04-2005 19:03:44

No me ha funcionado pero te agradecería que me explicases el por qué, ah y darte las gracias.

roman 25-04-2005 19:09:45

¿Quién es FAux? Es decir, ¿dónde está declarado?

No sé a qué diferencia se refiere Lepe ya que hay dos diferencias. La sustancial, desde mi punto de vista, es sacar la creación del formulario del bloque try-except. Si hubiera alguna excepción al momento de crear el formulario, se estaría intentando liberar un objeto que nunca terminó de construirse totalmente.

// Saludos

jzk 26-04-2005 08:31:03

Faux, es una variable declarada de la siguiente manera:

Código:

procedure Programa1.SpeedButton1Click(Sender: TObject);
var Faux: TForm3histor;
begin
  Try
      Application.CreateForm(TForm3histor,Faux);
      Faux.ShowModal;
  Finally
      Faux.Free;
  End;End


Lepe 26-04-2005 11:48:06

La explicación ya la dió roman, además como no sabía donde estaba declarada la variable Faux, lo que hago es asignarle nil despues de liberarla.

jzk
creo que hay "algo más" que no nos cuentas, quizás porque has creido que no tiene importancia. La verdad, todos los códigos propuestos funcionan a la perfección.

La ventana es de tipo mdiChild?

Hay más código en el SpeedButton ??

Dentro de la ventana Faux, llamas a algún evento, propiedad o método de la ventana Programa 1 ??

Un saludo

jzk 26-04-2005 16:51:15

Pués en realidad estoy quedando como una competa ignorante en Delphi, porque es algo que no he tenido en cuenta por desconocimiento/ignorancia.

Los tenía ambos definidos como FsNormal.

Estoy mirando en los foros la manera de utilizar estos formularios y veo que tengo que definir el principal como FsMDIForm y los auxiliares como FsMDIChild.

Si estoy dando los pasos correctos, lo siguiente sería modificar la llamada del formulario y lo hago como hasta ahora con:

Código:

Faux.Showmodal
Pero de esta manera me dice:
Cita:

no se puede hacer visible una ventana modal.
Con lo cual, hago la llamada al formulario con el comando:

Código:

Faux.Show
Y de esta manera el programa no muestra ningún formulario.

Podéis indicarme si estoy dando los pasos correctos, gracias.....

roman 26-04-2005 17:09:49

No, no, no. No confundamos las cosas.

Esto no tiene que ver, al menos por lo que se ve a primera vista, con que los formularios sean o no MDI. No hay ninguna obligatoriedad en definir el formulario principal com MDIForm y los secundarios como MDIChild. De hecho, difícilmente un formulario MDIChild se usará para mostrarlo con ShowModal.

Vuelve tus pasos atrás y olvídate de MDI.

El punto es: nada en el código que nos pones parece estar mal y debe funcionar tal cual. Si aún así no funciona es un indicativo de que hay más código que, como dice Lepe, posiblemente pienses que no afecta pero que es el que causa el problema.

Un error de "Access Violation" muchas veces se refiere o bien a que intentas usar un objeto que aún no ha sido construido o que intentas acceder a un índice de un arreglo más allá de sus límites.

¿Has revisado el evento OnShow?

¿Qué más haces al momento de construir el formulario?

// Saludos

jzk 26-04-2005 17:56:13

Disculpen mi insistencia, pero es que me resulta necesario acabar con este problema.

Siguiendo con el hilo de Roman (donde me reconducía por el buen camino), he optado por hacer un nuevo formulario donde solamente he incluido un label que me de la bienvenida.

Pués después de hacer varias llamadas, me vuelve a generar el mismo error de memoria.

Cabe decir que he seguido las mismas instrucciones que abajo, a la hora de crear y eliminar el formulario.

Todo esto me lleva a pensar, ¿es posible que el error lo cometa en el formulario principal donde llamo al auxiliar o eso es poco probable?

roman 26-04-2005 18:47:28

Puse sí sería probable que estés arrastrando un error desde otra parte. Prueba desde lo básico, inicia un nuevo proyecto con un formulario principal y uno secundario. Pon un SpeedButton en el principal y coloca el código para abrir el nuevo tal como lo tienes en tu última prueba.

Si esto funciona tendrás que comenzar a aislar el problema viendo qué tipo de cosas haces antes de abrir el formulario.

// Saludos


La franja horaria es GMT +2. Ahora son las 18:50:31.

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