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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2013, 00:14   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию чудеса наследования в стандартных компонентах

хочется написать очень много матерных слов, но постараюсь изложить проблему вкратце:

есть такой класс - TControl, думаю все знают...
в этом классе есть процедура:

procedure TControl.WMLButtonDown(var Message: TWMLButtonDown);

и в этой процедуре есть просто гениальная строка: inherited;

Может кто-нибудь объяснить, что она наследует?...


Класс TControl наследуется от TComponent:

Цитата:
TControl = class(TComponent)
а в классе TComponent НЕТ процедуры WMLButtonDown

буду очень признателен!
xrob вне форума Ответить с цитированием
Старый 30.05.2013, 00:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

http://www.transl-gunsmoker.ru/2011/...inherited.html
Цитата:
Если же метод базового класса является абстрактным, либо же базовый класс вообще не содержит метода (для не виртуальных методов), то вызов inherited становится noop (No-Operation - пустым оператором). Компилятор не генерирует для него кода (и поэтому вы не можете поставить на него точку останова). Этот механизм является частью отличной версионной устойчивости языка Delphi.
Наверное, это сделано для того, чтобы если в будущем она (функция) появится, то не пришлось перелопачивать весь код, вписывая inherited.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 30.05.2013 в 00:37.
BDA вне форума Ответить с цитированием
Старый 30.05.2013, 00:56   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
и в этой процедуре есть просто гениальная строка: inherited;
Передает сообщение по цепочке. Ничего гениального. Если убрать, где-то что-то не обработает клик мышкой.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2013, 11:54   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Человек_Борща, я примерно понимаю что такое inherited и сам много раз осмысленно им пользовался.
но вот в этом конкретном случае все было бы ништяк, если не одно "но":
Цитата:
вызов inherited становится noop
таким образом мы подтверждаем мои интуитивные догадки, о том,
что если в базовом классе нет такого метода, то вызов inherited ни к чему не приведет.

в таком случае логично ли утверждать, что если этот inherited ни к чему не приводит -
то его можно просто закомментить и это никак не скажется на результате?
xrob вне форума Ответить с цитированием
Старый 30.05.2013, 14:38   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

xrob, не для ООП в этом случае inherited написан.
Просто сообщение идет дальше по цепочке оконных сообщений, подразумевается DispatchMessage.

Возьмите закомментируйте, и перекомпилируйте VCL, и полюбуйтесь на глюки.

Цитата:
Наверное, это сделано для того, чтобы если в будущем она (функция) появится, то не пришлось перелопачивать весь код, вписывая inherited.
Скорее всего так и есть. Delphi, VCL и RTL не дураки писали.

Последний раз редактировалось Человек_Борща; 30.05.2013 в 14:40.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2013, 14:53   #6
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Человек_Борща, да, меня это и напрягало, что inherited здесь якобы ничего не значит,
но если его закоментить, потом неправильно работают компоненты...
вот и возникает вопрос - получается какую-то роль он все-таки играет.

ps: я тут ковыряю ComboBox, пытаюсь найти место, в котором у него список раскрывается...
путем нехитрых манипуляций с ShowMessage удалось выяснить что это происходит в inherited у TControl.WMLButtonDown.
теперь я в тупике...
xrob вне форума Ответить с цитированием
Старый 30.05.2013, 17:37   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
Человек_Борща, да, меня это и напрягало, что inherited здесь якобы ничего не значит,
но если его закоментить, потом неправильно работают компоненты...
вот и возникает вопрос - получается какую-то роль он все-таки играет.

ps: я тут ковыряю ComboBox, пытаюсь найти место, в котором у него список раскрывается...
путем нехитрых манипуляций с ShowMessage удалось выяснить что это происходит в inherited у TControl.WMLButtonDown.
теперь я в тупике...
не забывайте что многие стандартные компоненты используют сабклассинг от стандартных виндовых оконных классов, а не сами все делают.

inherited в случае сообщений означает или передать классу-предку обработку, или функции DefWindowProc, то есть винде(а точнее порою стандартному классу окна).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чудеса с printf BrookBond Общие вопросы C/C++ 9 10.03.2013 23:28
иерархия наследования WizarD.89 Общие вопросы по Java, Java SE, Kotlin 1 07.11.2012 23:31
Класс наследования wwe2012 Общие вопросы C/C++ 0 02.04.2011 09:41
Чудеса Vikenty Свободное общение 10 14.10.2010 20:27
Чудеса в Borland C++ 3.1 LightWarrior Общие вопросы C/C++ 5 06.01.2010 03:37