Многодокументный интерфейс.
⇐ ПредыдущаяСтр 5 из 5 (Multi Document Interface) МДИ появился сравнительно давно в Microsoft Excel 2. Его появление было обусловлено необходимостью предоставить пользователям возможность работать с разными документами, используя одни и те же функциональные возможности. В МДИ все формы, кроме главной, являются дочерними и располагаются исключительно в рабочей области главного окна. При закрытии приложения и уничтожении главной формы все дочерние формы автоматически уничтожаются вместе с ним. При сворачивании главного окна все дочерние окна также автоматически сворачиваются вместе с ним. При сворачивании дочерних окон внешний вид главного окна не изменяется, а дочерние окна располагаются в виде значков в нижней части рабочей области главного окна. Внешний вид главного окна МДИ также сформировался. Он содержит меню со стандартными пунктами, меню??? и строку состояния. При построении приложения с МДИ в среде разработки Delphi можно воспользоваться готовым шаблоном, который хранится в депозитарии объектов на странице Project. Поведение приложения с МДИ зависит от значения свойств форм, которые составляют этот интерейс. FormStyle – для главного окна МДИ значение этого свойства равно fsMDIForm, для дочерних окон МДИ – fsMDIChild. При использовании шаблона для создания приложения с МДИ создается форма в стиле fsMDIChild, т.е. стандартное дочернее окно МДИ. Модуль, хранящий описание этой формы по умолчанию содержится в файле ChildWin.pas. При желании программист может скорректировать содержимое этого файла, приспособив форму под свои задачи. В этом случае все вновь создаваемые в приложении дочерние формы будут обладать одинаковым набором значений свойств и элементов управления. Методы и свойства применяемые при работе с главной формой МДИ следующие:
ü property ClientHandle: hWnd – в этом свойстве содержится дескриптор клиентского окна. ü procedure ArrengeIcons – этот метод производит упорядочивание расположения дочерних окон МДИ свернутых в виде значка. ü procedure Cascade – этот метод располагает дочерние окна МДИ каскадами. ü procedure Tile – этот метод располагает дочерние окна МДИ мозаикой. ü Стиль расположения этих окон определяется свойством property TileMode: TTileMode TTileMode = (tbHorizontal, tbVertical) – соответственно ü property ActiveMDIChild: TForm – в этом свойстве хранится ссылка на активную дочернюю форму МДИ, т.е. на ту форму, которая в данный момент имеет фокус. ü property MDIChildCount: integer – число дочерних форм приложения с МДИ. ü property MDIChildren (I: integer): TForm – в этом свойстве хранится указатель на дочернюю форму в приложении с МДИ. ü property WindowMenu: TItemMenu – в этом свойстве хранится указатель на тот пункт главного меню главной формы, к которому прикреплен список дочерних окон с МДИ. При необходимости создать дочернюю форму в МДИ непосредственно из главной формы можно использовав метод procedure TMainForm.MDIChildCreate (const Name: String) Child: TMDIChild begin {create a new MDI Child window} Child:= TMDIChild.Create (Application) Child.Caption:= Name if FileExists (Name) then Child.Memo1.Lines.LoadFromFile (Name); end; При необходимости можно проинициализировать дочернюю форму своим значением. В шаблоне извлекается текст из файла и отображается в текстовом поле. Для создания приложения с МДИ достаточно воспользоваться его шаблоном. При этом если требуется создать стандартную дочернюю форму МДИ достаточно изменить код инициализации этого объекта. (P.ex., TImage вместо TMemo). Если требуется создать нестандартную дочернюю форму МДИ, то достаточно изменить свойство FormStyle на значение fsMDIChild.
Однодокументный интерфейс. (Single Document Interface) ОИ определяет еще одну модель взаимодействия главных и дочерних окон. Этот интерфейс обладает большими функциональными возможностями по сравнению с МДИ и в настоящее время получили широкое распространение. При запуске приложения автоматически показывается главная форма однодокументного интерфейса. При этом в ней сосредоточены все функциональные возможности по управлению приложением. Из главной формы запускаются дочерние формы ОИ. При этом дочерние формы обладают относительной самостоятельностью и связаны с главной формой посредством данных. Дочерние формы в ОИ могут отображаться в любом месте экрана, в том числе и поверх главного окна. Из одних дочерних форм может быть произведен запуск других дочерних форм. При сворачивании главного окна ОИ все дочерние формы сворачиваются вместе с ним. Примером приложения с ОИ является сам Delphi. Методы и свойства, используемые для главного окна МДИ неприменимы к главному окну приложения с ОИ. В то же время методы и свойства, используемые для создания дочерних форм, в обоих интерфейсах являются одинаковыми. В депозитарии объектов Delphi также есть шаблон приложения с ОИ.
Класс TApplication. На уровне методов и свойств этого класса сосредоточено управление выполнением приложения. Этого компонента нет в палитре компонентов, однако его свойства доступны из визуализированной среды проектирования Delphi. Часть этих свойств определяется свойствами настройки проектирования. Все методы обработчики событий класса TApplication доступны как методы класса TApplicationEvents. Класс TApplicationEvents является наследником класса TComponent (имеет 2 опубликованных свойства Tag и Name), но все методы класса TApplicationEvents являются методами обработчиками событий класса TApplication, т.е., описывая методы TApplicationEvents, программист фактически управляет поведением объекта TApplication. Экземпляр класса TApplication доступен в любом приложении через переменную var Application: TApplication Пример использования этой переменной имеется в любом проекте приложения. В файле проекта стандартного приложения переменная Application используется для вызова методов. 1. Initialize. Этот метод осуществляет инициализацию приложения. 2. CreateForm (различных видов), которые создают форму приложения. 3. Run, который запускает приложение на выполнение. Внутри этого метода запускается обработчик сообщения HandleMessage, который будет продолжать функционировать до тех пор, пока приложение не будет завершено.
Весь код с использованием этих методов жизненно важен для правильного функционирования приложения и автоматически генерируется Delphi. При желании можно скорректировать этот код, при этом необходимо соблюдать аккуратность, чтобы не нарушить нормальную работу приложения. Корректировка этого кода может потребоваться 1. При необходимости получить информацию о приложении, которое является общим для всех форм приложения. 2. при необходимости выполнить управление приложением и всеми входящими в него формами. Информационные свойства: ü property Title: String – заголовок приложения, т.е. имя под которым приложение фигурирует. По умолчанию, имя приложения совпадает с именем проекта. ü property NameExe: String – имя исполняемого файла формата.exe, в котором хранится работающее приложение = функции ParamStr(0). ü property Icon: TIcon – определяет значок приложения. Первоначально, при запуске приложения на выполнение этот значок берется и файла ресурсов MAIN. При запуске объекта класса TApplication на выполнение вначале выполняется метод procedure CreateForm (FormClass: TFormClass, var Reference) Параметр Reference хранит ссылку на вновь созданную форму. Именно с этого метода начинается код файла с расширением *.dpr. Этот метод реализован таким образом, что если указатель на главную форму проекта в текущий момент = NULL, то статус главной формы будет автоматически присвоен вновь создаваемой форме. Т.о., главной всегда будет та форма, которая первой создается в проекте. Указатель на главную форму хранится в свойстве property MainForm: TForm На самом деле помимо главной и дочерней окон в приложении существует еще одно невидимое окно – оно и является главным. В этом окне происходит обработка сообщений от ОС Windows и именно это окно управляет приложением. Ссылка на дескриптор этого окна хранится в свойстве property Handle: hWnd После того как все окна созданы выполняется метод Run, который имеет простой код FMainForm.Visible:= true repeat HandleMessage until Terminated Внутри метод HandleMessage осуществляет обработку сообщений
procedure TApplication. HandleMessage var Msg: TMsg begin if not ProcessMessage (Msg) then Idle (Msg) end; Этот метод определяет пришедшее сообщение от ОС и передает управление функции обработчику этого события. О том, что сообщение поступило извещает наступление события property onMessage: TMessageEvent TMessageEvent = procedure (var Msg: TMsg; Handle: Boolean) of object Описав обработчик этого события программист может перехватить сообщение от ОС Windows, поступающее в приложение. Для этого после того, как будут выполнены необходимые действие в параметре Handle = true. Подменять обработчики системных сообщений следует аккуратно, чтобы не нарушить корректную работу приложения. Существует другой способ перехвата сообщений для этого необходимо написать метод, имеющий тип TWindowHook = function (Message: TMessage): Boolean of object Далее следует зарегистрировать этот метод в качестве метода-перехватчика событий procedure HookMainWindow (Hook: TWindowHook) Если хоть один из методов TWindowHook вернет значение true, то это будет означать, что сообщение успешно перехвачено. Когда необходимость в перехвате сообщение отпадает, следует исключить его из списка перехватчиков сообщений. procedure UnHookMainWindow (Hook: TWindowHook) Если сообщений в очереди нет, то в это время может выполняться фоновая работа, предусмотренная программистом. Для этого необходимо написать обработчик события property onIdle: TIdleEvent TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of Object. Через параметр Done следует вернуть признак потребности вызова метода-обработчика данного события. Если вся работа в этом обработчике завершена, то Done:= true, в этом случае в последующем метод-обработчик события OnIdle вызываться не будет. Если не завершена Done:= false, и метод-обработчик этого события будет вызываться каждый раз когда сообщения в очереди больше не будет. Обработка сообщений объектом Application происходит до тех пор, пока свойству property Terminated: Boolean не будет присвоено значение true. Это произойдет при получении сообщения WM_QUIT. Т.е. используя обработчик этого события программист может написать код перед вызовом деструктора объекта Application. Свойство Terminated доступно только для чтения. Поэтому чтобы уничтожить объект Application надо использовать метод Terminate. Одна или несколько форм приложения могут иметь статус fsStagOnTop, т.е. располагаться поверх других форм приложения. Для временного отключения и включения действия этого статуса применяются методы procedure NormalizeTopMosts – отключение ст. procedure RestoreTopMosts – восстановление. Эти методы удобно использовать, когда требуется вывести информацию поверх формы. Внутри объекта Application автоматически вызываются соответственно при активации приложения, а также при сворачивании и разворачивании главного окна приложения. Активизация и деактивизация приложения происходит при переключении между задачами Windows. Приложение само может отслеживать переключение задач. Для этого требуется отслеживание свойств
property OnActivate: TNotyfyEvent property OnDeactivate: TNotyfyEvent Узнать о текущем свойстве активности можно с помощью свойства property Active: Boolean При сворачивании главного окна приложения происходит событие property OnMinimize: TNotyfyEvent при разворачивании property OnRestore: TNotyfyEvent Сворачиванием и разворачиванием можно управлять программно procedure Minimize procedure Restore При выполнении приложения могут возникать исключительные ситуации. Обработка их возложена на методы procedure HandleException (Sender: TObject) Стандартная обработка исключительной ситуации предусматривает вызов метода procedure ShowException (E:Exception) Этот метод показывает текстовое окно в заголовке, которого содержится название приложения, а в самом тексте сообщение об ошибке. Это сообщение определяется параметром Е. Если требуется подменить стандартную обработку исключительной ситуации, то следует написать обработчик события property OnExeption: TExeptionEvent TExeptionEvent = procedure (Sender: TObject; E: Exeption) of object Т.о. подменить можно обработку любой исключительной ситуации, кроме EAbort. Существует группа методов, управляющих системой помощи. Для нормального функционирования системы помощи прежде всего необходимо, чтобы было определено имя файла помощи. Оно задается в свойстве property HelpFile: String Если это имя определено, то к системе помощи можно обратиться с помощью одного из 3-х видов запросов к каждому из которых соответствует определенный метод. function HelpContext (Context: THelpContext): Boolean Этот метод выдает помощь по заданному контексту function HelpJump (Jupm_ID: String): Boolean Этот метод выдает помощь по контексту строки Jump_ID function HelpCommand (Command: word; Date: Longint): Boolean Этот метод посылает в системную помощь??? Все 8 методов возвращают true, если файл помощи открылся. Если возникает необходимость в собственной системной помощи, то необходимо описать обработчик событий property OnHelp: THelpEvent THelpEvent = function (Command: word; Data: longint; CallHelp: Boolean): Boolean of object Если вместо вызова собственной системы помощи требуется обратиться к системе помощи Windows, то CallHelp:= true. function MessageBox (Text, Caption, PChar, flags: word: integer) – выдает одноименное текстовое окно с каким-то сообщением. Если требуется использование нестандартных диалоговых окон, то их свойствам property DialogHandle: HWnd нужно присвоить дескриптор. У приложения есть своя оперативная подсказка, которая определяется свойством property Hint: String В отличие от подсказки от других элементов, она обычно отображается в строке состояния. procedure BringToFront Метод с тем же названием есть и у класса TForm. Этот метод размещает форму поверх всех остальных и активизирует её.
28) Оператор try … except Всякое взаимодействие с операционной системой на предмет получения ресурсов – места на диске, в памяти, открытие файла – может завершиться неудачно. Любое вычисление может закончиться делением на ноль или переполнением. Платой за надежную работу программы в таких условиях служит введение многочисленных проверок, способных предотвратить некорректные действия в случае возникновения нештатной ситуации. Хорошо, если в конце очередной конструкции if..then можно просто поставить оператор Exit. Обычно же для корректного выхода из ситуации нужно отменить целую последовательность действий, предшествующих неудачному. Все это сильно запутывает программу, маскируя четкую структуру главного алгоритма. Выход из подобной ситуации был предложен разработчиками ОС WinNT, а затем внедрен во все ОС Microsoft. Этот выход получил название метода структурирования исключительных ситуаций. Постепенно поддержка этих ситуаций появилась во всех ведущих системах разработки программ. С точки зрения языка OP исключительная ситуация – это объект. Для работы с таким специальным объектом предназначены 2 блока. try … except – применяется при необходимости определить реакцию на конкретную исключительную ситуацию. Синтаксис try < оператор > … < оператор > except on Exception1 do < оператор > on Exception2 do < оператор > … else < оператор > end Выполнение этого блока начинается с секции try. Если исключительная ситуация в процессе выполнения операторов в этом блоке не возникает, то будут выполнены только операторы из этой секции. Если в ходе выполнения возникла исключительная ситуация, то управление передается на секцию except. Эта секция состоит из операторов on … do, связывающих конкретную исключительную ситуацию, заданную своим именем с оператором предназначенным для обработки этой исключительной ситуации. try U:= 220; R:= 0; I:= U/R; except on EInvalidZero do ShowMessage (‘Короткое замыкание’) end; В этом примере применение секции try … except не дает экономии исходного текста программы. Однако если требуется проверить на возможность деления на 0 не одно вычисление, а множество, то выигрыш заметен. Исключительные ситуации просматриваются последовательно. Если реакция на возникшую исключительную ситуацию не определена ни в одном из операторов on … do, то управление получит оператор после слова else. Если и там не определена реакция на исключительную ситуацию, то ее обработка будет передана на верхний уровень (еще один блок try … except). Процедура, на которой замыкается вся обработка исключительной ситуации, содержится в модуле SYSUTILS.PAS. Если исключительная ситуация возникнет вне блока try … except, то это необязательно приведет к завершению приложения. Обработчики завершают не само приложение, а методы. Стандартная реакция – выдача предупредительного окна. При желании можно получить более полную информацию с именем модуля и адреса, где возникла эта исключительная ситуация.
29) Оператор try … finally try … finally – этот блок применяется, когда программе в любом случае требуется освободить выделенные ей системные ресурсы (дескрипторы блока памяти и т.д.) Синтаксис try < оператор > … < оператор > finally < оператор > … end; Сначала будут выполняться операции из секции try. Если исключительной ситуации не возникло, то управление будет передано в секцию finally. Если же возникла исключительная ситуация, то управление будет немедленно передано в секцию finally. try – получение системных ресурсов, finally – освобождение системных ресурсов. Сам блок ничего не делает с объектом исключительной ситуации. Задача try … finally – только прореагировать на факт нештатного поведения программы и проделать определенные действия. Сама же ИС продолжает “путешествие” и вопрос ее обработки остается на повестке дня.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|