Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.064 c
15-1184932058
EGFEFG
2007-07-20 15:47
2007.08.19
Почему компьютер трещит!


2-1185039805
kernel
2007-07-21 21:43
2007.08.19
"Постоянный ShowWindow(HWND, SW_HIDE)"


2-1185355218
vegarulez
2007-07-25 13:20
2007.08.19
Как обновить TButton внутри TPanel`a?


2-1185191496
gen
2007-07-23 15:51
2007.08.19
Прошу помощи мастера


2-1184918070
wWwWw
2007-07-20 11:54
2007.08.19
Как отследить нажатие комбинации клавиш?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский