Форум: "Потрепаться";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Вниз---|Ветка была без названия|--- Найти похожие ветки
← →
Страждущий (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;
Скачать: [xml.tar.bz2];
Память: 0.72 MB
Время: 0.013 c