![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
Люди! Кто-бы мне объяснил, такую штуку: что происходит, между вызовом метода формы Show и запуском обработчика события формы OnShow (и как я могу проследить цепочку вызовов в исходниках библиотек)
|
|||
|
||||
Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Метод Show всего лишь присваивает св-ву Visible значение true; а метод onShow позволяет произвести какие-то действия в этот момент (например: открыть таблицу или зделать неактивным какой-то компонент).
Отрабатывается между методами onCreate и onActivate Это сообщение отредактировал(а) Cashey - 21.4.2004, 20:57 -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
x77 |
|
||||||||||||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
ты можешь нажать Ctrl и левой кнопкой мыши щёлкнуть на нужный тебе метод, например, Show, и увидишь, как он работает. для Show ты увидишь:
что делает BringToFront - очевидно из названия. следовательно, непосредственно показом занимается Visible := TRUE; это возможно только при одном условии: установка свойства Visible происходит не напрямую, а через соотв. метод, типа SetVisible. так же щёлкаем, и смотрим:
идём в SetVisble. щёлканье здесь уже не поможет, так что проще сделать поиск. смотрим, где она объявлена - в TCustomForm. значит, Ctrl+F, TCustomForm.SetVisible. смотрим, что оно есть из себя:
Первая половина занимается всякой сранью, вторая - связана с новомодной блудней: работой на нескольких мониторах. с версии 5.0 эта блудня поддерживается. остаётся что? inherited. очевидно, что видимой форму делает установка унаследованного свойства Visible. от чего унаследован TCustomForm? щёлкаем (всё также удерживая Ctrl) на ближайшее его упоминание, т.е. в заголовке процедуры, и видим:
ошень афигительно. Ctrl+F, TScrollingWinControl.SetVisible. и получаем балалайку. о чём это говорит? о том, что в TScrollingWinControl это свойство не менялось. значит, надо лезть к его предку, TWinControl. а там тож нифига нету. значит, TControl. делаем поиск и, наконец-то, получаем:
внимание привлекают две вещи: во-первых, VisibleChanging, во-вторых, Perform (..). смотрим по порядку. VisibleChanging, объявленный как динамик, имеет очень умный код:
о чём это говорит? о том, что на уровне контрола он нахрен не нужен, и объявлен динамическим для того, чтобы в методах потомков его можно было переопределить и выполнить в нём что-то осмысленное. значит, ищем его обратно по возрастающей. в TWinControl и TScrollingWinControl пусто. и только в TCustomForm находим:
всё верно, для мди-окон видимость менять нельзя. значит, с эти разобрались, остаётся перформ. это функция, скармливающая окну сообщение api. ищем, где она объявлена, всё тем же кликаньем. находим в Controls.
т.е., это внутреннее сообщение дельфей, а не апишная функция. значит, надо выяснить, что предки формы делают, получая это сообщение. да здравствует поиск! имеем:
так, сорри, зовут на пьянку. в общем, смотришь обработчки в исходниках, и делаешь выводы. альтернативный вариант: пляшешь от самого OnShow. там будет процедурина, типа DoShow, if Assigned (fOnShow) then OnShow (Self) ну и т.д. третий вариант: вызываешь справку. иногда там написано, в какой последовательности происходят события. может быть полезно, чтобы сориентироваться. если не разберёшься, я завтра конкретно отвечу. а вообще - ты молодец. если бы местная братва почаще задавалась детским вопросом "а как оно, собственно, работает?", - половины дебильных вопросов на этом форуме бы не было. так что у тебя есть реальный шанс стать нормальным думающим программером ;) -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
||||||||||||||||||
|
|||||||||||||||||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
Cashey, OnShow - это не метод ;)
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Да, это событие. Да и ладно
![]() ![]() -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
это не событие. это свойство. процедурного типа
![]() -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
youri |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: нет Всего: 16 |
Спасибо, x77. Было интересно почитать.
![]() Не мог оторваться: звали на пъянку - не пошел. (шутка)
Пока до конца не разобрался, так что может еще спрошу что-нибудь. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |