![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Возник вопрос по определению принадлежности объекта к классу, а именно, есть класс:
Как я должен написать в методе TRawClass.Method, чтобы узнать, что Owner является ли класс TSecondClass или классом унаследованных от TSecondClass (т.е. TThirdClass)
Это сообщение отредактировал(а) Delphist - 10.1.2011, 01:22 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 1 Всего: 250 |
см. as
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
is проверяет принадлежность объекта классу или его наследнику, в большинстве случаев этого достаточно. Если нужно отсечь наследников и проверять на точное соответствие, то картина усложняется.
Надёжным вариантом является проверка имени класса, получаемого через метод ClassName, либо проверка напрямую через метод IsClassName. Для того, чтобы не допустить опечаток, можно использовать именованные константы, либо получать имя класса через классовый метод напрямую из нужного класса, что и было продемонстрировано в приведённом коде. Мне было лень это писать, но один голос с оценкой -3 вынудил сделать это. Хотелось бы, чтобы поставивший -3 сделал ответную любезность и обосновал свою позицию. |
|||
|
||||
| superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 4 Всего: 15 |
БелАмор, не напрягайся
Это сообщение отредактировал(а) superVad - 10.1.2011, 10:37 |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Delphist, почитай про операторы as, is, про RTTI.
|
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Поскольку тут пошла речь про as и is, думаю, нелишним будет обратить внимание на несколько неочевидных моментов:
1. is проверяет на приналдежность классу или его наследнику. 2. is предназначен только для поверки принадлежности классу, являющимся потомком по отношению к классу, к которому относится переменная, ссыляющаяся на проверяемый объект. В случаях, когда принадлежность к классу вытекает из типа переменной, компилятор вообще исключает проверку, подставляя True. 3. as предназначен для приведения типа с проверкой только к потомку, но никак не к предку. При попытке приведения типа к предку через as, as игнорируется. В этом случае следует использовать обычное приведение типа. Ссылка: ПРОГРАММИСТ.Нецелевое использование оператора is |
|||
|
||||
| skyboy |
|
|||
|
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 4 Всего: 260 |
||||
|
||||
| Delphist |
|
||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Согласен Добавлено @ 13:49
оператор is делает неправильно оценку для моего случая, т.к. в моем TRawClass Ower is TCustomClass, поэтому вызов
а нужно, чтобы если Owner := SecondClass или Owner := ThirdClass, то вызов if Owner is TSecondClass then (или if Owner is Наследники TSecondClass then) возвращал True как это сделать? Это сообщение отредактировал(а) Delphist - 10.1.2011, 13:59 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||
|
|||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
я и так про них все отлично знаю, еще раз внимательно посмотрите на мой пример -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Не может ли быть такой ситуации, что на момент вызова TRawClass.Method Owner по какой-либо причине равен nil, например, его вызов происходит в конструкторе до присвоения Owner, или по каким-либо другим причинам?
Указывает ли Owner на реально существующий объект в момент проверки? |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
||||
|
||||
| Delphist |
|
||||||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
Да указывает, и это не важно сейчас. Вопрос мой совершенно в другом направлении, я про то, что если написать
и вызвать
то вместо ожидаемого сообщения, будет тишина, хотя когда создавался RawClass в constructor'e TSecondClass, то RawClass.Owner := Self = SecondClass'y Как заставить if Owner is TSecondClass then правильно отрабатывать Добавлено @ 15:55 на примере показал Это сообщение отредактировал(а) Delphist - 10.1.2011, 15:59 -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
||||||
|
|||||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
А если написать:
... то какое имя класса будет показано перед тишиной? Это сообщение отредактировал(а) БелАмор - 10.1.2011, 16:49 |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
TSecondClass Добавлено через 6 минут и 16 секунд Проблема видать возникает что Owner изначально в TRawClass объявлен как TCustomClass, и поэтому даже присвоение Owner := SecondClass, где SecondClass: TSecondClass не помогает is вернет TCustomClass. А вот как это исправить не знаю, единственный вариант, который пока вижу использовать заместо Owner is TSecondClass использовать виртуальную функцию возвращающий Boolean и переопределять ее у наследников. Правда так не хочется делать -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| volvo877 |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 14 Всего: 116 |
, то сообщение есть. Если
- то нету. Так что показывай тестовый пример, иллюстрирующий проблему. Как, что и чем ты инициализируешь... |
||||||
|
|||||||
| БелАмор |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Попытался из приведённого вами кода сделать рабочий пример.
Всё нормально работает. Привожу полный код. D2006. Если у вас не заработет - проблема со средой (обновления и т.д.). Если заработает - ищите отличия со своим кодом. Если не получится - сделайте минимальный рабочий пример, котрый можно откомпилировать и выложите сюда.
Результат - одно сообщение:
|
||||
|
|||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
б..я заработало З.Ы. Я так и не понял в чем фигня была, просто тупо перенабрал свой код и все ок, разницы при это не нашел -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 20 Всего: 58 |
||||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
Вообще, в случае наступления совершенно необъяснимого полтергейста, имеет смысл для начала удалить из каталога проекта все dcu. Кроме того, нужно тщательно следить, чтобы в каталоге не оставалось устаревших версий файлов pas и удалять их сразу, как только они образуются. Имеет смысл периодически проходить по каталогу и проверять его на наличие таких файлов. Случайно сохранившийся где-нибудь uses на старый файл - страшное дело... Одной из возможных причин вашей ситуации могло быть сравнительно недавно выполненное сохранение какого-либо файла через Save As В совсем запущенных случаях рекомендуется удалить всё, кроме pas и dfm (плюс, возможно, чего-то ещё) и создать проект заново, включив в него прежние файлы. Это бывает очень кстати при проблемах в случае открытия проекта в другой версии (особенно - более старой). |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
-------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| БелАмор |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 10.6.2010 Где: Россия Репутация: 5 Всего: 17 |
О чём ещё необходимо помнить:
Если в разных местах объявлены разные классы с одинаковыми именами, то это всё равно разные классы. Если в каком-то месте доступны оба этих класса, то принимается во внимание тот, который упоминается последним. Та ещё засада. Можно создать объект одного типа в одном месте, а потом в другом пытаться проверить его через is на принадлежность к одноимённому, но другому классу, получать закономерный False и недоумевать... В таких случаях полезно вспомнить о полной спецификации: SomeModule.SomeName |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
угу, спасибо, знаем такую фишку -------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
| CodeMonkey |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1839 Регистрация: 24.6.2008 Где: Россия, Тверь Репутация: 38 Всего: 89 |
DLL?
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. |
|||
|
||||
| Delphist |
|
|||
![]() Delphist Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2145 Регистрация: 3.2.2004 Где: всегда в сети Репутация: 2 Всего: 3 |
-------------------- ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др). Когда-то давным-давно использовал это... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |