Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
15-1184850441
Ega23
2007-07-19 17:07
2007.08.19
Дурной вопрос, но всё-же:


4-1172572399
LENIN_INC
2007-02-27 13:33
2007.08.19
LENIN INC WIN32API Library v1.2 (build 23.08.2006)


2-1185277127
kyro
2007-07-24 15:38
2007.08.19
Как сделать сортировку


3-1178081249
pavel_guzhanov
2007-05-02 08:47
2007.08.19
Не пойму, почему долго работает следующий код


2-1182812377
Сергей Макс.
2007-06-26 02:59
2007.08.19
SetFileSecurity




   Наверх