Club Delphi  
    Paypal   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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Arrow

Yo tambien uso el modelo de ecfisa, pero cabe destacar que tambien se puede hacerlo todo en el mismo evento OnClose de la forma siguiente:
Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;{todos sabemos que aquí se manda a destruir el formulario
 con el procedimiento Release que  su vez hace uso de la API PostMessage 
que lógicamente liberará al formulario cuando se pueda y no de inmediato
 es por eso que liberar un formulario con el método Release es más flexible, para un mejor comprension ruego buscar "release" en la ayuda de Delphi}
Form2:=nil;
end;

EDITO: Viendo éste asunto me pregunto sino sería util un método ReleaseAndNil??
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #2  
Antiguo 06-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
EDITO: Viendo éste asunto me pregunto sino sería util un método ReleaseAndNil??
Pues no. Porque en realidad, esto:

Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Form2:=nil;
end;

es una mala práctica. Una clase no debería hacer referencia a una instancia en particular. Yo sé que esto es muy común pero no debería hacerse de esta manera.

De entrada, no debería usarse la variable Form2 que el IDE crea en automático por la simple razón de que no es bueno usar variables globales. Si el formulario principal requiere una instancia de Form2 y necesita tenerla reservada, entonces se declara una variable de tipo TForm2 (o, mejor, de tipo TForm) como campo privado.

// Saludos
Responder Con Cita
  #3  
Antiguo 06-04-2011
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Hola

Cita:
Empezado por roman Ver Mensaje
De entrada, no debería usarse la variable Form2 que el IDE crea en automático por la simple razón de que no es bueno usar variables globales. Si el formulario principal requiere una instancia de Form2 y necesita tenerla reservada, entonces se declara una variable de tipo TForm2 (o, mejor, de tipo TForm) como campo privado.

// Saludos
Esto es lo que intenté decir en mi mensaje (ver página anterior), pero roman lo explicó mejor


Saludos...
__________________
Lee la Guía de Estilo antes que cualquier cosa. - Twitter
Responder Con Cita
  #4  
Antiguo 06-04-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.015
Poder: 22
oscarac Va por buen camino
quiza no leyeron un mensaje anterior donde preguntaba cual es la diferencia entre

Código Delphi [-]
 
 
Tform1.Create(nil)
 
Tform1.Create(Self)
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 06-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por oscarac Ver Mensaje
quiza no leyeron un mensaje anterior donde preguntaba cual es la diferencia entre

Código Delphi [-]
 
 
Tform1.Create(nil)
 
Tform1.Create(Self)
Cierto. Ahora te contesto:

Pregunta nueva, hilo nuevo.

// Saludos
Responder Con Cita
  #6  
Antiguo 06-04-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Question

Cita:
Empezado por roman Ver Mensaje
Pues no. Porque en realidad, esto:

Código Delphi [-]
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
Form2:=nil;
end;

es una mala práctica. Una clase no debería hacer referencia a una instancia en particular. Yo sé que esto es muy común pero no debería hacerse de esta manera.

De entrada, no debería usarse la variable Form2 que el IDE crea en automático por la simple razón de que no es bueno usar variables globales. Si el formulario principal requiere una instancia de Form2 y necesita tenerla reservada, entonces se declara una variable de tipo TForm2 (o, mejor, de tipo TForm) como campo privado.

// Saludos
Estoy de acuerdo con lo que dices supongo que te estás refiriendo a que el código quede más limpio, es decir, no hacer que en mi clase haga refencias aun objeto en cuestion, pero la cuestion es que: dime ¿Cómo harias para que al momento de destruir mi formulario con Action:=caFree, hagas que dicho formulario apunte a nulo (nil)?
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #7  
Antiguo 06-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
¿Cómo harias para que al momento de destruir mi formulario con Action:=caFree, hagas que dicho formulario apunte a nulo (nil)?
Por ejemplo...

// Saludos
Responder Con Cita
  #8  
Antiguo 07-04-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por roman Ver Mensaje
Por ejemplo...

// Saludos
Pues creo no me he explicado bien..... bueno el ejemplo que pones en ese hilo hace uso de los métodos FreeNotification y Notification que son válido si se quiere hacer de cualquier forma,yo diría que es otra forma de hacer lo mismo que hice en el post 26,claro de una forma un poco más elegante , si te dás cuenta igualmente estás haciendo uso de un variable privada, fuera de la clase a la que pertenece tu variable "ChildForm" es decir mi pregunta era que dentro de la clase "TChildForm"(siguiendo tu ejemplo) sin salir fuera de ella y sin hacer uso de una variable, llamese ésta global o privada puedas lograr que cualquier objeto instanciado que pertenesca a la clase "TChildForm" al momento de destruirse se ponga nulo (nil). Es decir, el formulario donde se está creando (instaciando) objeto de la clase "TChildForm" no tiene por que hacer el trabajo de poner a dichos objetos en nulo, cada objeto al momento de destruirse ya, él por si mismo debería ponerse en nulo. ¿me entiendes?, es por eso que pensé que sería bueno contar con un método ReleaseAndNil, a lo cual te opusiste.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 07-04-2011 a las 15:27:31.
Responder Con Cita
  #9  
