Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо