Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 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
1-30439
dir_er
2003-03-31 04:08
2003.04.10
параметры и мессаги


14-30598
Konstantionov
2003-03-25 19:31
2003.04.10
Что почитать по assembler?


14-30521
Yuri20031
2003-03-21 19:15
2003.04.10
Как скрыть вкладку


3-30261
Vladislav
2003-03-21 12:22
2003.04.10
Несколько картинок в DBGrid


3-30232
Surgeon
2003-03-20 17:16
2003.04.10
Доступ к .mdb без изменения внешних параметров





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