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 08-05-2007
Sadistyk Sadistyk is offline
Registrado
 
Registrado: may 2007
Posts: 5
Poder: 0
Sadistyk Va por buen camino
Problema de violación de acceso

Hola. Soy nuevo en delphi, así que tengan un poco de compasión. Teno dos formularios, el primero que es el menú principal, y el segundo que es para otra cosa. En el menú principal tengo un botón para ir al otro formulario. Eso anda bien. El problema está que cuando cierro el segundo formulario y vuelvo a entrar desde el menú principal el formulario quedó como estaba cuando lo cerré, o sea, que todos los componentes no volvieron a su estado original. El comando que uso para abrir el segundo formulario es el 'Show' y para cerrar el segundo es el 'Close'.
Estuve leyendo por ahí que esto se debe a que no se libera la memoria del formulario (o por lo menos eso fue lo que entendí) y que tenía que poner 'Free' o 'Release' en el evento 'OnClose' del formulario. Intenté con los dos y cuando quiero volver a entrar desde el menú me tira el error de violación de acceso. ¿Cómo puedo hacer para que esto ande?
Responder Con Cita
  #2  
Antiguo 08-05-2007
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
Hola, como dices, puede ser un problema de liberación del formulario, o de seguro lo quieres mostrar sin haberlo cargado, puedes poner la parte de tu código donde llamas al form2, y el codigo con que lo cierras?

Saludos
__________________
"La información tiene más valor cuando se comparte"
Responder Con Cita
  #3  
Antiguo 08-05-2007
Sadistyk Sadistyk is offline
Registrado
 
Registrado: may 2007
Posts: 5
Poder: 0
Sadistyk Va por buen camino
Sólo tengo dos lineas en el botón para llamar al 2do formulario:

form1.Enabled := false;
form2.Show;
Responder Con Cita
  #4  
Antiguo 08-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.108
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Deberías asegurarte, antes de ejecutar el método "Show" de "form2", de que el propio "form2" existe. Esto puedes hacerlo tal que así:

Código Delphi [-]
if not Assigned(form2) then
  form2 := TForm2.Create(Self);
form2.Show();

Empero, por lo que haces con "form1", creo que acaso te interesaría más usar el método "ShowModal" en lugar de "Show". Siendo así te sería más sencillo incluso hacerte cargo de la variable "form2", incluso no te sería necesario:

Código Delphi [-]
with TForm2.Create(Self) do
begin
  try
    ShowModal();
  finally
    Free;
  end;
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 08-05-2007
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Sadistyk
Estuve leyendo por ahí que esto se debe a que no se libera la memoria del formulario (o por lo menos eso fue lo que entendí) y que tenía que poner 'Free' o 'Release' en el evento 'OnClose' del formulario. Intenté con los dos y cuando quiero volver a entrar desde el menú me tira el error de violación de acceso. ¿Cómo puedo hacer para que esto ande?
Creo que lo que está pasaando es que no destruyes el formulario, sólo lo ocultas.
En el evento OnClose del segundo formulario utiliza:

Código Delphi [-]
  Action := caFree;

Si es lo que pienso, con eso debería bastar.
Para llamarlo:

Código Delphi [-]
  Form2.Show;

Y cuando quieras cerrarlo:

Código Delphi [-]
  Close;

La línea de arriba se encargará de la libreración.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 08-05-2007
Sadistyk Sadistyk is offline
Registrado
 
Registrado: may 2007
Posts: 5
Poder: 0
Sadistyk Va por buen camino
Probé lo que me dijo Dec y lo que me dijo Neftali y todavia me sigue tirando el error.
Responder Con Cita
  #7  
Antiguo 08-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.108
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Da todos los datos que puedas: copia aquí el mensaje del error tal como te aparece; copia también el código fuente que usas para llamar al formulario; si hay "algo" en el evento "OnClose" del formulario que muestras cópialo también aquí. Lo que no puedes pretender es que adivinemos qué puede estar pasando... así que cuanta más información proporciones más posibilidades tienes de que alguien pueda echarte una mano.

PD. De hecho ya hemos tratado de adivinar el problema: te hemos referido las formas que hay de mostrar un formulario; te hemos indicado que hay que comprobar si un formulario realmente existe antes de ejecutar cualquiera de sus métodos, etc., etc. Tal vez podrías tratar de reproducir el error en una aplicación nueva, de modo que puedas adjuntarla aquí para que alguien pueda echar un vistazo.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 08-05-2007 a las 19:17:41.
Responder Con Cita
  #8  
Antiguo 08-05-2007
Sadistyk Sadistyk is offline
Registrado
 
Registrado: may 2007
Posts: 5
Poder: 0
Sadistyk Va por buen camino
El formulario principal se llama 'Tprincipal' y el que me tira el error al abrir la segunda vez es 'Tpanttruco'.

El error que me tira es:
'Access violation at address 00000000. Read of address 00000000.'
Y el programa sigue andando después de que me sale el error. O sea, no habre el segundo formulario, se queda en el primero, pero sigue andando.

El código para llamar el segundo formulario:
procedure Tprincipal.jnuevoClick(Sender: TObject);
begin

panttruco.Show;
end;

El código para cerrar el segundo formulario:
procedure Tpanttruco.btnAbandonarClick(Sender: TObject);
begin
panttruco.Close;
end;

El evento 'OnClose' del segundo formulario:
procedure Tpanttruco.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Responder Con Cita
  #9  
Antiguo 09-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.108
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Prueba con esto.

Código Delphi [-]
procedure Tprincipal.jnuevoClick(Sender: TObject);
begin
  if not Assigned(panttruco) then
    panttruco := Tpanttruco.Create(Self);
  panttruco.Show;
end;
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 09-05-2007 a las 00:21:29.
Responder Con Cita
  #10  
Antiguo 09-05-2007
Sadistyk Sadistyk is offline
Registrado
 
Registrado: may 2007
Posts: 5
Poder: 0
Sadistyk Va por buen camino
No, no anda. Acabo de hacer una solución medio-medio: en el 'OnClose' del segundo formulario puse todo a mano como quiero que se vea la segunda vez que entro, y ya está. Ya me cansó.
Gracias a todos por todo.
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
Problema de acceso a pc desde windows 95 abracadabra Redes 4 08-07-2006 16:36:15
Error de acceso de violacion en IDPDX32 gaescoto Impresión 2 06-04-2006 12:21:05
Violacion De Acceso elguille Varios 2 17-10-2005 16:32:56
violacion de acceso al cerrar el informe, ¿porque? URBANO Impresión 5 24-06-2004 19:36:17


La franja horaria es GMT +2. Ahora son las 03:16:23.


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