|
||||||||
|
Приложение и среда его выполнения. Объект Application
TApplication = class(TComponent) На уровне методов и свойств этого компонента осуществляется управление выполняемым приложением. Он отсутствует в Палитре компонентов, и все его свойства должны изменяться из программы. Поводов для обращения к TApplication может быть два. Во-первых, это получение информации о приложении, общей для всех ее форм. Во-вторых, это управление процессом выполнения приложения и входящими в него формами. Эти методы тесно связаны с Windows, и работа с многими из них требует определенного опыта. К информационным могут быть отнесены следующие свойства:
Теперь рассмотрим методы и свойства в последовательности, соответствующей "жизненному циклу" приложения. При запуске на выполнение Application сначала создает и инициализирует формы приложения при помощи метода:
Параметр Reference будет указывать на созданный экземпляр формы класса FormClass. С обращений к этому методу начинается код, содержащийся в файле с расширением .DPR; при этом в нем создаются только те формы, которые содержатся в списке Auto-Create Forms в опциях проекта. Метод работает таким образом, что в случае, если указатель на главную форму равен nil, то созданная форма становится главной. Из этого следует, что главной всегда будет первая из создаваемых форм. Указатель на нее описан в свойстве:
Здесь нужно сделать специальную оговорку. Помимо главной и других форм у приложения есть еще одно ? невидимое ? окно. Именно оно является по-настоящему главным и именно в нем обрабатываются все сообщения Windows, управляющие состоянием приложения. Его дескриптор доступен в свойстве:
После создания всех форм метод
запускает цикл обработки сообщений главной формы приложения. Его код очень прост и выглядит следующим образом:
Вызываемый в нем метод
извлекает следующее сообщение из очереди и передает его на обработку следующим образом:
Метод ProcessMessage ищет нужный обработчик сообщения и передает ему управление. Назначение метода Idle поясняется ниже. О поступлении сообщения оповещает вызов обработчика события:
Используя обработку OnMessage, программист может переопределить обработку любого (или любых) сообщений (кроме WM_QUIT и сообщений системы оперативной подсказки). Для этого, выполнив внутри метода необходимые действия, в параметре Handled нужно вернуть True. Тогда сообщение не поступит в функцию окна приложения. Необходимо быть крайне осторожным, подменяя системные обработчики сообщений. Существует другой способ перехвата сообщений. Для этого нужно написать метод, имеющий следующий тип
и зарегистрировать его в качестве перехватчика сообщений приложения с помощью метода:
Если одна из процедур-перехватчиков типа TWindowHook в цепочке вернет True, это будет означать, что сообщение обработано. Когда необходимость в перехвате сообщений отпадет, созданный вами метод нужно исключить из списка при помощи вызова метода:
Если сообщений в очереди нет, то может быть выполнена "фоновая" работа, предусмотренная программистом. Для этого нужен обработчик события, которое генерируется в этой ситуации внутри метода Idle в HandleMessage:
Обработчик должен вернуть признак потребности в последующих событиях OnIdle в булевом параметре Done. Если "все сделано" и он присваивает Done значение True, то приложение переходит в режим ожидания сообщения и обработчик не вызывается до возникновения следующей ситуации отсутствия сообщений в очереди. Если возвращается значение False, метод будет вызываться все время при отсутствии сообщений. Пример обработки сообщений OnMessage и OnIdle имеется на дискете (название проекта MOVLINES). Их использует программа сохранения экрана, которая вызывается системой по истечении некоторого времени, в обработчике OnIdle она рисует на экране линии и прекращает работу, когда обработчик OnMessage получает сообщение от мыши или клавиатуры. Как видно из приведенного кода метода Run, сообщения обрабатываются вплоть до установки флага:
Такой флаг устанавливается при получении сообщения WM_QUIT. Используя его, можно вставить свои действия на завершающем этапе (после окончания обработки сообщений перед вызовом деструктора Application). Свойство это доступно только для чтения, поэтому завершить приложение можно, вызвав метод
который и посылает сообщение WM_QUIT. Для обработки сообщений предназначен также метод
который возвращает управление тогда, когда обработаны все сообщения в очереди. Пример:
Одна или более форм приложения могут иметь статус fsStayOnTop, то есть постоянно находятся поверх других форм (не имеющих этого статуса). Для того, чтобы на время отключить его действие, применяется пара методов:
? отключает статус;
? восстанавливает его. Эти методы могут быть полезными, когда необходимо вывести информацию поверх формы со статусом fsStayOnTop. В самом объекте Application они вызываются соответственно при деактивизации/активизации приложения, сворачивании/разворачивании главной формы. Активизация и деактивизация происходят тогда, когда пользователь или приложение осуществляют переключение между задачами Windows. Приложение способно отслеживать эти моменты. При активизации и деактивизации приложения возникают события:
Текущее состояние активности можно узнать в свойстве:
События, возникающие соответственно при сворачивании и восстановлении главной формы приложения, также относятся к объекту Application:
Для программного выполнения таких операций есть два метода:
У Application есть метод:
У формы также есть метод с этим названием, который показывает форму поверх остальных и активизирует ее. Отличие этих методов в том, что Form.BringToFront активизирует вызвавшую его форму, а метод Application.BringToFront ? ту форму, которая была активна последней. Во время выполнения приложения могут возникать исключительные ситуации. При их возникновении обработку осуществляет метод:
Стандартная обработка подразумевает вызов метода
который отображает диалоговое окно с именем приложения в заголовке и сообщением об ошибке (содержащемся в параметре ? объекте Е класса Exception). Стандартную обработку можно перекрыть (во всех случаях, кроме обработки исключительной ситуации EAbort), определив обработчик события:
Целый ряд методов управляет системой помощи. Для ее нормального функционирования в первую очередь необходимо, чтобы было определено имя файла помощи в свойстве:
Если оно определено, то вызов помощи можно осуществить тремя видами запросов, которым соответствуют методы:
Все функции возвращают True, если файл Help определен, и произошел вызов приложения WinHelp. Если вы хотите перехватить обращение к справочной системе, то необходимо написать обработчик события:
В нем вы можете предусмотреть предоставление собственной помощи пользователю. Результат True функции означает успех (помощь предоставлена). Если после обработки события по-прежнему нужно вызвать систему помощи Windows (через WinHelp), то в параметре CallHelp нужно вернуть True. Метод
содержит вызов стандартного диалогового окна с тем же названием и назначением. Если вы хотите использовать в составе Delphi и вызывать из форм приложения диалог, созданный с помощью других средств программирования, то дескриптор такого диалога должен быть присвоен свойству:
Подробные правила работы с этим свойством описаны в документации разработчика компонентов Delphi. Наконец, упомянем о системе оперативной подсказки. У приложения имеется собственный текст подсказки, определяемый свойством:
В отличие от подсказок для других компонентов, он не отображается при остановке мыши. Его содержимое обычно передается строке состояния. Целый ряд методов и свойств объекта, отвечающих за реализацию системы оперативной подсказки, подробно описан в соответствующем разделе. Поэтому они здесь только перечисляются:
Для комментария : kadan@grsu.grodno.by | |||||||||||||||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |