Ver Mensaje Individual
  #8  
Antiguo 30-12-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Formalmente lo que buscas es un Singleton. Y la forma en llevarlo a cabo es redefiniendo el método de clase NewInstance y el método FreeInstance.

Luego, debes tener una variable que se puede o no, mantener "oculta" que sea del tipo de la clase definida. ¿Para qué? Para que la implementación de NewInstance pueda chequear si existe una instancia de dicha clase, si existe se devuelve dicha instancia, en otro caso se crea.
FreeInstance liberará la instancia.

Más o menos la idea es algo como esto:
Código Delphi [-]
type
TSingleton = class //nuestra clase que será global
  public
    class function NewInstance: TObject; override;
    procedure FreeInstance; override;
end;

implementation

var Instancia: TSingleton; //Nota como esta variable se mantiene "oculta"

class function TSingleton.NewInstance: TObject;
begin
  if (NOT Assigned(Instancia))
     then begin
            Instancia := TSingleton (inherited NewInstance);
            // algo más que deba hacer....
          end;
  result := Instancia;
end;

procedure TSingleton.FreeInstance;
begin
  Instancia := nil;
  inherithed FreeInstance;
end;

Ahora si deseas puedes hacer que se cree y se libere dicha instancia en sus secciones Initialization y Finalization.

Luego puedes tener cuantas variables donde necesites, cuando hagas algo como:

Código Delphi [-]
Variable := TSingleton.Create;

Variable apuntará a "Instancia". Luego si haces,
Código Delphi [-]
Variable.Free;

Liberas al objeto global, es decir a "Instancia".

Se puede modificar un poco el código para no liberar de una, y llevar un contador de las veces que se referencie: NewInstance incrementa el contador, mientras que FreeInstance lo decrementa.

Nomás te cuento esto como alternativa. Hay muchas maneras de implementar un singleton.

La forma que comentó Al es una de ellas. Pero funcionará siempre y cuando usemos la variable que se declara en Interface. Si uno tiene otra variable de la misma clase, puede correr el riesgo de crearla y liberarla, por tanto habrá dos instancias y se rompe el esquema de la variable global (y única).
Ojo, que con el esquema que menciona Al, no hay que liberarla nunca sino dejar que el sistema al finalizar solito se encargue de ello.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita