Главная страница

Учебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1


Скачать 2.61 Mb.
НазваниеУчебное пособие для студентов Авторы А. Н. Вальвачев, К. А. Сурков, Д. А. Сурков, Ю. М. Четырько Содержание Содержание 1
Дата15.01.2023
Размер2.61 Mb.
Формат файлаdoc
Имя файлаlab_OOTP.doc
ТипУчебное пособие
#886736
страница19 из 33
1   ...   15   16   17   18   19   20   21   22   ...   33

OnCreate — происходит сразу после создания формы. Обработчик этого события может установить начальные значения для свойств формы и ее компонентов, запросить у операционной системы необходимые ресурсы, создать служебные объекты, а также выполнить другие действия прежде, чем пользователь начнет работу с формой. Парным для события OnCreate является событие OnDestroy.

OnDestroy — происходит непосредственно перед уничтожением формы. Обработчик этого события может освободить ресурсы, разрушить служебные объекты, а также выполнить другие действия прежде, чем объект формы будет разрушен.

OnShow — происходит непосредственно перед отображением формы на экране. Парным для события OnShow является событие OnHide.

OnHide — происходит непосредственно перед исчезновением формы с экрана. Парным для события OnHide является событие OnShow.

OnActivate — происходит, когда пользователь переключается на форму, т.е. форма становится активной. Парным для события OnActivate является событие OnDeactivate.

OnDeactivate — происходит, когда пользователь переключается на другую форму, т.е. текущая форма становится неактивной. Парным для события OnDeactivate является OnActivate.

OnCloseQuery — происходит при попытке закрыть форму. Запрос на закрытие формы может исходить от пользователя, который нажал на рамке формы кнопку "Закрыть", или от программы, которая вызвала у формы метод Close. Обработчику события OnCloseQuery передается по ссылке булевский параметр CanClose, разрешающий или запрещающий действительное закрытие формы.

OnClose — происходит после события OnCloseQuery, непосредственно перед закрытием формы.

OnContextPopup — происходит при вызове контекстного меню формы.

OnMouseDown — происходит при нажатии пользователем кнопки мыши, когда указатель мыши наведен на форму. После отпускания кнопки мыши в компоненте происходит событие OnMouseUp. При перемещении указателя мыши над формой периодически возникает событие OnMouseMove, что позволяет отслеживать позицию указателя.

OnMouseWheelUp — происходит, когда колесико мыши проворачивается вперед (от себя).

OnMouseWheelDown — происходит, когда колесико мыши проворачивается назад (на себя).

OnMouseWheel — происходит, когда колесико мыши проворачивается в любую из сторон.

OnStartDock — происходит, когда пользователь начинает буксировать стыкуемый компонент.

OnGetSiteInfo — происходит, когда стыкуемый компонент запрашивает место для стыковки.

OnDockOver — периодически происходит при буксировке стыкуемого компонента над формой.

OnDockDrop — происходит при стыковке компонента (см. главу 10).

OnEndDock — происходит по окончании стыковки компонента.

OnUnDock — происходит, когда пользователь пытается отстыковать компонент.

OnDragDrop — происходит, когда пользователь опускает в форму буксируемый объект.

OnDragOver — периодически происходит при буксировке объекта над формой.

OnCanResize — происходит при попытке изменить размеры формы. Запрос на изменение размеров может исходить от пользователя. Обработчику события OnCanResize передается по ссылке булевский параметр Resize, разрешающий или запрещающий действительное изменение размеров формы.

OnResize — происходит при изменении размеров формы.

OnConstrainedResize — происходит при изменении размеров формы и позволяет на лету изменять минимальные и максимальные размеры формы.

OnShortCut — происходит, когда пользователь нажимает клавишу на клавиатуре (до события OnKeyDown, см. параграф 7.5.5). Позволяет перехватывать нажатия клавиш еще до того, как они дойдут до стандартного обработчика формы.

7.4. Несколько форм в приложении

Часто одной формы для решения задачи бывает мало. Поэтому сейчас мы рассмотрим, как добавить в проект новую форму, выбрать главную форму приложения, переключаться между формами. Затем мы расскажем, как на этапе работы приложения решается вопрос показа форм на экране.

7.4.1. Добавление новой формы в проект

Добавить в проект новую форму крайне просто: выберите команду меню File|New|Form и на экране сразу появиться вторая форма. При этом в окне редактора кода автоматически появится соответствующий новой форме программный модуль. Только что созданной форме дайте имя SecondaryForm (свойство Name) и заголовок Secondary (свойство Caption) — рисунок 7.29.



