unit ObjectRegister;
interface
uses Classes, IniFiles;
type
TNamedObject = class(TObject)
private
FName: string;
public
constructor Create(const Name: string); virtual;
destructor Destroy; override;
property Name: string read FName;
end;
TObjectRegister = class(TObject)
private
FItems: TList;
FNames: TStringHash;
public
constructor Create; virtual;
destructor Destroy; override;
function Add(const Name: string; const Instance: TObject): Integer;
function Find(const Name: string): TObject;
procedure Clear;
procedure Remove(const Instance: TObject);
end;
var
RegisterObject: TObjectRegister;
implementation
uses SysUtils;
function TObjectRegister.Add(const Name: string;
const Instance: TObject): Integer;
begin
Result:= FItems.Add(Instance);
FNames.Add(UpperCase(Name), Result);
end;
procedure TObjectRegister.Clear;
begin
FItems.Clear;
FNames.Clear;
end;
constructor TObjectRegister.Create;
begin
inherited Create;
FItems:= TList.Create;
FNames:= TStringHash.Create;
end;
destructor TObjectRegister.Destroy;
begin
Clear;
FreeAndNil(FItems);
FreeAndNil(FNames);
inherited;
end;
function TObjectRegister.Find(const Name: string): TObject;
var
LIndex: Integer;
begin
LIndex:= FNames.ValueOf(UpperCase(Name));
if LIndex <> -1 then
Result:= TObject(FItems[LIndex])
else
Result:= nil;
end;
procedure TObjectRegister.Remove(const Instance: TObject);
var
LIndex: Integer;
begin
LIndex:= FItems.IndexOf(Instance);
if LIndex <> -1 then
begin
FNames.Remove(UpperCase(TNamedObject(Instance).Name));
FItems.Delete(LIndex);
end;
end;
constructor TNamedObject.Create(const Name: string);
begin
inherited Create;
FName:= Name;
RegisterObject.Add(Name, Self);
end;
destructor TNamedObject.Destroy;
begin
RegisterObject.Remove(Self);
inherited;
end;
initialization
RegisterObject:= TObjectRegister.Create;
finalization
FreeAndNil(RegisterObject);
end.