Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Страждущий   (2003-03-21 20:12) [80]

MBo, все равно не очень понял !

Можно подробнее.

1) Чему будет равно I после I := High(I) shr 8;

2) После этого чему будет равно Integer(@I) ?

3) Чему будет равно после этого PWord(Integer(@I) + 2) ?

и вообще, здесь непонятно. Если можно - поподробнее. Приведение к типу word я могу понять. Но приведение к типу указателя на word ? Чем он отличается от указателя на integer или string ?


 
JibSkeart ©   (2003-03-21 20:27) [81]

2Страждущий (21.03.03 20:12)
г). У каких компонентов есть событие OnCreate? Почему его нет у других компонентов?

Никогда не делал собственные компоненты. Думаю, что есть OnCreate у компонентов, которые являются классами. Ну а которые не используют классы - у тех и нету...это только догадки

Вообшето все компоненты являются наследниками какого нибуть класса
-------------
А событие OnCreatе есть насколько я помню Наследниках от класса
Формы
хотя имхо его можно засунуть и в свой собственный класс
------------
2 Юрий Зотов
д). Написать модуль, содержащий класс, который позволяет создать лишь один свой экземпляр (контрольное время - 10 минут).

вот это я несовсем понял
------------
(Немогу выделить шрифт другим стилем :(( вылетаемс )


 
MBo ©   (2003-03-21 21:34) [82]

>Чему будет равно I после I := High(I) shr 8;
ты правильно написал

>После этого чему будет равно Integer(@I)
абсолютное значение этого числа (адреса, а не значение, которое там хранится) до компиляции или запуска программы нам неизвестно, да оно и несущественно
Пусть оно будет, к примеру, 1 000 000

>Чему будет равно после этого PWord(Integer(@I) + 2)

число в скобках=1 000 002, интерпретируемое как адрес, указывает на 3-й от начала байт числа I.
w:=PWord()^ означает, что 2 байта по этому адресу будут записаны в w, т.е. 3 и 4 байты физического расположения I, а это старшее слово





 
Ihor Osov'yak ©   (2003-03-21 21:45) [83]

2 Страждущий (21.03.03 20:12)
> MBo, все равно не очень понял !

Как иллюстрация к MBo © (21.03.03 21:34) - см. Ihor Osov"yak © (21.03.03 13:20)




 
Knight ©   (2003-03-21 22:21) [84]

>> Страждущий
Надо тест на ламера?)
(в зипе 28к)


 
Knight ©   (2003-03-21 22:47) [85]

Может кто тоже захочет проверить себя на знание минимального...

Можете скачать по ссылке:
http://solvichegodsk.narod.ru/Lamer.zip

Не волнуйтесь, вирусов там нет! Если не верите слову благородного рыцаря, загрузите Касперского или ещё кого :)



 
Страждущий   (2003-03-21 23:02) [86]

MBo, спасибо !

Но так до сих пор и не осознал:

1) Значит, строка I := High(I) shr 8; просто чтобы сбить с толку ?

2) число в скобках=1 000 002, интерпретируемое как адрес, указывает на 3-й от начала байт числа I.

В общем, понятно. То есть PWord(Integer(@I) + 2) это тоже самое, что Pointer(Integer(@I) + 2) ? Просто тогда бы была несовместимость с word
То есть, можно перезаписать выражение как
W := PWord(Pointer(Integer(@I) + 2))^; ?

3) w:=PWord()^ означает, что 2 байта по этому адресу будут записаны в w, т.е. 3 и 4 байты физического расположения I

Вот тут самые непонятки. Никак в толк не возьму, почему это так.
Если я правильно написал, то третий и четвертный байт будут равны FF. А это 65535 (DEC)


 
Страждущий   (2003-03-21 23:10) [87]

Так опять ошибся. Вопрос

>1) Значит, строка I := High(I) shr 8; просто чтобы сбить с толку ?

снимается. Что-то даже сам не понял, зачем запостил


 
MBo ©   (2003-03-21 23:14) [88]

>То есть, можно перезаписать выражение как
>W := PWord(Pointer(Integer(@I) + 2))^; ?
Да, верно


>Если я правильно написал, то третий и четвертный байт будут равны FF. А это 65535 (DEC)

Нет! Это отмечалось И.Осовяком в 13:20 и в моем постинге -
старшее слово физически хранится по младшему адресу, т.е.
$AAAABBBB располагается в памяти как
сдвиг от начала
0 1 2 3 (в байтах)
BB BB AA AA







 
Torry   (2003-03-22 00:11) [89]

Уровень обозначь?
Реальный определим...


 
Страждущий   (2003-03-22 00:25) [90]

MBo, огромное спасибо за помощь ! Теперь все понятно с заданием.

Но возникают вопросы. А это у integer"а так все наоборот или у всех типов ? И почему так ? Нету ссылочки на документацию ?


 
Ihor Osov'yak ©   (2003-03-22 00:34) [91]

2 Страждущий (22.03.03 00:25)

Вообще-то, извини что вмешиваюсь, в восемнадцать лет больше толку будет от читания книжек и хождения на занятия, чем от поиска работы.. Конечно, при условии, если кушать есть что ...



 
Ihor Osov'yak ©   (2003-03-22 00:37) [92]

> А это у integer"а так все наоборот или у всех типов ? И почему так ?

Во всяком случае для интеловской линейки и их клонов - да для всех типов. Для других архитектур не знаю. Исторически так сложилось.


 
Юрий Зотов ©   (2003-03-22 02:29) [93]

Попробую ответить в хронологии постов.


> stone © (21.03.03 10:31)

> Это типа ходячая энциклопедия?
До энциклопедии здесь - как до Луны. Практически, это необходимый минимум (да и то далеко не полный) для того, чтобы считаться приличным программистом на Delphi. А приличному программисту такие вещи положено знать наизусть - за исключением параметров процедур и других мелких технических деталей, которые всегда можно посмотреть в справке. Поэтому и было сказано - достаточно показать правильную схему.


> Mike_Goblin © (21.03.03 11:04)

> два значения override и overload. Какой имелся ввиду?
Там же сказано - процедура. Какой же может быть override?

> в. TPersistent. Метод Assign
Для коллекций все же САМОЕ главное, видимо, не Assign, а DefineProperties.

> д. В implementation секции - глобальную переменные
> Instance:TObject и RefCount

А зачем RefСount? Для ЭТОЙ задачи - лишнее.


> Игорь Шевченко © (21.03.03 11:08)
Можно :o)


> Ihor Osov"yak © (21.03.03 11:26)
Зачем лишние операции? Надо вынести Create из try, вот и все.


>Mike_Goblin © (21.03.03 11:41)

> OnCreate - есть у потомков TCustomForm.
И модулей данных.

> В ранних версиях вызывалось из конструктора класса, сейчас
> из AfterConstruction.

Зависит от OldCreateOrder.

> Нужно чтобы не переопределять конструктор при визуальном
> наследовании.

Не обязательно конструктор, возможно Loaded (зависит от OldCreateOrder). Но все же, думаю, больше всего это нужно для того, что бы прикладник Вася мог просто квакнуть мышкой в Инспекторе и не заморачивать себе голову тонкостями создания и загрузки.

> Внутренние объекты ядра Windows, ну например кисти
> рисования, Handles. См TCanvas

Ядро Windows - это kernel. В справке эти объекты прямо так и называются - kernel objects (и все перечислены). Кисти к ним точно не относятся, а хэндлы - далеко не все. И эти объекты далеко не всегда внутренние (скажем, процессы).

> если DLL не загружена в память другими процессами - то
> вызов LoadLibrary загрузит ее туда.

Код инициализации должен быть исполнен в любом случае, причем в контексте загрузившего потока. Прочее - подмапливается и грузится постранично, по мере обращения.

