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

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

Singleton [D5, Win2k]


Страницы:   1 2 3

Fktrc ©   (2004-11-23 05:10:00) 

Можно ли в Delphi создать единственный экземпляр класса на все приложение? Т.е. чтобы при попытках создать второй выдавалась либо ошибка компиляции, либо рантайм ошибка. По-моему, такие объекты называют singleton, хотя могу и ошибаться.
Пока приходит в голову только создание какого-л именованного объекта ядра в конструкторе объекта. Но нет ли другого способа, изящнее?


Суслик   (2004-11-23 15:43:00) [1]


> Это проблема TObject :)

это не проблема tobject, это особенность дельфи - нет понижения видимости.
Может это и к лучшему...


Palladin   (2004-11-23 15:41:00) [2]

Это проблема TObject :) Я не виноват что в нем Free невиртуальный :)


VMcL   (2004-11-23 15:34:00) [3]

>> Palladin ©  (23.11.04 13:37) [39]

Даже без FreeAndNil.
TObject(SingleObject).Free;
:-p


jack128   (2004-11-23 14:45:00) [4]

Суслик ©   (23.11.04 14:15) [43]
Спасибо, что напомнил ;-) Но в данном случае это не имеет значение.


Суслик   (2004-11-23 14:15:00) [5]


>  [42] jack128 ©   (23.11.04 14:09)

create должен быть virtual
иначе создаться объект класса tsingletone, но выполниться тело конструктора tobject


jack128   (2004-11-23 14:09:00) [6]

var
 cl: TClass;
begin
 cl := TSingletone;
 with cl.Create do
   ...  
end;


Palladin   (2004-11-23 13:43:00) [7]

Ну и хрен с ним...


>  [40] jack128 ©   (23.11.04 13:41)

через какую классовую ссылку?


jack128   (2004-11-23 13:41:00) [8]

Palladin ©   (23.11.04 13:37) [39]
и создать твой объект можно. Через классовую ссылку ;-)


Palladin   (2004-11-23 13:37:00) [9]

Сорри, а ведь точно сделает...


Palladin   (2004-11-23 13:35:00) [10]

Не сделает, не волнуйся.


GuAV   (2004-11-23 13:25:00) [11]

Palladin ©   (23.11.04 13:02) [28]
Ха! FreeAdnNil его сделает! :)


Суслик   (2004-11-23 13:23:00) [12]


>  [35] Palladin ©   (23.11.04 13:21)
> Хем, ну что ж... ты понизил абстрагирование обсуждения Singletone
> до Делфи, я в свою очередь понизил до Делфи6... :)


Точное замечание:)


Palladin   (2004-11-23 13:21:00) [13]

Хем, ну что ж... ты понизил абстрагирование обсуждения Singletone до Делфи, я в свою очередь понизил до Делфи6... :)


Суслик   (2004-11-23 13:15:00) [14]


>  [32] Palladin ©   (23.11.04 13:11)


> Конструктор от TObject.

гонишь :)))

Как раз он то и будет виден. Твой новый конструктор виден не будет.


Суслик   (2004-11-23 13:12:00) [15]


>  [31] Palladin ©   (23.11.04 13:10)


> Я пробовал что написал. Не видно. D6

ну бог в помощь :)
Для справки: в дельфи не документированно понижение видимости. В д3 оно было, но работало не так, как в д5. Если не ошибаюсь и в д6 нет документации на понижение видимости. Если найдешь оное, буду благодарен за информацию.


Palladin   (2004-11-23 13:11:00) [16]


> Кто не будет виден в другом модуле?

Конструктор от TObject.


Palladin   (2004-11-23 13:10:00) [17]

Я пробовал что написал. Не видно. D6


Суслик   (2004-11-23 13:09:00) [18]


> [28] Palladin ©   (23.11.04 13:02)

у тебя create виден, только не tsingletone, а tobject.

Спасти свой класс от инстанцирования тебе не удасться :)
Кроме как переопределить в PUBLIC конструктор Create, в нем возбуждать исключение, а пользоваться другим private конструктором.


Суслик   (2004-11-23 13:06:00) [19]


>  [28] Palladin ©   (23.11.04 13:02)


> Ну вот, попробовал... в этом модуле будет видно, в других
> нет...
> хоть заудаляйся...

ты сам проверял, что написал?
Кто не будет виден в другом модуле?
Все видно :)


Palladin   (2004-11-23 13:02:00) [20]


> а ты попробуй :)))



Unit Singletone;
Interface
Type
TSingletone=Class
 Protected
  Constructor Create;
  Destructor Destroy;
 Public
  Class Function New:TSingletone;
  Class Procedure Free;
End;

Implementation

Var
SingleObject:TSingletone;

Class Function TSingletone.New;
Begin
If SingleObject=Nil Then SingleObject:=TSingletone.Create;
Result:=SingleObject;
End;

Constructor TSingletone.Create;
Begin
End;

Class Procedure TSingletone.Free;
Begin
End;

Initialization
SingleObject:=Nil;
End.


Ну вот, попробовал... в этом модуле будет видно, в других нет...
хоть заудаляйся...


> А знаешь почему?

Спасибо за разьяснения... даже и в голову не приходило... года три назад...


Страницы:   1 2 3

Наверх

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