Рисунок 7.29. Две формы в проекте

Сохраните модуль с новой формой под именем Second.pas — форма нам еще понадобится.

7.4.2. Добавление новой формы из Хранилища Объектов

Существует и второй, более продуктивный, способ создания форм. Он основан на использовании готовых форм, существующих в Хранилище Объектов среды Delphi. Хранилище Объектов (Object Repository) содержит заготовки форм, программных модулей и целых проектов, которые вы можете либо просто скопировать в свой проект, либо унаследовать, либо вообще использовать напрямую. Чтобы взять новую форму из Хранилища объектов, выберите в меню команду File | New | Other.... Среда Delphi откроет окно, показанное на рисунке 7.30:



Рисунок 7.30. Окно создания новой формы или другого элемента проекта

Если на вкладке New диалогового окна выбрать значок с подписью Form, то в проект добавится обычная пустая форма, как по команде меню File | New Form. Если вас интересуют формы с «начинкой», обратитесь к вкладкам Forms и Dialogs (рисунок 7.31).



Рисунок 7.31. Быстрое создание формы с «начинкой»

На вкладках Forms и Dialogs существует переключатель, указывающий, что нужно сделать с формой-заготовкой: копировать (Copy), наследовать (Inherit) или использовать (Use). Отличие между ними состоит в следующем:

  • Copy — означает, что в проект помещается полная копия формы-заготовки.

  • Inherit — означает, что добавляемая в проект форма создается методом наследования от формы-заготовки, находящейся в Хранилище Объектов;

  • Use — означает, что в проект добавляется сама форма-заготовка; изменение формы в проекте означает изменение формы-заготовки в Хранилище Объектов.

Какой из режимов использовать — зависит от условия задачи. Режим Copy хорош просто тем, что не с нуля начинает разработку новой формы. Режим Inherit полезен, когда в проекте существует несколько форм, у которых совпадают некоторые части. В этом случае все похожие между собой формы порождаются от какой-то одной формы, реализующей общую для всех наследников часть. Режим Use позволяет подкорректировать форму-заготовку прямо в Хранилище Объектов.

Для нашего учебного примера двух форм достаточно, поэтому вернемся к уже созданным формам, нажав кнопку Cancel.

7.4.3. Переключение между формами во время проектирования

Иногда за формами становиться трудно уследить. Навести порядок помогает окно View Form, для вызова которого служит команда меню View | Forms... (рисунок 7.32).



Рисунок 7.32. Окно для переключения на другую форму

Выберите в этом окне форму, с которой собираетесь работать, и щелкните по кнопке OK. Выбранная форма сразу же станет активной.

7.4.4. Выбор главной формы приложения

Когда в проекте несколько форм, возникает вопрос: какая из них главная. Давайте не будем ломать голову, а обратимся к известному вам диалоговому окну Project Options и посмотрим на вкладке Forms, какая форма выбрана в выпадающем списке Main form (рисунок 7.33).



Рисунок 7.33. Главная форма в проекте записана в поле Main form

Вы обнаружите, что выбрана форма MainForm, которая была добавлена в проект первой (среда Delphi создает ее автоматически при создании нового проекта). Вы можете выбрать другую форму — и тогда она будет отображаться при запуске приложения. В данном случае этого делать не надо, поскольку главная форма уже установлена правильно.

7.4.5. Вызов формы из программы

Работая с несколькими формами, вы должны принимать во внимание, что после загрузки приложения отображается только главная форма. Остальные формы хотя и создаются вслед за ней автоматически, на экране сразу не показываются, а ждут пока их вызовут. Форму можно вызвать для работы двумя разными способами:

  • вызвать для работы в обычном режиме с помощью метода Show. В этом режиме пользователь может работать одновременно с несколькими формами, переключаясь между ними;

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

Покажем, как реализуются эти способы на примере вызова формы SecondaryForm из формы MainForm.

Чтобы форма SecondaryForm была доступна для использования формой MainForm, необходимо подключить модуль формы SecondaryForm к модулю формы MainForm. Это делается очень просто.

1. Активизируйте форму MainForm и выберите в главном меню команду File | Use Unit... . В появившемся диалоговом окне выберите модуль Second (так называется модуль формы SecondaryForm) и нажмите кнопку OK (рисунок 7.34).



Рисунок 7.34. Окно для выбора подключаемого модуля

На экране не произойдет видимых изменений, но в секции implementation программного модуля Main добавится строка