> прочесть справку, я не держу в это голове
Я тоже не сумасшедший. Поэтому запоминаю не детали, а НАЗНАЧЕНИЕ функций. Чтобы при написании кода точно знать, какая из них мне в данном месте лучше всего подходит и сразу открыть хелп где надо, а не блуждать по нему в поисках неизвестно чего. Вопрос и был на НАЗНАЧЕНИЕ функций (причем, наверное, наиболее часто используемых), а не на детали их вызова.


> DiamondShark © (21.03.03 12:45)

> а маразм в вопросе 3 пункт д пропустил.
Что-то Вы сегодня и правда какой-то сердитый, батенька. Почему маразм? По такому принципу, например, довольно часто строятся различные глобальные списки, их менеджеры и пр. Вполне обычная практика, никакого маразма. Возможно, Вы просто еще с этим не сталкивались, так ведь это же еще ни о чем не говорит, не так ли?


> han_malign © (21.03.03 13:11)

> если в моем конструкторе возникает Exeption - значит,
> либо пора делать сепуку программе(ну кончились ресурсы),
> либо харакири себе,


Либо этот конструктор так и задуман. Например, у компонентов для этого есть даже специальный метод ValidateContainer. Так что пожалейте свой живот, он еще не допил все положенное ему в этой жизни пиво.


> Ihor Osov"yak © (21.03.03 13:20)

Конечно, в вопросе 1 спрятана ловушка - именно перестановка байт. Конечно, там не зря сказано о платформе x86. Строгости ради в вопросе надо было еще упомянуть: "32-битный".


> Ihor Osov"yak © (21.03.03 14:28)

Заготовок не было. Была старческая бессонница. Надо же было чем-то со скуки заняться? Вот и занялся любимым делом стариков - молодежь жизни учить.
:о)


> y-soft © (21.03.03 14:45)

Запой - это не страдание. Это счастье. Мудрые и познавшие Истину СуперГуру таким образом уходят в Мир Внутреннего Равновесия. У йогов это еще называется "нирвана". Тьфу... слово-то какое... куда им, этим тощим в повязках, до наших дядей Васей!
;о)


> All

И все же никто так и не ответил на вопрос о том, почему OnCreate есть только у форм и модулей данных, а у других компонентов - нет. А ведь это неспроста. И ответ на этот вопрос сразу указывает на уровень понимания человеком VCL и компонентов.

Ну? Есть тут серьезные Component Writer"ы?
:o)



 
Юрий Зотов ©   (2003-03-22 02:31) [94]

> Страждущий

Я внимательно прочитал Ваши постинги. Могу совершенно точно сказать, что для 18 лет Вы очень даже неплохо выглядите - это чувствуется уже даже по используемой Вами терминологии. Но главное то, что Вы на верном пути. Не всякие там детские игрушки в виде трояна, в котором ничего своего нет, а все надергано из Инета и кое-как слеплено в 400-метровый EXE. А ОСНОВЫ!!! Типы данных! Двоичный код! Работа с памятью! Язык! ООП! И т.д.

Кстати, в работе с памятью у Вас чувствуются пробелы. Очень советую капитально проштудировать тему "Указатели и динамическая память".

И еще - серьезному программисту все же нужно высшее образование. Лучше всего - по этой же специальности, но можно и техническое. Так что ОЧЕНЬ советую не спешить устраиваться на работу (даже программистом), а всерьез подумать о серьезном ВУЗе.

Последнее. Если хотите - присоединяйтесь (только придется догонять):
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1046809017&n=3


 
Tux ©   (2003-03-22 03:07) [95]

