Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   ¿Cómo saber si un objeto está ya creado? (https://www.clubdelphi.com/foros/showthread.php?t=63434)

noob 13-02-2009 15:33:39

¿Cómo saber si un objeto está ya creado?
 
Hola, tengo una clase con un método que me sirve para inicializarla, la clase tiene como atributos otros objetos:

Código Delphi [-]
procedure MiClase.Inicializar;
begin
  Self.Atributo1 := cFoo.Create;
  Self.Atributo2 := cBar.Create;
end;

y aunque funciona siempre me gustaría hacer algo así;

Código Delphi [-]
procedure MiClase.Inicializar;
begin
  if Atributo1 ESTA CREADO then
    begin
      Self.Atributo1 := cFoo.Destroy; // o Atributo1 := cFoo.Free;
      Self.Atributo1 := cFoo.Create;
    end
  else
    Self.Atributo1 := cFoo.Create;    
  if Atributo2 ESTA CREADO then
    begin
      Self.Atributo2 := cBar.Destroy; // o Atributo2 := cFoo.Free;
      Self.Atributo2 := cBar.Create;
    end
  else
    Self.Atributo2 := cBar.Create;
end;

¿Cómo puedo saber si un objeto está ya creado? ¿Basta con hacer lo siguiente?

Código Delphi [-]
if Objeto <> nil then
  ShowMessage('El objeto está creado');

Saludos.

Luis F. Orjuela 13-02-2009 15:44:57

Diría que con todos los objetos es los mismo, por ejemplo la clase TForm, que en este pequeño ejemplo seria FFacturar, si no está creado, pues lo crea y ya

if not Assigned(FFacturar) then
FFacturar:=TFFacturar.Create(Self);


Espero te sirva

Un caluroso saludo desde BOGOTA - COLOMBIA

Neftali [Germán.Estévez] 13-02-2009 15:47:46

Puedes utilizar Assigned (aunque me temo que al final va a ser lo mismo).

Código Delphi [-]
  if Assigned(miObjeto) then

Y para liberar y asegurarte:

Código Delphi [-]
  FreeAndNil(miObjeto);

noob 13-02-2009 15:50:43

Cita:

Empezado por Neftali (Mensaje 338048)
Puedes utilizar Assigned (aunque me temo que al final va a ser lo mismo).

Código Delphi [-] if Assigned(miObjeto) then


Y para liberar y asegurarte:

Código Delphi [-] FreeAndNil(miObjeto);

¿Para liberar he de hacer FreeAndNil(miObjeto); en vez de Objeto.Destroy; o Objeto.Free? ¿No es lo mismo?

Neftali [Germán.Estévez] 13-02-2009 16:08:00

Bueno, si. El FreeAndNil, hace las dos cosas. Libera y apunta a nil.
Así te aseguras de que si porteriormente preguntas if Assigned() funcionará 100% :D:D:D

duilioisola 13-02-2009 16:10:04

Si creas un objeto y luego lo liberas, el puntero seguirá teniendo el valor que tenía.
Por lo tanto, cuando lo liberas, además deberías ponerlo a nil.

Self.Atributo1 := cFoo.Create; // Self.Atributo=0192893
--- Self.Atributo1 := cFoo.Free; // Self.Atributo=0192893
--- FreeAndNil(Self.Atributo1); // Self.Atributo=nil

noob 14-02-2009 14:11:56

Gracias, a partir de ahora utilizaré FreeAndNil en vez de llamar al método Free.

Saludos.


La franja horaria es GMT +2. Ahora son las 17:55:59.

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