Antiguo 07-04-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
cada objeto al momento de destruirse ya, él por si mismo debería ponerse en nulo. ¿me entiendes?
Te entiendo, pero no estoy de acuerdo por dos razones:

1. Quien se pone nulo no es el objeto sino una referencia al objeto. Diferencia sutil pero importante. Puedes tener múltiples referencias a un mismo objeto, así que, ¿cuál de ellas es la que se pondría en nulo al momento de destruir el objeto? Eso es algo que puede decidir quien creó al objeto, mas no el objeto en sí.

2. Como no sea una suerte de patrón singleton, por lo general puedes tener varias instancias de una misma clase. Aún en el caso de formularios que en un determinado contexto quieres abrir una sola vez. Entonces, ¿a cuál de estas instancias se debe referir el destructor de la clase?

Por otra parte,

Cita:
Empezado por rgstuamigo
yo diría que es otra forma de hacer lo mismo que hice en el post 26,claro de una forma un poco más elegante , si te dás cuenta igualmente estás haciendo uso de un variable privada, fuera de la clase
no es que sea más elegante, sino que es fundamentalmente distinta. Mi variable privada se anula fuera de la clase y lo hace quien creo la instancia.


Yo diría, en una especie de resumen, que las referencias a un objeto son entidades ajenas a la clase del objeto (y al objeto mismo).

// Saludos
Responder Con Cita
  #10  
Antiguo 07-04-2011
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 20
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por roman Ver Mensaje
Te entiendo, pero no estoy de acuerdo por dos razones:

1. Quien se pone nulo no es el objeto sino una referencia al objeto.
...
2. Como no sea una suerte de patrón singleton, por lo general puedes tener varias instancias de una misma clase.
Bueno eso ya sabemos amigo roman y eso no está en discucion... no mezclemos las cosas

Cita:
Empezado por roman Ver Mensaje
Por otra parte,

...
no es que sea más elegante, sino que es fundamentalmente distinta. Mi variable privada se anula fuera de la clase y lo hace quien creo la instancia.


Yo diría, en una especie de resumen, que las referencias a un objeto son entidades ajenas a la clase del objeto (y al objeto mismo).
Haber... tú mismo criticaste el hecho de que se usara la variable global que genera Delphi a crear un formualrio, pero si analizamos tu solucion pues basicamente hace lo mismo, claro ahora ya no es una variable Global sino privada, pero de igual manera se la está usando practicamente para hacer lo mismo, pero mejor me explico con un ejemplo siguiendo tu propia solución:
Si por ejemplo instanciaramos un objeto de la clase "TChildForm" de la siguiente forma:
Código Delphi [-]
if otroForm = nil then// OtroForm es otra instacia diferente de ChildForm
 begin
   otroForm := TChildForm.Create(Self);
   otroForm.FreeNotification(Self);
 end;
otroForm.Show;
Para que tu solucion funcione tambien con "OtroForm" deberiamos modifcar el método Notification de la siguiente forma:
Código Delphi [-]
procedure TParentForm.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;

  if (AComponent = ChildForm) and (Operation := opRemove) then
    ChildForm := nil;
//lineas aumentadas
 if (AComponent = OtroForm) and (Operation := opRemove) then
    OtroForm := nil;
{ohora te podas imaginar que ocurre si seguimos creando mas instancias con diferentes referencias..  }
end;
Eso quiere decir que por cada nueva referencia tengo que aumentar código al método Notification..y eso no es ideal amigo seamos realista.
En otras palabras estamos restringidos a crear un objeto solo atraves de la variable "ChildForm", si quisieramos que la cosa siga funcionando y evitar agregar más código; y..pues es practicamente lo mismo que hacer uso de la varible global que gerera delphi, asi que por ese lado no hay diferencia.
Bueno... para no hacerla muy larga la cuestion...pues voy a volver a hacer la pregunta:
¿Es posible implementar una solucion que esté dentro de la misma clase sin utilizar alguna variable en sí? es decir al momento de Destruir(Action:=caFree el Objeto hacer que la referencia del objeto sea nula(nil)?? ¿será posible eso?
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Forms: FreeAndNil ó Release y la validación Assigned? jbautista Varios 13 09-02-2010 17:33:03
Assigned y Free gluglu Varios 4 14-05-2007 21:03:37
Problemas FreeAndNil OscarG OOP 4 09-11-2005 12:48:46
Free Pascal 2.0 marcoszorrilla Noticias 6 19-05-2005 12:04:51
Componente free... Mauro® Varios 10 12-06-2004 13:15:24


La franja horaria es GMT +2. Ahora son las 00:02:37.


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
Copyright 1996-2007 Club Delphi