Знаете, Юрий, какой-то рекрутер майкрософт пришел к выводу, что понимание принципов работы с динамической памятью есть способность - это либо дано, либо нет. Наверное, не совру, если скажу, что 8 из 10 делфистов, которые никогда не работали с С/С++, указателей-аресации-разадресации не понимают вовсе. Это по опыту трех десятков собесдований с кандидатами.
* * *
> Mike_Goblin
Кстати, реализацию синглтона на основе счетчика ссылок сишники посчитали бы за дурной тон, поскольку она, придираясь, во-первых, избыточна, во-вторых, в вашей реализации, потоконебезопасна. Приличнее создать static-функцию и проверять статическую переменную-экземпляр синглтона на равенство NULL, при равенстве - создавать, при неравенстве - отдавать указатель, причем на всякий пожарный защищать код CriticalSectionами или т.п.


 
y-soft ©   (2003-03-22 09:16) [96]

>Юрий Зотов © (22.03.03 02:29)

Запой - это не страдание. Это счастье. Мудрые и познавшие Истину СуперГуру таким образом уходят в Мир Внутреннего Равновесия

Ой, зачем Вы это говорите убежденному трезвеннику и рационалисту. Моя доля - растаскивать упившихся Гуру после вечеринок по домам...:)


 
JibSkeart ©   (2003-03-22 09:41) [97]

Юрий Зотов © (22.03.03 02:29)

> All

И все же никто так и не ответил на вопрос о том, почему OnCreate есть только у форм и модулей данных, а у других компонентов - нет. А ведь это неспроста. И ответ на этот вопрос сразу указывает на уровень понимания человеком VCL и компонентов.

Ну? Есть тут серьезные Component Writer"ы?
:o)


Хмм на сколько я помню веть енто событие посылает Винда
Правильно помню ??
и может быть отсюда следует искать ответ ??
Или нет ??
В чем неправ .. просто уже все go out of mind :o)


 
Knight ©   (2003-03-22 09:51) [98]

Господа!

Никто не будет против если попрошу тут помощи...

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1048190634&n=3

Прога горит до вторника сделать надо, а я пока компонент для работы с базами не писал :(


 
vuk ©   (2003-03-22 10:33) [99]

>И все же никто так и не ответил на вопрос о том, почему
>OnCreate есть только у форм и модулей данных, а у других
>компонентов - нет.

Ну, на первый взгляд, OnCreate мы видим у компонентов-контейнеров (формы и модули данных), тех для которых есть свои файлы форм и, соответственно, ресурсы в .exe. А OnCreate вызывается после загрузки формы из ресурсов.

P.S. Жалко, что такого Event-а нет у фреймов - приходится постоянно перекрывать AfterConstruction(90% используемых фреймов).


 
Юрий Зотов ©   (2003-03-22 11:14) [100]

> JibSkeart © (22.03.03 09:41)

> на сколько я помню веть енто событие посылает Винда
> Правильно помню ??

Увы, неправильно. Это событие возбуждается кодом VCL (метод DoCreate). В Винде тоже есть термин "событие", и даже в двух разных контекстах, но ни один из этих контекстов к событиям компонентов Delphi не имеет никакого отношения. Многие события Delphi имеют отношение к СООБЩЕНИЯМ системы - но только не OnCreate, это событие чисто VCL"ное.


> и может быть отсюда следует искать ответ ??

Подскажу - ответ следует искать в порядке создания компонентов и их инициализации из ресурсов.


 
Страждущий   (2003-03-22 11:44) [101]

Мастера ! Осталось ма-а-аленькая непонятка :)

Если есть четырехбайтовая переменная
AA BB CC DD
то в памяти она будет распологаться как

1) DD CC BB AA
или как
2) CC DD AA BB ?

По Ihor Osov"yak © (21.03.03 13:20) я понял, что верно первое:
$007FFFFF ... FF FF 7F 00

А вот прочитав MBo © (21.03.03 23:14) возникли сомнения (из-за использования одинаковых букв)

P.S. А у string тоже так, последний символ идет в памяти первым ?

А куда тогда указывают указатели ? По идее, они указывают на первый байт переменной. Но так как первый байт находится самым последним в памяти (если я правильно понял), то... допустим это кусочек памяти:

