20.1. APPLICATION

Объект Application относится к классу TAppiication и инкапсулирует важнейшие свойства и методы программы как таковой. Он создается автоматически и доступен любой программе. Объект не помещен в палитру компонентов, поэтому его свойства недоступны на этапе конструирования, но становятся доступны при прогоне программы[ Некоторые свойства программы (в том числе ее пиктограмма, сведения о версии и используемом языке) могут устанавливаться с помощью менеджера проекта (опция project | Options и страница Application). ].

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

Ниже описываются некоторые свойства Application для приложения Windows (для приложения Linux объект Application несколько отличается). Опущенные свойства предназначены в основном для прямого обращения к API-функциям Windows.

property Active: Boolean; | Содержит True, если любое окно программы имеет фокус ввода
property BiDiMode: TBiDiMode; | Определяет свойство bidiMode (см. п. 17.12) для программы в целом
property CurrentHelpFile: Strings; | Определяет имя текущего справочного файла
property ExeName: Strings; | Содержит полное имя (с маршрутом доступа) исполняемого файла программы
property HelpFile: String; | Определяет имя файла справочной службы
property Hint: String; | Содержит длинную часть оперативной подсказки
property HintColor: TColor; | Определяет цвет фона ярлычка оперативной подсказки
property HintHidePause: Integers; | Определяет паузу (в миллисекундах) от момента появления ярлычка до его исчезновения
property HintPause: Integer; | Определяет паузу (в миллисекундах) от момента остановки указателя мыши до появления ярлычка
property HintShortPause: Integers; | Определяет паузу (в миллисекундах) появления ярлычка при переходе с одного компонента на другой
property Icon: TIcon; | Определяет пиктограмму программы
property MainForm: TForm; | Определяет главное окно программы
property ShowHint: Boolean; | Разрешает/запрещает показ ярлычков для всех окон программы
property ShowMainForm: Boolean; | Разрешает/запрещает показ главного окна в момент старта программы
property Terminated: Boolean; | Содержит True, если программа должна прекратить работу. Используется в приложениях с интенсивным счетом для контроля необходимости прекращения дальнейшей работы
property Title: String; | Определяет текст под пиктограммой минимизированной программы
property UpdateFormatSettings: Boolean; | Если содержит True, программа автоматически будет учитывать новые форматные установки Windows (например, новый разделитель целой и дробной частей числа) при их изменении в момент работы программы.
property UpdateMetricSet;Boolean; | Если содержит True, программа автоматически будет учитывать новые метрические установки Windows (например, новый системный шрифт) при их изменении в момент работы программы

Методы Application:

procedure BringToFront; | Помещает окно, которое было активным в последний раз, поверх остальных окон
procedure HandleException(Sender: TObject) ; | Осуществляет умалчиваемую обработку исключительных ситуаций. Используется при разработке новых компонентов
function HelpCommand(Command: Word; Data: Longint): Boolean; | Посылает справочной службе команду Command и параметр Data
procedure HandleMessage; | Приостанавливает работу программы до тех пор, пока не будут обработаны все сообщения, после чего создает событие Onidle
procedure CreateForm(FormClass: TFormClass; var Reference) ; | Создает объект-окно: вызывает конструктор класса TFormClass и связывает его значение с переменной Reference
procedure CancelHint; | Запрещает показ ярлычков оперативной подсказки
function HelpContext(Context: THelpContext): Boolean; | Вызывает раздел context справочной службы и возвращает True, если такой раздел существует
function HelpJump(const JumpID: String): Boolean; | Вызывает раздел справочной службы по его имени JumpID и возвращает True, если такой раздел существует
procedure Hide Hint; | Убирает текущий ярлычок оперативной подсказки
TWindowHook = function(var Mes sage: TMessage): Boolean of object procedure HookMainWindow(Hook: TWindowHook); | Регистрирует функцию для перехвата сообщений Windows
function MessageBox(Text, Cap tion: PChar; Flags: Longint): Integer; | Создает и показывает диалоговое окно с текстом и кнопками: Text - сообщение в окне; Caption - заголовок окна. Назначение Flags и возвращаемое значение см. ниже
procedure Minimize; | Минимизирует программу до пиктограммы
procedure NormalizeTopMosts; | Приостанавливает действие стиля fsTopMost для всех окон программы
procedure NormalizeAllTopMosts; | Распространяет действие NormalizeTop Mosts на главное окно программы
procedure ProcessMessages; | То же, что HandleMessage, но не создает событие OnIdle
procedure Restore; | Восстанавливает первоначальные размеры всех окон программы до ее минимизации
procedure RestoreTopMosts; | Восстанавливает действие стиля fsTopMost для всех окон программы
procedure Run; | Запускает цикл получения и обработки Windows-сообщений
procedure ShowException(EiException) ; | Реализует умалчиваемую обработку исключительных ситуаций
procedure Terminate; | Завершает работу программы
procedure UnhookMainWindow(Hook:TWindowHook); | Удаляет перехватчик сообщений, ранее установленный методом ookMainWindow. Параметр Hook - имя той же функции перехвата, что и при обращении к HookMainWindow

С помощью методов HandleException и ProcessMessages программа может временно приостановить свою работу до тех пор, пока не будут обработаны все предназначенные ей сообщения Windows. Это бывает необходимо для обновления видимых компонентов в процессе отображения длительного по времени цикла работы. Если, например, программа изменит текст метки или состояние компонента progressBar, сообщение об этом поступит в очередь сообщений и останется в ней, пока не закончится текущая работа. Вызов HandleException или ProcessMessages в этом случае позволит метке или ProgressBar действительно обновить свой вид и отобразить новую фазу процесса. Разница между методами HandieException И ProcessMessages состоит в том, что первый после очистки очереди сообщений вызывает обработчик фонового события OnIdie, а второй не делает этого. Назначение события onidie см. после описания событий объекта Application.

С помощью метода HookMainWindow можно зарегистрировать функцию Hook, которая будет получать все адресованные программе сообщения windows. По моим наблюдениям, эта функция получает

Сообщение Message параллельно c главной оконной функцией Application. ProcessMessage или после нее, т. к. ни изменение сообщения, ни возвращаемый функцией Hook результат никак не влияют на поведение программы. Как следует из встроенной справочной службы, в качестве функции Hook должна регистрироваться оконная функция диалогового окна, созданного не с помощью Delphi. Если вы решите использовать HookMainWindow для наблюдения за посылаемыми программе сообщениями, не забудьте перед завершением программы отключить регистрацию Hook методом unHookMainwin-dow, в противном случае завершение работы программы будет сопровождаться сообщением об ошибке. Для целей перехвата сообщений и их возможного изменения следует использовать обработчик Application. OnMessage, который вызывается из оконной функции Программы Application. ProcessMessage до вызова методов Trans-lateMessage И DispatchMessage, реализующих стандартную обработку сообщений. В Delphi 5 (и 6) появилось дополнительное удобное средство перехвата сообщений - компонент TApplicationEvents (см. п. 18.2.14).

Функция MessageBox дает удобное средство вывода на экран небольшого -сообщения. Параметр Flags может быть произвольной комбинацией следующих значений:

mbA bort Retry Ignore | В окно вставляются кнопки Abort, Retry, Ignore
mbApplModal | Пользователь должен закрыть это окно перед тем, как продолжить работу с окном, его породившим; однако он может переходить в другие окна и работать с ними. Этот признак берется по умолчанию, если не определены ни mbSystemModal, ни inbTaskModal
mbDefButton1 | Кнопкой по умолчанию является кнопка 1
mbDefButton2 | Кнопкой по умолчанию является кнопка 2
mbDefButton3 | Кнопкой по умолчанию является кнопка 3
mbDefButton4 | Кнопкой по умолчанию является кнопка 4
mbHelp | Вставляется кнопка Help
mbIconAftensk | В окно вставляется пиктограмма в виде строчной буквы i в кружке
mblconExclcimation | В окно вставляется пиктограмма в виде знака восклицания
mbIconHand | В окно вставляется пиктограмма в виде знака
mblconlnformation | Стоп То же,что и mbIconAsterisk
mb IconQuestion | В окно вставляется пиктограмма в виде знака вопроса
mbIconStop | To же, ЧТО И mbIconHand
mb0k | В окно вставляется кнопка Ok
mbOkCancel | В окно вставляются кнопки Ok и Cancel
mbRetry Cancel | В окно вставляются кнопки Retry и Cancel
mbSy stem Modal | Все программы приостанавливают свою работу, пока пользователь не закроет это окно
mbTaskModal | Приостанавливается работа во всех окнах данной программы до тех пор, пока пользователь не закроет это окно
mbYesNo mb Yes No Cancel | В окно вставляются кнопки Yes, ыо В окно вставляются кнопки Yes, No, Cancel

Например:

Application.MessageBox('Текст в окне', 'Заголовок окна', mb_IconQuestion+mb_YesNo) ;

Функция MessageBox возвращает такие значения:

idAbort idCancel idlgnore idOk | Была нажата кнопка Abort Была нажата кнопка cancel Была нажата кнопка ignore Была нажата кнопка ok | idNo idRetry idYes | Была нажата кнопка No Была нажата кнопка Retry Была нажата кнопка Yes

Примечание

> Альтернативой MessageBox является глобальная функция MessageDIg, объявленная в модуле Dialogs:

> function MessageDIg(const.Msg: String;AType: TMsgDIgType; AButtons: TMsgDIgButtons;HelpCtx:- Longint): Word;

