Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];
ВнизКак создать объект с глобальной видимостью? Найти похожие ветки
← →
neveGreen (2008-12-07 23:07) [0]Как создать объект с глобальной видимостью, чтобы он был видим как Application?
← →
Юрий Зотов © (2008-12-07 23:12) [1]Так же, как и любую другую переменную - объявить ее в секции interface.
← →
DVM © (2008-12-07 23:13) [2]Собственно, все объекты "глобально видимы".
← →
Юрий Зотов © (2008-12-07 23:16) [3]Например:
unit MyUnit;
uses ....
interface
type
TMyClass = class(...)
...
end;
var
MyVar: TMyClass;
implementation
...
initialization
MyVar := TMyClass.Create(...);
finalization
MyVar.Free;
end.
Подробности см. в справке.
← →
DVM © (2008-12-07 23:24) [4]
> neveGreen (07.12.08 23:07)
или еще проще:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
var
L: TList;
begin
L := TList.Create;
try
//
finally
L.Free;
end;
end.
← →
Anatoly Podgoretsky © (2008-12-07 23:26) [5]> neveGreen (07.12.2008 23:07:00) [0]
Application не является глобально видимым объекту, а еще точнее, таких объектов нет. Видимостью управляет программист.
← →
neveGreen (2008-12-07 23:33) [6]я хочу сделать синглтон но чёто не соображу как...
← →
Amoeba © (2008-12-07 23:43) [7]Например так:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=267
← →
Юрий Зотов © (2008-12-08 01:10) [8]Прочитал материал по ссылке...
"Беда, коль пироги начнет печи сапожник..."
(c) И.А. Крылов.
Прежде, чем писать статьи, автору не помешало бы заглянуть в код TObject или хотя бы в справку. И там он нашел бы два вполне симпатичных метода - NewInstance и FreeInstance. Что избавило бы его от нагромождения целой кучи совершенно лишнего кода при реализации синглтона.
unit SingletonUnit;
uses ...
type
TSingleton = class(...)
...
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;
function Singleton: TSingleton; // Для получения экземпляра
implementation
var
_Singleton: TSingleton;
function Singleton: TSingleton;
begin
if _Singleton = nil then
TSingleton.Create(..);
Result := _Singleton
end;
class function TSingleton.NewInstance: TObject;
begin
if _Singleton = nil then
_Singleton := TSingleton(inherited NewInstance);
Result := _Singleton;
end;
procedure TSingleton.FreeInstance;
begin
inherited;
_Singletone := nil
end;
initialization
Singleton; // Этого можно и не делать, создание будет по первому запросу
finalization
_Singleton.Free
end.
← →
Германн © (2008-12-08 01:27) [9]
> Юрий Зотов © (08.12.08 01:10) [8]
>
> Прочитал материал по ссылке...
>
> "Беда, коль пироги начнет печи сапожник..."
> (c) И.А. Крылов.
>
И уж в который раз такое.
Ну а как нам с Амёбой жить далее? Если даже статьи на Королевстве не внушают доверия!
:)
← →
neveGreen (2008-12-08 23:35) [10]Спасибо. А наблюдатель как я понимаю можно просто сделать на TActionList ?
← →
neveGreen (2008-12-08 23:55) [11]
> Юрий Зотов © (08.12.08 01:10) [8]
Stack Overflow ???
← →
Юрий Зотов © (2008-12-09 00:09) [12]> neveGreen (08.12.08 23:55) [11]
Если изменили код - возможно.
← →
Григорьев Антон © (2008-12-09 08:56) [13]
> Юрий Зотов © (08.12.08 01:10) [8]
> Прочитал материал по ссылке...
Юрий, что ж ты это только здесь написал? Скоро ветка уйдёт в архив, и твои поправки будет найти очень трудно. А продублировал бы это ещё и комментариях к самой статье, и все, кто её читает, тоже увидели бы твои замечания.
← →
oxffff © (2008-12-09 09:39) [14]Юрий Зотов © (08.12.08 01:10) [8]
Позволите чуть поправить?
function Singleton: TSingleton;
begin
if _Singleton = nil then
TSingleton.Create(..);
Result := _Singleton
end;
на
function Singleton: TSingleton;
begin
Result := TSingleton.Create(..);
end;
← →
clickmaker © (2008-12-09 13:05) [15]> [14] oxffff © (09.12.08 09:39)
смысл этой поправки?
← →
oxffff © (2008-12-09 15:29) [16]
> clickmaker © (09.12.08 13:05) [15]
Проверка на if _Singleton = nil then делается в
class function TSingleton.NewInstance: TObject;
← →
oxffff © (2008-12-09 15:42) [17]
> clickmaker © (09.12.08 13:05) [15]
Естественно следует не забывать о выполняемом коде переинициализации.
А именно о коде конструкторов и коде AfterConstruction(который выполняется при вызове с параметром классовой ссылки ну или хитро помутив dl регистр).
← →
neveGreen (2008-12-09 21:00) [18]
> Юрий Зотов © (08.12.08 01:10) [8]
и как добавить свойство или метод в него?
← →
Юрий Зотов © (2008-12-09 21:04) [19]> neveGreen (09.12.08 21:00) [18]
Странный вопрос. Как и в любой другой класс, конечно.
← →
neveGreen (2008-12-09 21:13) [20]
> Юрий Зотов © (09.12.08 21:04) [19]
Ха... а я сделал его потомка!!!! :)
← →
Юрий Зотов © (2008-12-10 14:59) [21]
> Григорьев Антон © (09.12.08 08:56) [13]
Отметился...
:o)
← →
Григорьев Антон © (2008-12-10 16:29) [22]
> Юрий Зотов © (10.12.08 14:59) [21]
> Отметился...
> :o)
Да, я уже видел :) Тема поднята, народ там уже начал предлагать альтернативы :)
← →
Ins © (2008-12-10 17:06) [23]
> народ там уже начал предлагать альтернативы :)
Ну не нравится мне такая реализация :) Если быть совсем придирчивым, то пример Юрия не всем требованиям к синглтону удовлетворяет. Класс не только должен гарантировать существование единственного экземпляра, но и предоставлять к нему точку доступа. Остальные способы доступа хорошо бы сделать недоступными. Нехорошо получится, если кто-то попытается в обход функции Singletone вызвать конструктор. Ну и породить новый синглтон должно быть максимально просто, без лишних телодвижений в виде объявления переменных/функций доступа. А про NewInstance - это верное замечание.
← →
Джо © (2008-12-11 02:42) [24]
> Ins © (10.12.08 17:06) [23]
Функия Singleton тут избыточна.
Вызывайте конструктор класса, сколько будет угодно :)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.01 c