Форум: "Компоненты";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизКак создать глобальный компонент? Т.е. находящийся в одном экземп Найти похожие ветки
← →
atruhin © (2006-10-08 07:00) [0]Корявая тема получилась :), но есть объект, он должен быть создан в одном экземпляре. Т.к. он нужен в 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 08:39) [1]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.
← →
atruhin © (2006-10-08 09:01) [2]Спасибо
← →
atruhin © (2006-10-08 10:46) [3]Небольшое уточнение:
Насколько я понял в таком варианте при зоздании обекта в коде DB := TDBAPI.Create(...); новый объект не создасться, и будет возвращен _DBAPI?
← →
Пользователь (2006-10-08 10:57) [4]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;
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.04 c