> Эта? функция имеет шараметр; HelpCtx, с помощью которого создаваемое ею окно можно легко связать с Help-службой. В отличие от MessageBox заголовок окна MessageDIg не может изменяться программистом - он опредёляётся типом окна, задаваемым параметром AType (возможные значения: mtWarning - пиктограмма в виде знака: Восклицания, заголовок Warning; mtError - пиктограмма в виде знака Стоп заголовок Error; mtlnformation:-- пиктограмма в виде:

> Буквы i, заголовок information; mtConfirmation - пиктограмма в виде знака вопроса, заголовок Confirm; mtCustom - нет пиктограммы, заголовок содержит имя исполняемого файла программы) Набор кнопок задаётся в виде конструктора множества и может включать: mbYes-—кнопка Хез (результат, возвращаемый функцией при нажатии на эту кнопку - nu-Yes); mbNo -кнопка. No (mrNo); mbOk - кнопка OK (mrOk); mbCancel - кнопка ; Cancel (mrCancel);

> mbHelp -кнопка Help (после нажатия на эту кнопку окно не закрывается); mbAbort - кнопка Abort (mrAbort); mbIgnore- кнопка Ignore (mrlgnore); mbAll —кнопка All .(mbА11). В отличие от MessageBox раскрытие окна MessageDIg не сопровождается системным звуком.

Для объекта Application определены следующие события:

property OnActivate: TNotifyEvent; | Возникает, когда программа получает фокус ввода
property OnDeactivate: TNotifyEvent; | Возникает, когда программа теряет фокус ввода
TExceptionEvent = procedure (Sender: TObject; E: Exception) of object; property OnException: TException Event; | Обработчик этого события реализует умалчиваемую обработку исключительных ситуаций
THelpEvent = function (Command: Word; Data: Longint; var CallHelp: Boolean): Boolean of ob ject; property OnHeip: THelpEvent; | Возникает при каждом обращении к справочной службе
property OnHint: TNotifyEvent; | Возникает при необходимости отобразить длинную часть оперативной подсказки
TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object; property Onldle: TIdleEvent; | Обработчик этого события реализует фоновую работу (см. ниже пояснения)
TMessageEvent = procedure (var Msg: TMsg; var Handled: Boolean) of object; property OnMessage: TMessageEvent; | Возникает при получении программой сообщения Windows. С помощью обработчика этого события можно обработать не сколько или все сообщения до того, как их получит активная форма
property OnMinimize: TNotifyEvent; | Возникает при минимизации программы
property OnRestore: TNotifyEvent; | Возникает при восстановлении программой первоначальных размеров после ее минимизации
property OnShowHint: TShowHintE vent; | Возникает при необходимости отобразить окно с ярлычком оперативной подсказки

Событие OnIdie возникает всякий раз, когда программа обнаруживает, что ее очередь сообщений пуста. Обработчик этого события может незаметно для пользователя выполнить вспомогательную работу, например, проверить орфографическую правильность только что введенного слова или собрать и обработать статистические данные. Важно помнить, что выполняемая в обработчике работа не может занимать много времени, иначе программа перестанет реагировать на запросы пользователя. Если фоновая работа отнимает много времени, ее следует разбить на сравнительно небольшие фрагменты или периодически вызывать в ней метод HandieMessage. Обработчик в параметре Done сообщает о необходимости продолжить фоновую работу (Done = False) или 0 ее завершении (Done = True). В первом случае программа просмотрит очередь сообщений и после ее очистки вернет управление обработчику OnIdie. Во втором случае программа будет ожидать поступления новых сообщений.

Примечание

> Событие Onidie введено в Delphi 1 для совместимости с Windows З.х в которой не было многопоточности; Если вы работаете с Windows 32 и вам действительно нужно сделать некоторую фоновую работу, имеет смысл поручить ее выполнение отдельному потоку команд(см.га. 14)

Для события ОnShowHint определены такие типы:

type

THintInfo = record

HintControl: TControl;

HintPos: TPoint;

HintMaxWidth: Integer;

HintColor: TColor;

CursorRect: TRect;

CursorPos: TPoint;

ReshowTimeout: Integer;

HideTimeout: Integer;

HintStr: String;

end;

TShowHintEvent =

procedure ( var HintStr: String;

var CanShow: Boolean;

var Hintlnfo: THintInfo)

of object;

В параметре HintStr обработчик получает текст, который должен содержать ярлычок, а в параметре Hintlnfo - дополнительную информацию, в том числе: HintControl - элемент, для которого выводится ярлычок; HintPos - координаты верхнего левого угла ярлычка; HintMaxWidth - максимальная ширина окна; HintColor - цвет окна; CursorRect - прямоугольник, в котором должен оставаться указатель мыши, чтобы появился ярлычок; CursorPos - текущее положение указателя мыши; ReshowTimeout - задержка в миллисекундах от момента возникновения события до появления ярлычка;

HideTimeout - время показа ярлычка в миллисекундах.