uses Second;

Теперь обеспечим вызов формы SecondaryForm из формы MainForm. В большинстве случаев формы вызываются при нажатии некоторой кнопки. Добавим такую кнопку на форму MainForm.

2. Отыщите в палитре компонентов на вкладке Standard значок с подсказкой Button, щелкните по нему, а затем щелкните по форме MainForm. На форме будет создана кнопка Button1 и в окне свойств отобразится список ее свойств. Перейдите к свойству Caption и замените текст Button1 на текст Secondary (рисунок 7.35).



Рисунок 7.35. Текст на кнопке записывается в свойстве Caption

Чтобы при нажатии кнопки отображалась форма SecondaryForm, необходимо для этой кнопки определить обработчик события OnClick. Это делается очень просто.

3. Активизируйте в окне свойств вкладку Events и сделайте двойной щелчок в поле события OnClick. Среда Delphi определит для кнопки обработчик события, поместив программную заготовку в исходный текст модуля Main. Вставьте в тело обработчика оператор SecondaryForm.Show, в результате метод обработки события примет следующий вид:

procedure TMainForm.Button1Click(Sender: TObject);

begin

SecondaryForm.Show;

end;

4. Выполните компиляцию и запустите приложение. Когда на экране покажется форма MainForm, нажмите кнопку Secondary. На экране покажется еще одна форма — SecondaryForm. Вы можете произвольно активизировать любую из двух форм (рисунок 7.36).



Рисунок 7.36. Приложение с двумя формами на экране

Таким образом, при использовании метода Show пользователь может работать одновременно с несколькими формами, переключаясь между ними.

Внимание! Переключаясь между формами MainForm и SecondaryForm, вы можете предположить, что они равноправны. Однако на самом деле это не так. Форма MainForm является главной, а форма SecondaryForm — второстепенной. В чем это проявляется? Да хотя бы в том, что если вы закроете форму MainForm, то форма SecondaryForm тоже закроется, и приложение завершится. Если же вы закроете форму SecondaryForm, то форма MainForm на экране останется.

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

5. Посмотрим, что произойдет, если в предыдущем примере заменить вызов метода Show на ShowModal.

procedure TMainForm.Button1Click(Sender: TObject);

begin

SecondaryForm.ShowModal;

end;

6. После компиляции и запуска приложения нажмите на форме MainForm кнопку Secondary. После появления формы SecondaryForm попробуйте активизировать форму MainForm. У вас ничего не выйдет, поскольку на этот раз форма SecondaryForm отображается в монопольном режиме (рисунок 7.37).



Рисунок 7.37. Вторая форма работает в монопольном режиме

Только закрыв форму SecondaryForm, вы вернетесь к форме MainForm. Теперь понятно и назначение метода ShowModal. С его помощью организуется пошаговый (диалоговый) режим взаимодействия с пользователем, который подробно рассмотрен в главе 9.

На этом мы закончим разговор о формах и перейдем к их содержимому — компонентам.

7.5. Компоненты

7.5.1. Понятие компонента

Понятие компонента является фундаментальным для среды Delphi. Без компонентов все преимущества визуальной разработки приложений исчезают и говорить становится не о чем. Поэтому соберите все силы и внимательно прочитайте этот параграф, пытаясь усвоить не только технику использования компонентов, но и саму их суть.

Существует два взгляда на компоненты.

  • Взгляд снаружи, точнее из среды визуальной разработки приложений. С этой точки зрения компоненты — это самодостаточные строительные блоки, которые вы берете из палитры компонентов и переносите на форму для создания собственно приложения. Примеры компонентов вам известны: это кнопки, списки, надписи и др.

  • Существует еще и взгляд изнутри, т.е. взгляд из программы на языке Delphi. С этой точки зрения компоненты — это классы, порожденные прямо или косвенно от класса TComponent и имеющие published-свойства. Экземпляры компонентов — это объекты этих классов, существующие в качестве полей формы. Среди опубликованных свойств компонентов обязательно присутствует имя (Name), под которым экземпляр компонента представляется в окне свойств.

Объединение этих двух точек зрения дает цельное представление о том, что такое компоненты. При работе с компонентами из среды визуальной разработки приложений вы всегда видите их лицевую сторону. Однако как только вы начинаете писать обработчики событий, и управлять компонентами программно, вы соприкасаетесь с программной стороной компонентов, суть которой — объекты. Таким образом, среда Delphi обеспечивает симбиоз визуального и объектно-ориентированного программирования.

При анализе структуры компонента обнаруживается, что его природа троична и лучше всего описывается формулой:

Компонент = состояние (свойства) + поведение (методы) + обратная реакция (события).

  • Состояние компонента определяется его свойствами. Свойства бывают изменяемые (для чтения и записи) и неизменяемые (только для чтения). Помимо этого, свойства могут получать значения либо на этапе проектирования (design-time), либо только во время выполнения программы (run-time). Первые устанавливаются для каждого компонента в окне свойств и определяют начальное состояние компонента. Во время выполнения приложения эти свойства могут быть изменены программно, соответственно изменится внешний вид и поведение компонента. Вторая группа — это свойства, которые не видны в окне свойств, и управлять которыми можно только программно. С точки зрения языка Delphi различие между этими группами свойств состоит в том, что первые объявлены в секции published, а вторые — в секции public.

  • Поведение компонента описывается с помощью его процедур и функций(методов). Вызовы методов компонента помещаются в исходный код программы и происходят только во время выполнения приложения. Методы не имеют под собой визуальной основы.

  • Обратная реакция компонента — это его события. События позволяют, например, связать нажатие кнопки с вызовом метода формы. События реализуются с помощью свойств, содержащих указатели на методы (см. гл. 3).

7.5.2. Визуальные и невизуальные компоненты

Все компоненты делятся на две группы: визуальные и невизуальные компоненты (рисунок 7.38).

  • Визуальные компоненты (visual components) — это видимые элементы пользовательского интерфейса: кнопки, метки, блоки списков и др. Они выглядят одинаково и на стадии проектирования, и во время работы приложения.

  • Невизуальные компоненты (non-visual components) — это, так сказать, бойцы невидимого фронта; они работают, но сами на экране не видны. К невизуальным компонентам относятся таймер, компоненты доступа к базам данным и др. В процессе проектирования такие компоненты представляются на форме небольшим значком. Их свойства устанавливаются в уже известном вам окне свойств. Некоторые компоненты хоть и являются невизуальными, могут что-нибудь отображать на экране. Например, невизуальный компонент MainMenu отображает на форме полосу главного меню, а компонент OpenDialog — стандартное диалоговое окно выбора файла.



Рисунок 7.38. Визуальные и невизуальные компоненты

Невизуальные компоненты могут иметь подписи (рисунок 7.38). Отображение подписей обеспечивается установкой переключателя Show component captions в окне Environment Options на вкладке Designer. Окно вызывается по команде меню Tools | Environment Options

7.5.3. «Оконные» и «графические» компоненты

Визуальные компоненты подразделяются на компоненты, рисуемые оконной системой Windows, и компоненты, рисуемые графической библиотекой VCL (рисунок 7.39). На программистском жаргоне первые называют «оконными» компонентами, а вторые — «графическими» компонентами.

  • «Оконные» компоненты (windowed controls) являются специализированными окнами внутри окна формы. Их самое главное качество — способность получать фокус ввода. К числу оконных компонентов относятся, например, компоненты Button, RadioButton, CheckBox, GroupBox, и т.д. Некоторые оконные компоненты (GroupBox, TabControl, PageControl) способны содержать другие визуальные компоненты и называются контейнерами (container controls). Отображение оконных компонентов обеспечивается операционной системой Windows. Для профессионалов, имевших дело Windows API, заметим, что оконные компоненты имеют свойство Handle. Оно связывает компонент среды Delphi с соответствующим объектом операционной системы.

  • «Графические» компоненты (graphical controls) не являются окнами, поэтому не могут получать фокус ввода и содержать другие визуальные компоненты. Графические компоненты не основаны на объектах операционной системы Windows, их отображение полностью выполняет библиотека VCL. К числу графических компонентов относятся, например, компоненты SpeedButton, Image, Bevel и т.д.



Рисунок 7.39. Компоненты, рисуемые оконной системой Windows и графической библиотекой Delphi

Общая классификация компонентов составлена, поэтому перейдем к обсуждению их свойств и событий. Очевидно, каждый компонент обладает специфичным набором свойств и событий и, казалось бы, изучать их следует в контексте изучения компонента. Так мы и будем поступать в будущем при рассмотрении отличительных свойств компонентов. Однако сейчас имеет смысл рассмотреть общие для большинства компонентов свойства и события.

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

7.5.4. Общие свойства визуальных компонентов

Визуальные компоненты имеют ряд общих свойств:
1   ...   15   16   17   18   19   20   21   22   ...   33


написать администратору сайта