Главная страница
    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.038 c
15-1185014843
Kostafey
2007-07-21 14:47
2007.08.19
С днем рождения ! 21 июля


3-1178273192
zero
2007-05-04 14:06
2007.08.19
Узнать значение перед изменением ячейки


15-1184881177
Германн
2007-07-20 01:39
2007.08.19
Из СИ в Паскаль


15-1184753380
tean-q
2007-07-18 14:09
2007.08.19
Китайская программа


1-1181366240
Чапаев
2007-06-09 09:17
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский