Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.23.16. Событие OnFormClick (для формы)

Штатным образом событие OnClick не срабатывает для формы. Это объясняется тем, что OnClick срабатывает в ответ на команду выбора, что совсем не одно и то же, что щелчок клавиши мыши. Т.е. для большинства оконных контролов щелчок клавиши мыши приводит к отправке команды этому оконному элементу или его под-элементу, но, вообще говоря, команда выбора может быть оправлена и в результате нажатия определенных клавиш, например, пробела (на кнопке) или мнемокода, назначенного элементу. Команда - это оконное сообщение WM_COMMAND или WM_NOTIFY с соответствующим кодом нотификации NM_CLICK (и то же самое касается пунктов меню), в результате чего и срабатывает событие OnClick «по правилам» ОС Windows. Но форма, как легко догадаться, контролом не является, и щелчок по ней не приводит к отправке такого сообщения.

Тем не менее, обработать событие OnClick для формы возможно, если назначить его присваиванием адреса обработчика события свойству OnFormClick (в отличие от OnClick). Для формы обработка сообщения OnClick выполняется только в результате нажатия на ней (на области, свободной от дочерних визуальных элементов) клавиши мыши.

В случае использования MCK, в Инспекторе свойств объекта продолжает отображаться для формы только событие OnClick, но при генерации кода объектом TKOLForm обеспечивается присваивание значения именно событию OnFormClick – в случае формы. Т.е., технически в случае MCK оба эти события эквивалентны для формы.

Имеется особенность использования события OnClick для формы, которая проявляется при двойном щелчке по форме. А именно, OnClick вызывается дважды – по одному разу для каждого щелчка. А если назначить оба события (OnformClick и OnMouseDblClk), то события будут вызваны для каждого двойного клика в следующем порядке: OnClick, OnMouseDblClk, OnClick.

2.23.17. Справочная система

HelpPath - строка пути к файлу справки в формате WinHelp с расширением .hlp, для использования справочных файлов в формате HtmlHelp (*.chm) необходимо использовать глобальную процедуру AssignHtmlHelp;

OnHelp - событие для формы, срабатывает, когда нажата клавиша F1 или справка запрошена щелчком по специальной пиктограмме, и затем мышью нажат визуальный элемент на форме. Обработчик события получает контекст вызова справки (и может его динамически изменить);

CallHelp( i, C ) - метод формы или Applet'а, может быть вызван для выдачи справки по визуальному элементу с заданным контекстом. По умолчанию, используется справочный файл в формате WinHelp, для использования справки в формате HtmlHelp предварительно следует вызвать процедуру AssignHtmlHelp.

2.24. Программирование в kol (без mck). Создание формы и запуск цикла обработки сообщений.

Для того, чтобы начать проектировать "чистый" проект KOL (т.е. без MCK), достаточно создать проект как обычно, и удалить из него первый модуль с формой. После чего, в файле проекта удалить из uses ссылку на Forms и все другие модули VCL (заменив их ссылкой на KOL), а из тела кода проекта begin ... end. удалить все строки (их там две, и они обращаются к Application для инициализации и запуска приложения). Теперь можно добавить первые строки кода:

Applet := NewForm( nil, 'заголовок формы' ); Run( Applet );

Это и есть минимальное приложение с формой на KOL. Вы можете попробовать его откомпилировать и запустить. Если у вас что-то не получилось, посмотрите на демонстрационный проект под названием Empty. Если больше ничего не делать, то размер этого приложения в Delphi5 получается 23 Килобайта. Если же в опциях проекта в список путей для поиска добавить путь на папку с заменой системных модулей, а в список символов условной компиляции добавить SMALLEST_CODE и NOT_USE_RICHEDIT, то размер приложения сокращается до 10.5 Килобайт.

О

братите внимание: если вы компилируете проект в Delphi версии 6 или выше, то иногда у компилятора возникает непонятная тенденция добавить в код дополнительные функции из модуля Variants.pas (который появился именно в этой версии впервые). Размер приложения резко возрастает на несколько килобайт, хотя бы даже вы и не использовали варианты. Иногда от этого модуля удается избавиться различными манипуляциями (переоткрытием проекта в Delphi, перезапуском среды, пересборкой проекта). Наиболее эффективный способ заключается в том, чтобы скачать архив FakeVariants.zip, распаковать его (файл Variants.pas, из которого удалено все, что не требуется) в какую-либо директорию и указать путь на нее в опциях проекта. Ну, или просто распаковать его в папку проекта.

Глобальная процедура Run, которая вызывается в вышеуказанном примере, получая в качестве параметра оконный объект, вызывает для него создание окна, после чего входит в цикл ожидания и обработки сообщений. Цикл этот продолжается вплоть до завершения работы приложения (т.е. пока глобальная переменная AppletTerminated не получит значение true). После чего вызывается (если это еще нужно) глобальная процедура TerminateExecution, и на этом приложение действительно завершается.

У программиста всегда есть возможность написать свой собственный аналог процедуры Run, при необходимости, и вызывать именно его. Например, в одном из своих приложений я подменил эту процедуру для того, чтобы в первую очередь обрабатывать сообщения от мыши и клавиатуры, перед прочими оконными сообщениями (иначе при многопоточной работе с повышенным приоритетом начинали возникать проблемы с реакцией на клавиатуру и мышь).

При программировании в KOL без MCK следует обратить внимание на то, каким образом назначать обработчики события. Самый простой способ заключается в том, чтобы создать специальный объект (произведенный от TObj), определить для него метод, соответствующий описанию типа обработчика, и указать этот метод в качестве обработчика события.

Но можно использовать вместо методов и обычные процедуры, превращая их в метод с помощью функции MakeMethod( data, proc ) и не забывая полученный метод привести к требуемому типа обработчика, например:

Button1.OnClick := TOnEvent( MakeMethod( nil, @Button1ClickProc ) );

С

ледует при этом помнить, что в объявление процедуры-обработчика необходимо добавить в качестве первого дополнительный параметр типа указателя. Этот указатель соответствует указателю на экземпляр объекта, то есть здесь будет передан тот самый указатель, который вы назначили в первом параметре в вызове функции MakeMethod. Например, для правильной обработки указанного выше события клика на кнопке заголовок обработчика должен будет выглядеть так:

procedure Button1ClickProc( Dummy, Sender: PControl );

begin

В случае обработчика другого типа, имеющего больше параметров, они так же следуют в обычном порядке, но первым должен быть добавлен аналогичный параметр-пустышка.

2.25. МСК-проектирование