Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

Как создать глобальный компонент? Т.е. находящийся в одном экземп   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.023 c
6-1162985870
Del_
2006-11-08 14:37
2007.08.19
HTTPS через Socks


2-1185342922
gen
2007-07-25 09:55
2007.08.19
*.gif, *.jpeg


15-1185006460
Bratyk
2007-07-21 12:27
2007.08.19
Как сохранить проект в exe - файл


15-1184588170
Ricks
2007-07-16 16:16
2007.08.19
Творческие идеи


15-1184071382
Kolan
2007-07-10 16:43
2007.08.19
Использование DataLayer посоветуйте литературу.