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 public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;
implementation
var Instancia: TSingleton;
class function TSingleton.NewInstance: TObject;
begin
if (NOT Assigned(Instancia))
then begin
Instancia := TSingleton (inherited NewInstance);
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,
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,