![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Вот возникла проблемка с вызовом TStringGrid->DrawCell() ,
а ставить RxLib не хочется... Наверное, придется иметь дело с __closure ... Тоже, конечно, вариант. И править и перекомпилировать VCL тоже не хочется... |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
RTTI работает только с Published
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Medved |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 7209 Регистрация: 15.9.2002 Где: Kazakhstan, Astan a Репутация: нет Всего: 154 |
Совершенно согласен с Витом.
Но можно получить доступ в другом модуле к полям и свойствам, объявленым в published. Для этого необходимо создать дочерний класс, на основе интересующего класса, и тогда уже, можно будет в своем модуле обращаться напрямую к тому, что объявлено в Published у родительского класса. -------------------- |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Про дочерний класс - это понятно.
А хотелось бы работать напрямую с компонентом. Надеялся, что через RTTI можно доступиться не только к published. Какой-то такой намек где-то я в help'ах видел. Эх, придется все же установить Rx ;(( |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
До protected метода можно добраться точно также, как описано в FAQ
Как добраться до protected свойства |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Предыдущий пост мой
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Добраться можно, но RTTI работать так не будет... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
А причем тут RTTI. Это стандартный сиплюсплюсный прием.
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
А ты тему вопроса на всякий случай прочитай! Автор спрашивает именно про RTTI, а не о любом доступе... -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Спасибо за ссылку на статью о том как добраться до protected - свойства.
Интересная мысль, хотя и вправду несколько незаконно. Ну а как подобным же макаром добраться до protected - метода ? |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Так ребята, признаю свою ошибку, погорячился. Добраться до проперти легче, чем до метода. Но здесь нас выручит то, что метод DrawCell() виртуальный.
Вообще -то, то что я сейчас напишу совсем противозаконно, и заниматься этим не рекомендую Итак
Собрав данный проект, нажимаю на кнопку и получаю сообщение "А protected method всетаки вызвался". Что нам собственно и требовалось Примечание Adminy: Уже достало. Если есть двойное подчеркивание, то поглатываются куски текста -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Круто.
Но незаконно-о А ты, кстати, не знаешь, на многих ли компилерах такое проходит ? Это сообщение отредактировал(а) Crait - 27.2.2003, 00:24 |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Это чистый С++. Так что по идее должно пройти везде. Я стандарт не нарушал, а лишь сделал
рисковое преобразование, которое, кстати, мог выполнить и вот таким образом (без присвоения)
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Crait |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 244 Регистрация: 20.2.2003 Репутация: нет Всего: 1 |
Стандарт не нарушал...
Насчет синтаксиса преобразования - не сомневаюсь, но для срабатывания обсуждаемого механизма необходимо, чтобы индексы, соответствующие DrawCell, были одинаковыми для VMT обоих классов. Хотя конечно TPublicGrid и произведен от TStringGrid, но какой-нибудь очень умный линкер может просечь, что для экземпляров TPublicGrid кроме DrawCell ничего особо не вызывается, т.к. в программе нет указателей TStringGrid*, которым бы присваивался адрес экземпляра TPublicGrid, так что можно и сократить VMT у TPublicGrid, убрав оттуда все лишнее (де-виртуализировать часть методов. Чтобы быстрее вызывались Это сообщение отредактировал(а) Crait - 27.2.2003, 02:14 |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Это было бы очень странно и являлась бы ошибкой компилятора. Очень часто делают наследование, чтобы именно и переопределить какую-либо виртуальную функцию. Если выключить виртуальность, в то нормальном стандартном случае я получу не то что хочу
В коде расположенном ниже все законно и должен вызваться TPublicGrid::DrawCell(). На минуту для простоты представим, что DrawCell() не protected у TStringGrid
По стандарту при вызове SGrid->DrawCell() должен быть вызван TPublicGrid::DrawCell(). А если предположить, что компилятор "де-виртуализирует" TPublicGrid (хотя я не понимаю, как это может быть), то в этом случае вызовется TStringGrid::DrawCell(), что противоречит стандарту. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |