Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2013, 10:41   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

eval, у вас неправильная справка. AS ничего не проверяет, это просто приведение типа. А вот IS проверяет, если хоть в каком-то колене дерева предков проверяемого объекта есть желаемый класс, оператор IS вернет TRUE.
Человек_Борща вне форума Ответить с цитированием
Старый 27.09.2013, 10:42   #12
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

Код:
то получаем (закономерно!) access vioalation. (см. скриншот)
И где вы увидели AV?
Вы получили EInvalidCast, который возбудил as после того как его проверка показала несоответствие типа.

А вот AV вы получите при простом приведении типа (если вам очень повезет). Чаще всего исключения при неверном приведении типа не будет вообще.

Последний раз редактировалось northener; 27.09.2013 в 10:46.
northener вне форума Ответить с цитированием
Старый 27.09.2013, 10:44   #13
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

Цитата:
AS ничего не проверяет
AS не просто так называется checked typecast
northener вне форума Ответить с цитированием
Старый 27.09.2013, 10:47   #14
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

as возвращает либо ссылку либо nil, вы думаете как он это делает?
правильно через проверку ..
грубо ас делает так
Код:
if x is someclass then result := someclass(x)
else result := nil

Последний раз редактировалось eval; 27.09.2013 в 10:54.
eval вне форума Ответить с цитированием
Старый 27.09.2013, 10:53   #15
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Все равно опасно без IS работать. Лишняя проверка IS упреждает и сводит к 0, вероятность получить EInvalidTypecast а ещё можно своё else прописать.
Человек_Борща вне форума Ответить с цитированием
Старый 27.09.2013, 10:56   #16
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

Цитата:
Все равно опасно без IS работать. Лишняя проверка IS упреждает и сводит к 0, вероятность получить EInvalidTypecast а ещё можно своё else прописать.
А кто говорит что is не нужен сам по себе? Просто в каждом конкретном случае используется тот вариант приведения типа, который наиболее удобен.
northener вне форума Ответить с цитированием
Старый 27.09.2013, 10:59   #17
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Все равно опасно без IS работать.
да ну..
Код:
x := y as tbutton;
if x <> nill then showmessage(x.Caption);
eval вне форума Ответить с цитированием
Старый 27.09.2013, 11:04   #18
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

2 eval
Строчка if x <> nill then showmessage(x.Caption); не будет выполнена в случае несоответствия типов так как предыдущая строчка возбудит исключение упомянутое выше.
northener вне форума Ответить с цитированием
Старый 27.09.2013, 11:10   #19
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

а вы попробуйте
eval вне форума Ответить с цитированием
Старый 27.09.2013, 11:16   #20
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

Цитата:
а вы попробуйте
Сейчас не на чем. На работе Делфи нет. Но вроде уже много раз пробовал. Если y не является ссылкой на tbutton или его наследника, то приведение y as tbutton обязано возбудить исключение EInvalidCast. По крайней мере в Делфи до 2007 включительно.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так, чтобы при наведении мышкой на объект, который находится под другим, этот объект выходил на первый план? Zaza7 HTML и CSS 3 17.01.2013 10:23
Шаблоны - нужно создать объект класса abc в котором вместо aa использовался бы объект класса fff? Farrel Общие вопросы C/C++ 2 13.11.2010 17:37
sender as nark03 Общие вопросы Delphi 5 19.01.2009 17:11
sender as.. nark03 Помощь студентам 2 18.01.2009 16:13
TObject *Sender sergei64_89 Общие вопросы C/C++ 1 06.06.2008 13:36