AA BB CC DD
..........^ указатель указывает на DD ? И остальные байты этой переменной идут перед ним ?


 
Страждущий   (2003-03-22 11:47) [102]

Из-за форматирования неправильно немного отразилось, должно быть:

AA BB CC DD
..............^ указатель указывает на DD ? И остальные байты этой переменной идут перед ним ?


 
MBo ©   (2003-03-22 11:53) [103]

проверь сам:

procedure TForm1.Button2Click(Sender: TObject);
var a:DWord;
begin
PByteArray(@a)[0]:=1;
PByteArray(@a)[1]:=2;
PByteArray(@a)[2]:=3;
PByteArray(@a)[3]:=4;
Caption:=IntToHex(a,8);
end;

указатель на переменную - адрес физически первого байта в памяти, т.е. самый меньший



 
JibSkeart ©   (2003-03-22 12:09) [104]

Юрий Зотов © (22.03.03 11:14)
Хмм значит уже каша в голове все спуталось :(

Ну вообшем уже более мене понятно ...
Да вот что что, а этот вопрос у меня как то не возникал :)
Ну компоненты особенно не приходилось делать
может из за этого точно и незнаю ...


 
Юрий Зотов ©   (2003-03-22 13:19) [105]

> Страждущий (22.03.03 11:44)

1. Перестановка байт относится к целым переменным, а не к массивам. Строка - это массив.

2. Адрес переменной любого типа всегда указывает на ее младший байт. Не на байт с младшей частью ЗНАЧЕНИЯ, а на байт с младшим АДРЕСОМ. То есть - на начало УЧАСТКА, по которому данная переменная размещена в памяти.

3. Целая переменная со значением AABBCCDD в памяти хранится так:

- сначала меняем местами слова (точнее, машинные полуслова, потому что МАШИННОЕ (не Паскалевское) слово здесь - 4 байта).
Получаем: CCDDAABB

- теперь в каждом слове меняем местами его байты.
Получаем: DDCCBBAA

Вот это и есть физическое расположение числа в памяти для 32-битного x86. Указатель на него дает адрес ПЕРВОГО (точнее, нулевого) байта - то есть, адрес байта, в котором записано DD.

Но если написать:

type
PInt = ^Integer;
var
I, J: Integer;
begin
I := $AABBCCDD;
J := PInt(@I)^
end;

то J будет равно $AABBCCDD, а не $DDCCBBAA. Это разруливается автоматически (ведь PInt - это ТИПИЗИРОВАННЫЙ указатель, значит и содержимое, на которое он указывает, рассматривается ЦЕЛИКОМ, как 4-х байтовое число, а не как набор из 4-х отдельных байт). А если написать так:

type
PByte = ^Byte;
var
I: Integer;
B: byte;
begin
I := $AABBCCDD;
B := PByte(@I)^
end;

то B будет равно $DD. По той же причине типизированного указателя и автоматической интерпретации того, на что он указывает, как одного ОТДЕЛЬНО взятого байта.

Чтобы увидеть всю эту кухню своими глазами, сделайте такую вещь.

1. Бросьте на форму кнопку и напишите к ней обработчик OnClick:

procedure TForm1.Button1Click(Sender: TObject);
var
I: integer;
begin
I := $AABBCCDD;
Caption := IntToStr(I); // Здесь поставьте BreakPoint
end;


2. В опциях проекта отключите оптимизацию (вкладка Compiler), сделайте проекту Build, запустите и щелкните по кнопке. Приходим на BreakPoint и начинаем наши исследования.

3. Откройте окно Watch List (меню View - Debug Windows - Watches). Дважды щелкните по его верхней пустой строке, а в отрывшемся диалоге введите @I, поставьте Hexadecimal и нажмите OK. Получите шестнадцатиричный адрес переменной I - запишите его на бумажку.

