Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-02-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Error al Crear Ventanas dinámicamente

Hola amigos:

Tengo un entorno MDI en Delphi 6 Empresarial, con errores de Acceso a Memoria, y puede que
la correccíon que he hecho sea peor que la enfermedad.

Todas la ventanas son Ventanas Hijas, creadas dinámicamente.
Creo una SubVentana dentro de otra, el esquema es mas o menos el siguiente:


Código:
-----------------
SubVentana : TSubVentana // hereda de Tform

procedure Tsubventana.FormClose(....)
begin
  Action := caFree;
end;
-----------------

type Form1 = Class(TForm)
...
private 
 Form1_Sub:TsubVentana; // para comunicarme con la SubVentana
end;

Implementation

procedure Tform1.ToolButton1Click(...);
begin
try
  ToolButton1.Enabled := false; 
  Form1_Sub := TSubVentana.Create(application);
  ...
  Form1_Sub.ShowModal;
finally
  Toolbutton1.Enabled:= true;
  Form1_Sub:=nil;
end;
end; // ToolbuttonClick
-----------------

type Form2 = Class(TForm)
...
private 
 Form2_Sub:TsubVentana; // para comunicarme con la SubVentana
end;

Implementation

procedure Tform2.ToolButton2Click(...);
begin
try
  ToolButton2.Enabled := false; 
  Form2_Sub := TSubVentana.Create(application);
  ...
  Form2_Sub.ShowModal;
finally
  Toolbutton1.Enabled:= true;
  Form2_Sub:=nil;  
end;
end; // ToolbuttonClick
¿Al hacer la asignación FormX_Sub:=nil; estoy dejando basura en la memoria o no?

La razón de poner esa línea, es que la primera vez que abro la subVentana desde Form1 y Form2 va bien,
pero una vez cerradas las subventanas, cuando las abro de nuevo, los Toolbutton no se Habilitan si queda
una instancia de TSbuVentana (parece como si se cruzaran los punteros de Form1_Sub y Form2_Sub). Ejemplo,

Abro las siguientes Ventanas:
Form1
Form1_Sub // el ToolButton se INhabilita
Form2
Form2_Sub // el ToolButton se INhabilita

Cierro las Ventanas:
Form1_Sub // el ToolButton se Habilita
Form2_Sub // el ToolButton se Habilita

Abro de nuevo:
Form1_Sub // el ToolButton se INhabilita
Form2_Sub // el ToolButton se INhabilita

**Hasta aqui todo correcto**
Cierro :
Form1_Sub // El ToolButton se queda INHABILITADO (grrrrrrr)
Form2_Sub // **** Se habilitan los 2 ToolButtons, el de Form1 y el de Form2 ¿?¿?¿ Por qué ?¿?¿?

He intentado explicarme lo mejor posible,si he dejado algo por comentar, no dudeis en preguntarme.

Muchisimas gracias de antemano.
Responder Con Cita
  #2  
Antiguo 17-02-2004
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
no se si fue error al copiar y pegar pero revisa el codigo del form2 en el finally
Código:
finally
  Toolbutton1.Enabled:= true; //No deberia ir Toolbutton2.Enabled := True?????
  Form2_Sub:=nil;  
end;
Y con respecto a Form2_Sub:=nil; utiliza mejor FreeandNil(Form2_Sub);

Otra cosa no es un entorno mdi el que trabajas es un entrono modal, el entorno mdi no debe bloquear el menu de las otras opciones al ingresar a una pantalla
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 17-02-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Gracias por responder.
Cita:
Empezado por eduarcol
no se si fue error al copiar y pegar pero revisa el codigo del form2 en el finally
Tienes toda la razon, Perdonad, eran errores al tiempo de postear el mensaje. he revisado el codigo y pone Toolbutton2.enabled:= True;

Cita:
Empezado por eduarcol
utiliza mejor FreeandNil(Form2_Sub);
La SubVentana tiene Action := cafree, por tanto cuando llega al finally no existe ya, y el FreeandNil me arroja un Access Violation. He hecho muchas pruebas, y sigo haciendolas, pero la verdad, eso del burro que toca la flauta no va conmigo; me gusta Saber lo que hago,aunque desde luego no es el caso

Cita:
Empezado por eduarcol
Otra cosa no es un entorno mdi el que trabajas es un entrono modal,
No me expliqué con mucha claridad, es un entorno MDI, ya que la ventana principal es un MDIForm. Form1 y Form2 son MDICHILD. La SubVentana si es Modal como bien dices.

He mirado el mensaje de Liberar Formularios en este mismo foro que más o menos explica la implementación de FreeAndNil,( lo que dice Delphi.com.ar ), pero no termino de comprender "mi error" o por lo menos, saber si lo que hago tiene errores. Todos sabemos que: "no obtener mensajes de error, no significa que algo esté bien".

Saludos, y gracias por interesarte, espero haber aclarado algo más el tema
Responder Con Cita
  #4  
Antiguo 17-02-2004
Amilius Amilius is offline
No confirmado
 
Registrado: ene 2004
Posts: 138
Poder: 0
Amilius Va por buen camino
Seguro que esta parte está bien??

.Create(application);

para Tform2.

"application" en la segunda ventana hija de la primera ventana hija, sería bueno que chequees la documentación de ayuda para ver cual es el parámetro indicado para ese constructor.

<<
Create creates and initializes a new TForm object or an object derived from TForm.

constructor Create(AOwner: TComponent); override;

Description

Use Create to create and initialize a new TForm object or an object derived from TForm. AOwner is the owner of the TForm object.

Create calls the CreateNew method, passing it AOwner, and then performs initialization tasks if the object is derived from TForm.

>>

AOwner no debería ser la ventana hija (para crear la ventana "nieta") en lugar de "application" << .Create(self); >> ?
Responder Con Cita
  #5  
Antiguo 17-02-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Por ahí no se me habia ocurrido investigar.... Gracias por el rayo de luz.
Responder Con Cita
  #6  
Antiguo 17-02-2004
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
de todas formas hay algo que no me cuadra aun, si las ventanas estan como modales porq deshabilitar los botones si la ventana modal no te deja acceso a ellos????
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #7  
Antiguo 18-02-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Lightbulb

Muy hábil Eduardo

como ya era bastante dificil intentar explicar cual era el fallo, he omitido muchos detalles, que yo creia sin importancia..... justo ahí era donde está el fallo.

La SubVentana tiene un Preview de QReports, en lugar de un ShowModal, hacia un Preview del QReports. (eso para ustedes lo cambia todo, yo pensaba que era igual que un showmodal )

Si mostraba varias Subventanas (desde distintas opciones del programa) el código se queda paralizado, pero despues no lo retoma en el mismo orden donde lo dejó, ya que el usuario puede, por ejemplo, cerrar la ventana donde "debía" de continuar la ejecución normal del prograrma, y eso era lo que provocaba los Access Violation.

Por otra parte, el AOwner de las ventanas tampoco estaban bien puestos.

Al final he optado por usar un PreviewModeless, (tampoco sabía que existía) así cada Form1 o Form2 continua su ejecución despues de lanzar la Subventana.

Muchisimas gracias por vuestro tiempo e interés.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 08:22:46.


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