При разработке приложения ObjectWindows вам нужно сначала определить объект приложения, производный от типа ObjectWindows TApplication. Этот объект инкапсулирует следующее поведение приложения ObjectWindows:
Кроме определения объекта приложения вы должны добавить к нему возможность построения объекта основного окна. Вы имеете также возможность переопределения используемого по умолчанию поведения инициализированных экземпляров, закрытия приложения и обработки сообщений Windows.
Используемый по умолчанию объект выполняет эти задачи путем вызова трех его методов: Init, Run и Done. Основной блок любой программы ObjectWindows содержит обычно эти три метода. Чтобы изменить поведение по умолчанию, методы нужно переопределить.
Приведем пример минимального приложения ObjectWindows:
program MinApp; uses OWindows; var MyApp: TApplication; begin MyApp.Init('TtstApp'); MyApp.Run; MyApp.Done; end;
MinApp - это абсолютный минимум приложения ObjectWindows. Эта программа не требует определения других объектов. Обычно вы определяете новый объектные типы как минимум для приложения и основного окна.
Так как в основном блоке программы ObjectWindows каждый раз используются одни и те же операторы, вы должны понимать, что делает каждый из них.
Первый оператор - это вызов конструктора Init приложения. Этот вызов делает следующее:
Когда Init завершает работу, основное окно вашего приложения находится на экране. В большинстве случаев вам нужно только переопределить InitMainWindow.
MessageLoop вызывает несколько методов, обрабатывающих конкретные поступающие сообщения (см. далее).
Примечание: Объекты окон подробно описываются в Главе 10.
program TestApp; uses OWindows; type TMyApplication = object(TApplication) procedure InitMainWindow; virtual; end; procedure TMyApplication.InitMainWindow; begin MainWindow := New(PWindow, Init(nil, 'Основное окно')); end; var MyApp: TApplication; begin MyApp.Init('TestApp'); MyApp.Run; MyApp.Done; end;
Программа TestApp выводит окно с заголовком 'Основное окно'. Вы можете легко перемещать это окно и изменять его размер, минимизировать его, восстанавливать или максимизировать. Закрытие окна завершает приложение. Короче, TestApp - это полнофункциональный "скелет" приложения, оснащенный только простейшим основным окном.
program TestApp; uses OWindows; type TMyApplication = object(TApplication) FirstApp: Boolean; procedure InitMainWindow; virtual; procedure InitApplication; virtual; end; procedure TMyApplication.InitMainWindow; begin if FirstApp then MainWindow := New(PWindow, Init(nil, 'Первый экземпляр')) else MainWindow := New(PWindow, Init(nil, 'Дополнительный экземпляр')); end; procedure TMyApplication.InitApplication; begin FirstApp := True; end; var MyApp; TMyApplication; begin MyApp.Init('TestApp'); MyApp.Run; MyApp.Done; end.
procedure TEditApplication.InitInstance; begin inherited InitInstance; HAccTable := LoadAccelerators(HInstance, 'MyHotKeys'); end;
Вы можете также использовать InitInstance для регистрации экземпляра приложения с внешней DLL (типа Paradox Engine).
Механизм CanClose дает основному окну, объекту приложения и другим окнам возможность подготовиться с закрытию или предотвратить его. В итоге объект приложения должен разрешить закрытие приложения. По умолчанию он проверяет основное окно. Обычная последовательность закрытия выглядит следующим образом:
1. Windows посылает основному окну приложения сообщение wm_Close.
2. Объект основного окна вызывает метод CanClose объекта приложения.
3. Объект приложения вызывает метод CanClose.
4. Объект основного окна вызывает метод CanClose для каждого из дочерних окон и возвращает True только в том случае, если методы CanClose дочерних окон возвращают True.
Методы CanClose редко возвращают значение False. Вместо этого они должны выполнять некоторые действия, позволяющие им возвращать True. Метод CanClose должен возвращать False только в том случае, если он не может выполнить действий, необходимых для нормального завершения, или пользователь показывает, что он хочет продолжать выполнение программы.
Например, метод CanClose окна редактора может проверять изменение редактируемого текста, а затем выводить диалоговое окно с запросом, нужно ли сохранить текст перед закрытием, и воспринимать ответ Yes (Да), No (Нет) или Cancel (Отмена). Cancel будет указывать, что пользователь пока не хочет закрывать приложение, так что CanClose должен возвращать False. CanClose следует также возвращать False при обнаружении ошибки в сохранении текста, предоставляя пользователю другую возможность сохранения данных перед закрытием.
Если метод CanClose не переопределяется, тип основного окна наследует его от TWindowsObject, где CanClose возвращает True после вызовов методов CanClose дочерних окон. Чтобы модифицировать поведение при закрытии основного окна, переопределите метод CanClose. Например, для проверки того, что пользователь собирается закрыть окно, он может проверять открытые файлы.