![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать глобальный компонент? Т.е. находящийся в одном экземп
atruhin © (2006-10-08 07:00:00)Корявая тема получилась :), но есть объект, он должен быть создан в одном экземпляре. Т.к. он нужен в DesignTime, пришлось оформлять компонентом.
Задача компонент можно создавать на каждой форме, но ссылку он должен обеспечивать к одному экземпляру объекта.
Сейчас сделал так:
создал для него компонент обертку, и в ней:
var
GlobalDB : TDBAPI = nil;
CGlobalDB : integer = 0;
constructor TooMainAPI.Create(AOwner: TComponent);
begin
inherited;
if CGlobalDB = 0
then GlobalDB := TDBAPI.Create(self);
inc(CGlobalDB);
FDB := GlobalDB;
end;
destructor TooMainAPI.Destroy;
begin
dec(CGlobalDB);
if CGlobalDB = 0
then GlobalDB.Free;
inherited;
end;
Все работает, но правильный ли это подход? Может можно сделать красивее?
Пользователь (2006-10-08 10:57:00) [1]implementation
var
DBAPI: TDBAPI;
CGlobalDB : integer;
constructor TDBAPI.Create; {override}
begin
if DBAPI <> nil then
begin
Self.Free;
Self := DBAPI;
end;
...
end;
procedure TDBAPI.Free; {reintroduce}
begin
dec(CGlobalDB);
if CGlobalDB = 0 then
begin
inherited Free;
DBAPI := nil;
end;
end;
atruhin (2006-10-08 10:46:00) [2]Небольшое уточнение:
Насколько я понял в таком варианте при зоздании обекта в коде DB := TDBAPI.Create(...); новый объект не создасться, и будет возвращен _DBAPI?
atruhin (2006-10-08 09:01:00) [3]Спасибо
Юрий Зотов (2006-10-08 08:39:00) [4]type
TDBAPI = class(...)
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;
TooMainAPI = class(..)
public
function GlobalDB: TDBAPI;
end
implementation
var
_DBAPI: TObject;
class function TDBAPI.NewInstance: TObject;
begin
if _DBAPI = nil then
_DBAPI := inherited NewInstance;
Result := _DBAPI;
end;
procedure TDBAPI.FreeInstance;
begin
_DBAPI := nil;
inherited;
end;
function TooMain.APIGlobalDB: TDBAPI;
begin
Result := TDBAPI(_DBAPI);
end;
initialization
TDBAPI.Create(...);
finalization
_DBAPI.Free;
end.