4. Откройте окно CPU (меню View - Debug Windows - CPU). Сделайте правый клик в его левом нижнем поле и в менюшке выберите GoTo Address. В диалоге введите ранее полученный адрес I (не забудьте в его начале написать $ - он же шестнадцатиричный) и нажмите OK. Содержимое левого нижнего поля изменится - это мы перешли на нужный адрес и теперь поле отражает содержимое памяти по этому адресу.

5. Снова сделайте правый клик по этому полю и выберите Display As -> Bytes. Теперь Вы видите память ТОЧНО в ее внутреннем машинном представлении - и там Вы увидите: DD BB CC AA. Это и есть точное внутреннее представление переменной I в памяти. Как видите, в нем переставлены слова, а внутри слов - байты. То, о чем я говорил выше.

6. Если теперь выбрать Display As -> DWords, то мы увидим AABBCCDD - то есть, ЗНАЧЕНИЕ переменной I. Конечно, содержимое памяти не изменилось, изменился только СПОСОБ, которым нам его показывают (в виде цельных 4-х байтовых слов). Можно выбрать и Display As -> Words, тогда увидим содержимое памяти в виде двухбайтовых слов: CCDD AABB. Слова видим переставленными (ведь они действительно переставлены), но байты в них - не переставленными (потому, что нам показывают не отдельные байты, а 2-х байтовые слова целиком).

Вот такие особенности у этих x86.


 
vuk ©   (2003-03-22 14:26) [106]

>и там Вы увидите: DD BB CC AA

DD CC BB AA


 
Юрий Зотов ©   (2003-03-22 14:48) [107]

> vuk © (22.03.03 14:26)

Конечно. Опечатка, sorry.


 
Knight ©   (2003-03-22 15:13) [108]

>> Юрий Зотов

Зайди если не сложно на:

http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1048190634&n=3

Очень нужен совет.


 
Страждущий   (2003-03-22 20:50) [109]

Юрий Зотов, огромное Вам человеческое спасибо !

С удовольствием присоединяюсь к вашему обучению для начинающих программистов !


 
Mike_Goblin ©   (2003-03-23 14:50) [110]

>Tux © (22.03.03 03:07)
Про потокобезопасность согласен, InterlockedIncrement function поможет, а вот про
>Приличнее создать static-функцию и проверять статическую >переменную-экземпляр синглтона на равенство NULL
Вы в ObjectPascal видели статические переменные?


 
Mike_Goblin ©   (2003-03-23 15:02) [111]

2 Юрий Зотов
по поводу OnCreate
он есть у классов, которые должны редактироваться визуально в конструкторе форм (TCustomForm, TDataModule). Если бы его не было, то товарищ Пупкин должен был бы дописывать код конструктора или AfterConstruction - а это процесс не визуальный (это методы и они не видны в инспекторе объектов), т.е он огорчился бы от невозможности программировать мышью.

>Ну? Есть тут серьезные Component Writer"ы?
>:o)
Да - это Вы :)


 
Юрий Зотов ©   (2003-03-23 16:52) [112]

> Mike_Goblin © (23.03.03 15:02)

> По поводу OnCreate.

Однако же, мы бы могли помочь бедняге Васе, и сделать такой компонент:

type
TSuperPuperComponent = class(TComponent)
private
FOnCreate: TNotifyEvent;
protected
procedure DoCreate; dynamic;
public
constructor Create(AOwner: TComponent); override;
published
property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
end;

constructor TSuperPuperComponent.Create(AOwner: TComponent);
begin
inherited;
DoCreate
end;

procedure TSuperPuperComponent.DoCreate;
begin
if Assigned(FOnCreate) then FOnCreate(Self)
end;

Компонент сделан строго по всем классическим канонам. И в Инспекторе появится событие OnCreate. И Васе не надо будет замещать никаких AfterConstruction - он сможет просто квакнуть мышкой и написать: ShowMessage("Привет, Вася!").

