Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.007 c
15-1228289254
Sergey13
2008-12-03 10:27
2009.01.25
Проблемы с локальной сетью


2-1228680451
neveGreen
2008-12-07 23:07
2009.01.25
Как создать объект с глобальной видимостью?


15-1227781745
Vudu
2008-11-27 13:29
2009.01.25
Пользователей обяжут проверять лицензионность используемых програ


15-1228385772
Palladin
2008-12-04 13:16
2009.01.25
HTTPS сервер


2-1229192028
ИванН
2008-12-13 21:13
2009.01.25
Bottom





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский