Текущий архив: 2004.08.01;
Скачать: CL | DM;
ВнизОператор IS небезопасен для форм Найти похожие ветки
← →
Piter © (2004-07-14 00:36) [40]DiamondShark © (14.07.04 0:08) [34]
Если к объекту применили Free, то он уже не является an instance of the class
А это значит, что IS вернет ... ?
← →
DiamondShark © (2004-07-14 00:44) [41]
> DiamondShark © (14.07.04 00:27) [39]
Пардон, не наследником, а предком.
Левый операнд должен иметь объявленый тип, являющийся предком правого. Или совпадать.
> Piter © (14.07.04 00:36) [40]
Не применима операция в этом случае вообще.
Слева должна быть коррекная ссылка на экземпляр, или nil.
← →
Piter © (2004-07-14 01:37) [42]DiamondShark © (14.07.04 0:44) [41]
Не применима операция в этом случае вообще.
Слева должна быть коррекная ссылка на экземпляр, или nil.
Ха-ха! Это ты когда придумал, сейчас или вчера? :)
Ты сам приводил цитату их help"а
>returns True if object is an instance of the class
И сам же говорил:
>Если к объекту применили Free, то он уже не является an >instance of the class
Теперь совмещаем эти два утверждения!
Получается, что оператор IS возвращает True, если объект является экземпляром нужного нам класса.
Но ты говоришь, что после Free объект уже не является экземпляром класса, верно? То есть, IS должен возвращать false, ведь так?
Заметь, я ничего не придумывал, я всего лишь цитировал ТЕБЯ, любимого :)
Так вот, несмотря на все это, несмотря на Free - хочешь я тебе построю пример, что Is все равно будет возвращать True?
← →
Sergey Kaminski (2004-07-14 06:32) [43]Прикольно тут всё, прикольно... или это все всерьез, Piter?
По-твоему, поведение оператораis
нелогично?
И всегда должен вызываться InheritsFrom? Вот так, например:
var
Btn: TButton;
begin
Btn := Pointer(123);
if Btn.InheritsFrom(TButton) then // заменим "нелогичный" is
ShowMessage("This is a TButton");
end;
Не смущает, что в таком случае AV будет всегда? Независимо "от версии Делфи". И количества итераций.
← →
KSergey © (2004-07-14 08:48) [44]Люди, хочу внести свои предложения.
1.Предлагаю не обсуждать вызовы каких-либо методов, операторов и проч. после Free. Очевидно, что это идиотизм чистейшй воды работать с дикими указателями. Получить можно все, что угодно. И не подадаваться на провокации по этому вопросу. Пиписьками уже давно все померялись.
2.Но мне так и не попалось здесь, признаюсь, причин, объясняющих отсутствие реальной проверки в коде, приведенном в [26] Григорьев Антон © (13.07.04 22:28). Происки оптимизатора? Или что? Или я так и не смог найти нужное место в хелпе, в котором бы говорилось, что реально проверка выполняется не всегда?
← →
Style © (2004-07-14 09:14) [45]
> Там где показано ставишь брекпоинт. Запускаешь приложение,
> нажимаешь на кнопку, срабатывает брекпоинт. Нажимаешь F7.
> Неужели происходит вызов IsClass?!?!?!
Только что проверил в D5 тоже происходит вызов _IsClass
Если интересно, то напиши после Is еще одну строчку например
if Flag then Caption := IntToStr(integer(Flag));
и поставь там тоже BreakPoint. Вызов IsClass произойдет раньше чем if Flag...
В D7 к тому же если ты остановишься ВНУТРИ функции IsClass то можешь проверить значения входных параметров Child и Parent если использовать Evaluate\Modify (Ctrl+F7) и в нем написать к примеру pointer(Child) то можно увидеть адресс экземпляра, указатель на который будет использован в InheritsFrom.
Можно эти адреса посмотреть и в программе:
Caption := Format("frm: %s, TForm1: %s",
[IntToHex(integer(frm),4),
IntToHex(integer(TForm1),4)]);
Кстати интересно что в D5 IsClass не содержит вызова InheritsFrom. Т.е. IsClass содержит почти тот же код что и InheritsFrom, только указатели на класс и экземпляр предварительно устанавливаются в регистрах самим компилятором.
← →
Cobalt © (2004-07-14 09:28) [46]2 Piter © (14.07.04 01:37) [42]
Миша, Миша, успокойся, пожалуйста!
Вот тебе цитаты из хелпа.
Class operators
The operators as and is take classes and instance objects as operands; as operates on interfaces as well.
----------
The is operator
The is operator, which performs dynamic type checking, is used to verify the actual runtime class of an object.
Достаточно?
← →
Григорьев Антон © (2004-07-14 09:59) [47]
> DiamondShark © (14.07.04 00:17) [37]
Продолжаю настаивать на том, что если укзатель указывает на TEdit, ожидаемое поведение is TButton для этого указателя - вернуть False, независимо от объявленного типа указателя.
Ну а что касается указателей после Free или указателей, указывающих неизвестно куда, то к ним никакие операции неприменимы и дают непредсказуемый результат - это аксиома. И устраивать проверки в разных версиях Delphi, ИМХО, бессмысленно - результат зависит от стечения множества факторов, которые делают результат непредсказуемым.
← →
Style © (2004-07-14 10:14) [48]
> Продолжаю настаивать на том, что если укзатель указывает
> на TEdit, ожидаемое поведение is TButton для этого указателя
> - вернуть False, независимо от объявленного типа указателя.
Ну дык тип самой переменной - является TButton, что даже по коду видно что тут, что-то не так.
Обычно если и делают приведение типов то и переменную объявляют того класса к которому относиться экземпляр. Или любой класс выше по иерархии.
Это вообще в своем уме нужно быть что бы написать
Button := Edit???
Объявите Btn по другому и все встанет на свои места.
var
btn : TControl;
← →
KSergey © (2004-07-14 10:25) [49]> [48] Style © (14.07.04 10:14)
Где написано, что не будет происходить явной проверки??? Что все соптимизируется??
← →
Тимохов © (2004-07-14 10:28) [50]
> Nous Mellon © (13.07.04 20:16) [18]
> не обвинять человека не зная ответа
укажите мне пальцем, где я его хоть в чем-то обвинил? :)
← →
Тимохов © (2004-07-14 10:30) [51]
> Piter © (13.07.04 21:30) [20]
Ну сейчас то я не бешусь :))
С благодарностью отношусь к:
1. ЮЗ
2. ИШ
3. АП
Пожалуй все - остальные редко отвечают на дурацкие вопросы.
И вы не перестанете бесится. Возможно, если не будете столько болезненно реагировать узнаете много нового - и меня добавите в этот спискок :)))
← →
Style © (2004-07-14 10:36) [52]
> Где написано, что не будет происходить явной проверки???
> Что все соптимизируется??
Еще раз, все приведения делаются на свой страх и риск!! (повторяю Jack128)
Если уже и произошло приведение типов,
Button := TButton(Edit);
то там одному богу только известно, что произойдет далее в программе.
Это равносильно тому, что и в игровой автомат, вместо 2-х рублей, пивную крышку запихивать. Автомат ругается, нельзя говорит! А мы эту крышку молотком туда забиваем.
Ситуации разные бывают. Можно и некоторое время с Button"ом как с Edit"ом работать пока дело не каснется того, что обращение произойдет к непосредственным свойствам TEdit.
← →
Cobalt © (2004-07-14 10:42) [53]2 Style © (14.07.04 10:14) [48]
Проверка - это проверка. И отсутствие её не может быть оправдана ничем. А то, что мы видим - это похоже на оптимизацию (которой здесь быть не должно).procedure TForm1.Button1Click(Sender: TObject);
var
btn : TControl;
begin
btn := Pointer(TEdit.Create(nil));
if btn is TButton then
TButton(btn).Parent := self;
end;
Вот тут есть проверка.
← →
Style © (2004-07-14 10:47) [54]Тут все правильно:
Зачем проверять Btn: TButton если он и так TButton.
А то что ты туда Edit подсунул - это твои проблеммы.
← →
Style © (2004-07-14 10:55) [55]В принципе вот так пройдет проверка.
var
btn : TButton;
begin
btn := Pointer(TEdit.Create(nil));
if TObject(btn) is TEdit then
TButton(btn).Parent := self;
← →
Тимохов © (2004-07-14 10:58) [56]Подумав надо сообщение Питера решил подвести свое резюме.
Питер сказал по сути две вещи:
1. Почему так неочевидно работает кодprocedure TForm1.Button2Click(Sender: TObject);
var
btn: tbutton;
begin
btn := Pointer(TEdit.Create(nil));
if btn is TButton then
TButton(btn).Parent := self;
end;
2. Почему неустойчиво работает кодvar
frm : TForm;
i: integer;
Flag: boolean;
begin
for i:=0 to 10000 do
begin
frm := TForm.Create(nil);
frm.Free ;
Flag := frm is TForm1 ;
end;
end;
Позвольте провести исследование.
1. В п1 надо решить два вопроса - почему работает неочевидно и почему вообще работает (я бы не тесрируя сказал, что будет av). Начем со второго - почему нет av. Все очень просто - у tedit и tbutton общий предок - tcontrol, который содержит parent. Даже несмотря на то, что setparent virtual - все работает - т.к. и у tbutton и у tedit этот метод и сам fparent на одном месте в vmt и памяти соответсвенно.
По поводу второго - неочевидного поведедения is. Вполне согласен, что поведение неочевидно. Согласен также в Григорьевым Антоном, что это достойная статься (или заметка) на королевство в обозначенный раздел. Объяснить почему так - тоже не сложно. Очевидно, что is является не просто функцией, а директивой, обладающей свойством compiler magic. Обладание compiler magic я и раньше замечал, но не до такой степени. Поэтому несколько лет назад и перестал ей пользоваться - только inheritsfrom - он не врет.
2. По п2. Нет смысла тестировать этот код. Очевидно, что работоспособность приведенного кода зависит от огромного количества факторов. Очевидно лишь одно - этот код ошибочен. Объясню почему. Посмотрите на п1 моего ответа. Я сказал про compiler magic операции is. И в первом примере Питера (где TFrom1) и во втором (где TForm) is трансформируется в вызов методов из frm (isclass). В одном случае ошибка усть, в другом нет - это везение. Другой вопрос, если бы код переписать такvar
frm : TForm1;
i: integer;
Flag: boolean;
begin
for i:=0 to 10000 do
begin
frm := TForm1.Create(nil);
frm.Free ;
Flag := frm is TForm1 ;
end;
end;
В этом случае на строчке Flag := frm is TForm1 сработает указанный мной compiler magic. И никаких вызовов не будет.
Итоговое резюме - понимаю почему Piter так реагирует - открыл новость, а никто не одобряет. Piter, спокойнее, все сказано выше. :)))
PS. Piter! Я уверен, что вы будете удовлетворены вниманием уделенным мной вашему вопросу. Я бы и вчера это смог написать - домой надо было. Если обидет прошу прощения.
ЗЫЫ. На протяжении всего поста вы меня превратно понимали.
ЗЫЫЫ. По поводу свойства compiler magic операции is. Сами понимаеете, что данное свойство не являтеся документированным. В дельфи таких штук полно. Например таже функция Dispose - тоже compiler magic. И тоже не все это знали. Я тоже долго возмущался - почему никто не хочет меня слушать.
Однако сделал из этого всего вывод - compiler magic можно постичь только изучая cpu. И если кто-то этого не знает - значит он и без этого знания живет хорошо. И горячится перестал.
← →
Тимохов © (2004-07-14 11:01) [57]
> Григорьев Антон © (14.07.04 09:59) [47]
> Продолжаю настаивать на том, что если укзатель указывает
> на TEdit, ожидаемое поведение is TButton для этого указателя
> - вернуть False, независимо от объявленного типа указателя.
с этим нельзя не согласится.
← →
Style © (2004-07-14 11:05) [58]Еще раз ИМХО!
Зачем проверять лишний раз то что
TObject(Object) is TObject = true;
Это изврат!!!
Is используют если для других целей
Object is TStrings
или
Object is TComponent
Вот в этом есть еще какой-то смысл.
А использовать Is для самого себя - безсмысленно...
А вот почему происходит оптимизация в этом моменте даже когда я Оптимизацию Отключил - вот это уже интересно. :)
← →
Тимохов © (2004-07-14 11:08) [59]
> А вот почему происходит оптимизация в этом моменте даже
> когда я Оптимизацию Отключил - вот это уже интересно. :)
это не оптимизация - это магия компилятора. Он часто такие вещи делает не обращая внимания на опцию опитмизации. Т.е. это свойство компилятора как такового.
← →
Тимохов © (2004-07-14 11:12) [60]
> да? А не случится такого прикола, что я здесь тоже буду
> прав во всех утверждениях? Ты не подумал?
во всех не окажешся.
в некторых да.
а я (лично) тебе вообще противоречил в утверждениях, в которых ты оказался прав? Ткни, что ли.
ЗЫ. Еще раз повторю - зря ты про exe. Exe должне грузится - если он не грузится, то это особенность компилятора дельфи, которую не в состоянии постичь ни сам, ни читая матчасть.
PS. Попрошу выделенную жирным фразу не убирать в случае возврата к теме exe. :)))
← →
Style © (2004-07-14 11:17) [61]
> Тимохов © (14.07.04 11:12) [60]
> Piter © (14.07.04 01:37) [42]
Ой ребята только не ругайтесь :)
← →
Тимохов © (2004-07-14 11:19) [62]
> Style © (14.07.04 11:17) [61]
да, кто ругается.
просто он воторой раз вырезал фразу из контекста.
я его поправил :))))
← →
DiamondShark © (2004-07-14 12:02) [63]
> Piter © (14.07.04 01:37) [42]
"Дядя Петя, ты дурак?" (ц) кинофильм.
Общее правило работы со ссылками: после освобождения ссылки единственная допустимая к ней операция -- присваивание нового значения.
Ты так и не объяснил, в чём тебе видится смысл в каких-то проверках после уничтожения экземпляра.
← →
Тимохов © (2004-07-14 12:05) [64]
> Ты так и не объяснил, в чём тебе видится смысл в каких-то
> проверках после уничтожения экземпляра.
ну думаю смысла автор и не видит и понял все свои ошибки (об этом он явно сказал), просто вынес на суд общественность открытый им факт магии компилятора в отношении директивы is.
PS. Вообще говоря интеренсный вопрос. Знает ли кто-нибудь статьи (можно на английском), посвященные магии компилятора дельфи? Очень интересно было бы прочесть.
← →
DiamondShark © (2004-07-14 12:08) [65]
> Григорьев Антон © (14.07.04 09:59) [47]
Да продолжайте настаивать хоть на том, что земля плоская!
С каких таких мухоморов указатель, объявленый как TButton может принять значение, не являющееся наследником TButton?
← →
Aldor_ (2004-07-14 12:43) [66]> С каких таких мухоморов указатель, объявленый как TButton может принять значение, не являющееся наследником TButton?
Я, конечно, по сравнению с Вами новичок, но какое отношение is и as имеют к объявлению? Ведь можно написать и TObject(AnyPointerVariable) is ..., а там уже смотрится, куда ссылается указатель (по-моему, в книге Марко Кэнту is и as даже приписывались к RTTI).
Поправьте меня, если я не прав.
← →
Cobalt © (2004-07-14 13:02) [67]После некоторых опытов с Дельфями, уяснил для себя следующую вещь:
1) Если переменная некоторого класса (var1
) проверяется на
var1 is It"sClassTypeOrOneOfParentClassType
,
то IsClass не вызывается - просто проверяется, assigned ли эта переменная.
2) Если проверяется на
var1 is It"sClassTypeDescendent
,
то тогда вызывается IsClass.
3) При попытке проверить на
var1 is SomeOtherClassType
при компиляции ругнётся.
4) При попытке привести кSomeOtherClassType
или присвоить ей явно объект типаSomeOtherClassType
также ругнётся при компиляции.
5) Если присваивать переменной фигню типаPointer(bla-bla-bla)
- это уже твоя головная боль - делай общего предка, и баста! (если хочешь нормально работать, а не воевать с классами)
Вроде ничего не упустил?
← →
Тимохов © (2004-07-14 13:05) [68]
> Вроде ничего не упустил?
вроде как.
← →
Piter © (2004-07-14 13:36) [69]Sergey Kaminski (14.07.04 6:32) [43]
Не смущает, что в таком случае AV будет всегда? Независимо "от версии Делфи". И количества итераций
НЕ смущает! Потому что ты указал ссылку НЕ на экземпляр класса, а на ЧЕРТ ЗНАЕТ ЧТО! Получил AV в программе! Задумался, оттрасировал программу, нашел ошибку, понял, исправил!
А вот тебя не смущает, что "ЛОГИЧНЫЙ" Is вернет TRUE в этом случае? Не кажется, что логика программы может пойти неправильным путем? Ибо указатель на хрен знает что признается указателем на TButton?
Style © (14.07.04 9:14) [45]
Если интересно, то напиши после Is еще одну строчку например
if Flag then Caption := IntToStr(integer(Flag));
и поставь там тоже BreakPoint. Вызов IsClass произойдет раньше чем if Flag...
Странно ты проверяешь. Мало ли что раньше, что позже. Ты должен установить брекпоинт на строчке с IS, а потом нажать F7 - если произойдет вход в функцию IsClass - значит, она вызывается.
Хорошо, ты можешь поставить брекпоинт на строчке с IS, нажать CTRL+SHIFT+C и привести код в асме?
DiamondShark © (14.07.04 12:08) [65]
С каких таких мухоморов указатель, объявленый как TButton может принять значение, не являющееся наследником TButton?
очевидно с каких. Из-за приведения типов. И даже не говори, что это не корректно. Буду обращаться с переменной, объявленной как TButton в контексте TEdit и никогда не получу AV. Потому как что TButton, что TEdit являются обычными Pointer, указателями на структуру, на область памяти. А что там хранится... это и есть задача Is :)
KSergey © (14.07.04 8:48) [44]
Предлагаю не обсуждать вызовы каких-либо методов, операторов и проч. после Free. Очевидно, что это идиотизм чистейшй воды работать с дикими указателями
согласен. Просто было жутко интересно почему не возникает AV у меня... ну просто мне интересно... ведь я проводил миллион итераций и никаких AV, ничего! Мне кажется это удивительным. Я не спорю, что неправильное обращение к любому участку памяти не всегда приводит к AV, может и "прокатить"... но миллион раз?! Мне кажется что миллион раз это слишком...
Cobalt © (14.07.04 9:28) [46]
Вот тебе цитаты из хелпа
The is operator
The is operator, which performs dynamic type checking, is used to verify the actual runtime class of an object
Да, да, я согласен! Но ведь в моем примере под пунктом 1 btn является вполне себе актуальным указателем! Правда, указывает на TEdit - но ведь иструкции хелпа не нарушены.
Style © (14.07.04 10:36) [52]
Это равносильно тому, что и в игровой автомат, вместо 2-х рублей, пивную крышку запихивать. Автомат ругается, нельзя говорит! А мы эту крышку молотком туда забиваем
ОТЛИЧНОЕ СРАВНЕНИЕ! Да, мы туда запихиваем крышку молотком и при этом автомат принимает эту крышку за монету! Понимаешь, в чем дело?
Я говорю про то, что автомат в любом случае, даже если в него впихнули пивную крышку НЕ должен принять ее за монету. Он может сломаться, но он не должен принять крышку за монету, понимаешь?
А ты говоришь, что нет, у автомата есть прорезь именно для монеты. И в эту прорезь не войдет пивная крышка при обычных условиях. Поэтому и нефига проверять, монета или не монета - если влезло, значит монета.
Но как ты понимаешь это может оказаться не монета :) Если поработать молотком.
Так вот тут тоже самое. Мы поработали молотком и Дельфи принял нашу пивную крышку за монету. Хотя теоретически мог быть устроен так, что должен был в любом случае проверять - а действительно ли это монета? Вот об этом мы и говорим.
Тимохов © (14.07.04 10:58) [56]
я полностью согласен с твоим постом. Абсолютно.
Итоговое резюме - понимаю почему Piter так реагирует - открыл новость, а никто не одобряет
ну типа того. И не то, что не одобряет. Ладно бы всем присутствующим это было абсолютн очевидно - промолчали. Ну ладно, подумаешь. Я действительно открыл для себя неочевидное поведение Is. Что же тут такого...
Но появляются люди, которые говорят "ты дурак". Читай хелп и снизойдет на тебя просветление. Это раздражает. Между прочим, я потратил немало времени разбирая эту проблему.
Плюс есть еще люди, которые говорят, что на самом деле именно такое поведение Is очевидно. Тут я просто не согласен. Ну не могу я назвать поведение очевидным, когда по сути экземпляр TEdit признается за TButton.
Однако сделал из этого всего вывод - compiler magic можно постичь только изучая cpu. И если кто-то этого не знает - значит он и без этого знания живет хорошо. И горячится перестал
а вот не надо делать плевков в мою сторону :) Я то как раз смотрел CPU и говорил об этом. И собственно поведение IS я объяснил еще на первой странице топика, собственно по этому поводу и неудомевал - почему не происходит вызова IsClass?
В общем ф-у-у-у )
Можно подвести итоги.
Название ветки неправильное. Тут я ошибался. IS может быть опасным как для форм, так и не для форм. Тут дело в непонятной мне работе менеджера памяти Дельфи.
По пунктам:
1) думаю, большинство признало, что IS должен вызывать IsClass в любом случае, пусть даже ценой AV в некоторых случаях (ошибка в программе хоть вскроется быстрее).
Ибо сейчас он может "признать" что угодно любым классом. Это неочевидно (по крайней мере, многие так считают).
2) Примеры неправильные - это я знаю. Ну просто интересно мне - почему даже при миллионе итераций ошибок нет. Ну не бывает такого везения. Хотелось бы копнуть поглубже, но там код на асме, а я его понимаю с трудом (считай, не понимаю).
← →
Aldor_ (2004-07-14 13:41) [70]Cobalt © (14.07.04 13:02) [67]
Оказалось, что я не прав, спасибо за разъяснения.
← →
Тимохов © (2004-07-14 13:44) [71]
> Мне кажется что миллион раз это слишком...
почему?
если в памяти ничего не менялось, то хоть через 10^10 итераций не будет av.
> Но появляются люди, которые говорят "ты дурак
такого тебе никто не говорил. :)))
> а вот не надо делать плевков в мою сторону
вы определенно на взводе :)))) много трактуете настолько превратно, что даже пояснять не хочу :)
> Ну не бывает такого везения
если прыгать с пятого этажа на батут при неизменность положения батута, пятого этажа, ветра, угла притяжения, сонечной активности, плотности воздуха - очевидно, что всегда будешь падать на батут :)
что тут не ясно? :)
← →
Тимохов © (2004-07-14 13:49) [72]Забыл прокомментировать это
> 1) думаю, большинство признало, что IS должен вызывать IsClass
> в любом случае, пусть даже ценой AV в некоторых случаях
> (ошибка в программе хоть вскроется быстрее).
Я не признал, и признавать не собираюсь.
Сломать можно, что угодно если отходить от правил. Да, может болланд виноват, что не совсем хорошо в данном вопросе отработал "защиту от дурака". Но все же не его вина в таком поведении.
Я могу привести массу примеров работы с интерфейсами, когда невинный код приводит не всегда даже к av, иногда к privileged instruction. Что с этого - interface сделаны не верно.
ЗЫ. Когда я упомянул про тему "Грустно - как окрепло ламертсво" думаю, вы меня не верно поняли. Вы помните о чем там было. Суть была такая, что автор после прочтения статьи о числах начал обвинять борланд. Я НЕ имел в виду сказать вам, что вы л. Я хотел сказать, что поспешные (чисто по времени осмысления, а не по глубине :))) суждения бывают силишком эмоциональные. Не в меру. :)))))
← →
STYLE © (2004-07-14 13:59) [73]
> Странно ты проверяешь. Мало ли что раньше, что позже. Ты
> должен установить брекпоинт на строчке с IS, а потом нажать
> F7 - если произойдет вход в функцию IsClass - значит, она
> вызывается.
В том примере вызов IsClass происходит
Piter © (14.07.04 00:06) [32]
Call IsClass...
> ОТЛИЧНОЕ СРАВНЕНИЕ! Да, мы туда запихиваем крышку молотком
> и при этом автомат принимает эту крышку за монету! Понимаешь,
> в чем дело?
Я говорил про то, что автомат сломался и принял эту пивную крышку, и что мы туда ее силой (молотком) запихали.
Так вот в вашей ситуации молотком является - приведение типов.
← →
Тимохов © (2004-07-14 14:01) [74]в сравнении с автоматом поддерживаю style.
если по автомату долбануть хорошо - то он и песни запоет и станцует лишь бы не били.
заяц "да слон, я слон, только сапогами по голове не бейте" (с) Анекдот.
← →
DiamondShark © (2004-07-14 14:09) [75]
> Aldor_ (14.07.04 12:43) [66]
> > С каких таких мухоморов указатель, объявленый как TButton
> может принять значение, не являющееся наследником TButton?
>
> Я, конечно, по сравнению с Вами новичок, но какое отношение
> is и as имеют к объявлению?
Прямое. Их область определения так введена.
> Ведь можно написать и TObject(AnyPointerVariable)
> is ..., а там уже смотрится, куда ссылается указатель
Можно. Можно и TObject(12345) написать. Только чьи это проблемы?
> (по-моему, в книге Марко Кэнту is и as даже приписывались к RTTI).
Верно, is и as и есть документированый механизм работы с RTTI.
А теперь внимание, вопрос. Каким образом определить, сослался ли указатель на структуру RTTI, просто на какой-то кусок памяти, или вообще за пределы адресного пространства?
Ответ: никаким.
← →
Cobalt © (2004-07-14 14:37) [76]2 Piter © (14.07.04 13:36) [69]
Ты согласен, что Cobalt © (14.07.04 13:02) [67] - вполне разумные ограничения?
← →
Sandman25 © (2004-07-14 14:46) [77]type
TOne = (Zero);
procedure TForm1.FormCreate(Sender: TObject);
var
One: TOne;
begin
One := TOne(5);
ShowMessage(IntToStr(Ord(One)));
end;
ИМХО, из той же серии. $R+, $Q+ не выявляют никаких ошибок.
← →
Piter © (2004-07-14 14:56) [78]Тимохов © (14.07.04 13:44) [71]
если прыгать с пятого этажа на батут при неизменность положения батута, пятого этажа, ветра, угла притяжения, сонечной активности, плотности воздуха - очевидно, что всегда будешь падать на батут :)
понимаю, что вы хотите сказать. Только почему в D5 "положение батута, пятого этажа, ветра, угла притяжения, сонечной активности, плотности воздуха" изменяется, а в D6 и D7 нет? Вот в чем вопрос. Да, вопрос может и не имеет практического применения. Но есть такое понятие как любопытство. Мне просто интересно почему.
>если в памяти ничего не менялось, то хоть через 10^10 >итераций не будет av
так вот почему в памяти D7 и D6 ничего не меняется, а в D5 меняется.
Тимохов © (14.07.04 13:44) [71]
> Но появляются люди, которые говорят "ты дурак
такого тебе никто не говорил. :)))
ну ладно, намекали :)
>"Дядя Петя, ты дурак?" (ц) кинофильм
Тимохов © (14.07.04 13:49) [72]
>думаю, большинство признало, что IS должен вызывать >IsClass
Я не признал, и признавать не собираюсь
ну что же :) Я понял :) Не думай, что я страдаю паранойей, просто очевидно, что когда о проблеме говорю я - ты ее не признаешь проблемой (считаешь, что уровень твой выше моего, поэтому я не могу выдвинуть проблем о которых ты не знаешь).
Потому что ты только что написал, что не признаешь такое поведение Is НЕОЧЕВИДНЫМ.
И в тоже время:
Тимохов © (14.07.04 11:01) [57]
> Григорьев Антон © (14.07.04 09:59) [47]
> Продолжаю настаивать на том, что если укзатель указывает
> на TEdit, ожидаемое поведение is TButton для этого указателя
> - вернуть False, независимо от объявленного типа указателя.
с этим нельзя не согласится.
И в тоже время ты согласен с Григорьевым Антоном, который считает, что поведение is неочевидно, ибо он должен вернуть false, а возвращает true.
Или говоря по другому. Когда я говорю, что поведение is неочевидно - ты со мной не согласен. Когда Антон говорит, что поведение is неочевидно - ты пишешь, что с
этим нельзя не согласиться!!!
А потом сам же пишешь что не согласен :)))
Я абсолютно не на взводе, я уяснил что к чему и сейчас мною движет просто любопытство. Я ничего не придумывал, я просто цитировал твои фразы. Ты явно говорил, что согласен с Антоном и также явно говорил, что не согласен со мной. Хотя мы с Антоном говоим одну и туже вещь - поведение IS не всегда неочевидно :)
Очень интересно что ты скажешь. Так сказать, хотелось бы услышать комментарий :)
← →
STYLE © (2004-07-14 15:00) [79]Мастера, где же вы???? Разъясните проблемму :)
← →
KSergey © (2004-07-14 15:10) [80]> Cobalt © (14.07.04 13:02)
По-моему, очень хороший пост.
И на мой взгляд, в хелпе это не написано. Хотя и не буду настаивать, не очень силен.
Страницы: 1 2 3 4 вся ветка
Текущий архив: 2004.08.01;
Скачать: CL | DM;
Память: 0.68 MB
Время: 0.041 c