Тем не менее, по каким-то причинам в Borland так не сделали. А вот по каким?


 
vuk ©   (2003-03-23 17:02) [113]

to Юрий Зотов:
>А вот по каким?
На момент вызова не будут загружены свойства, ведь сначала вызывается конструктор компонента и только потом загружаются свойства. В том числе и само значение свойства OnCreate. OnCreate же форм и модулей данных, как я уже написал, вызывается после загрузки формы - тогда, когда все компоненты и обработчики уже инициализированы.




 
Юрий Зотов ©   (2003-03-24 02:08) [114]

Ну вот, так я и знал, что умный vuk все испортит :о)

Вот именно. Компонент выше формально выполнен безукоризненно, вот только смысла в нем никакого нет - событие OnCreate при таком его возбуждении не произойдет НИКОГДА! Поэтому его и нет ни у каких компонентов, кроме тех, которые имеют свои ресурсы. И возбуждается оно не сразу после создания, а именно после загрузки ресурсов. Потому что только после этого обработчик будет действительно назначен(и, кроме того, уже будут правильно проинициализированы все свойства всех компонентов - иначе в своем обработчике юзер запросто мог бы нарваться на ошибку).


 
VaS ©   (2003-03-24 09:05) [115]

Юрий Зотов: А Вас не удивили ответы некоторых Мастеров? Мне лично стало в очередной раз грустно - средний уровень делфи-прораммистов низок.


 
vuk ©   (2003-03-24 10:52) [116]

to Юрий Зотов:
>vuk все испортит
Ну вот. Всем можно свой уровень проверять, а мне нет. :o)

P.S. Засыпался на первом вопросе.


 
Romkin ©   (2003-03-24 10:55) [117]

2VaS А ты меня по БД протестируй :-)))

У меня возник некоторый вопрос по поводу синглетона. Все, конечно, замечательно здесь написано, вот только у Борланд такого кода, имхо, не встречается. Что мешает, к примеру, создавать синглетон как, например, Printer?
в implementation - переменная FSingleton
interface - function Singleton: TSingleton,
в ней if not assigned(FSingleton) then FSingleton := TSingleton.Create(...);
Result := FSingleton;

И все вроде нормально... Чем плохо?


 
vuk ©   (2003-03-24 11:05) [118]

to Romkin:
>Чем плохо?
Тем, что не синглетон это, а автоматическое создание экземпляра.


 
Romkin ©   (2003-03-24 11:09) [119]

И чем мешает? Только не надо о частностях - в конструкторе я ведь могу проверить переменную и выдать исключение, если уже есть объект. Плюс - все как от Борланд ж-) а о session & sessions я вообще молчу :-)))


 
vuk ©   (2003-03-24 11:17) [120]

to Romkin:
>в конструкторе я ведь могу проверить переменную и выдать
>исключение, если уже есть объект
О! Тут-то собака и порылась! Если Вы возбуждаете исключение в конструкторе, то последствия, надеюсь, понятны - нужно ловить исключения, нужна глобальная общедорступная переменная или функция и т.п. А перекрытие NewInstance/FreeInstance дает простой способ - делается вызов конструктора, но возвращается всегда один и тот же объект. И никаких исключений.

>Плюс - все как от Борланд
Еще раз. Borland не делал синглетон из TPrinter, т.к. создать другие экземпляры можно.



Страницы: 1 2 3 4 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.74 MB
Время: 0.026 c
14-30559
Kair
2003-03-23 21:51
2003.04.10
RC усилители. Что за штука такая?


1-30324
Apachi
2003-03-31 12:58
2003.04.10
res file


14-30510
Supreme 2
2003-03-23 22:02
2003.04.10
Какие лучше?


7-30622
Sergei
2003-02-14 16:03
2003.04.10
Как запретить на машине запуск любых консольных приложений?


4-30659
Solskjǽr
2003-02-11 18:43
2003.04.10
завершить процесс