Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование Часть 2 - Delphi

.pdf
Скачиваний:
24
Добавлен:
16.03.2015
Размер:
734 Кб
Скачать

21

3.1.4.Компиляция и выполнение проекта

Компиляция проекта выполняется командой Project|Compile ProjectName или использованием комбинации клавиш Ctrl+F9. При этом компилируются все исходные модули, содержимое которых изменялось после последней компиляции: для каждого программного модуля создаѐтся файл с расширением dcu. Затем компилируется файл проекта и компонуется (собирается) из dcu-модулей исполняемый файл, имя которого совпадает с именем файла проекта. Готовый к использованию файл может быть приложением (*.exe) или динамически загружаемой библиотекой (*.dll).

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

Кроме обычной компиляции, можно командой Project|Build ProjectName выполнить сборку (построение) проекта. В этом случае перекомпилируются все модули проекта, для которых доступны исходные тексты.

Готовый проект можно запустить на выполнение в среде Delphi либо в среде

Windows. Выполнение приложения из среды Delphi задаѐтся командой Run|Run (клавишей

F9 или кнопкой с зелѐным треугольником) и имеет следующие особенности:

нельзя запустить несколько копий приложения;

при возникновении исключительных ситуаций сначала выводятся сообщения

Delphi, а затем – приложения;

для аварийного завершения приложения (например, при зацикливании) необходимо выполнить команду Run|Program Reset;

для продолжения разработки проекта приложение надо закрыть.

3.2.Создание приложения

3.2.1.Этапы создания приложения

Разработка приложения Delphi состоит из двух этапов: создания интерфейса приложения и определения его функциональности.

Интерфейс определяет способ взаимодействия пользователя и приложения (какие применяются окна, каким образом пользователь управляет приложением). Интерфейс создаѐтся путѐм размещения на форме компонентов. Функциональность определяется процедурами, которые выполняются при возникновении определѐнных событий,

происходящих при действиях пользователя. При создании приложения необходимо:

уяснить задачу, которую надо решить;

разработать эскизы того, что должно появляться на экране компьютера;

написать сценарий работы будущей программы;

22

разработать (при необходимости) алгоритмы процедур, реализующих предусмотренные в сценарии действия;

реализовать проект;

выполнить тестирование и отладку;

подготовить проект к распространению.

3.2.2.Создание интерфейса приложения

Интерфейс приложения определяется компонентами, которые разработчик выбирает из палитры компонентов и помещает на форму. При проектировании интерфейса приложения действует принцип WYSIWYG (What You See Is What You Get) – что видите,

то и получите. Так как компонент много, то они в палитре распределены по страницам.

Для того чтобы поместить компонент на форму, необходимо перейти на нужную страницу, щѐлкнуть мышью по выбранному компоненту в палитре, а затем – в нужном месте формы. Другой способ задания компонента предполагает использование общего перечня всех компонент, который открывается командой View|Component List.

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

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

Работать с компонентами можно через буфер. Предварительно нужные компоненты следует выделить, а затем применить команды меню Edit. Другой способ работы с компонентами предлагает окно Object TreeView, которое впервые появилось в Delphi 6.

Дерево объектов отображает все компоненты и связи между ними. Используя дерево объектов, очень удобно перемещать компоненты из одного контейнера в другой, так как эта операция выполняется простым перетаскиванием компонента мышью.

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

При размещении компонента на форме Delphi автоматически вносит изменения в файл модуля и в файл описания формы. В файле модуля в описании класса формы добавляется строчка с описанием типа компонента. Описания всех типов начинаются с

23

буквы Т. Если на форму помещены три кнопки Button и компонент PaintBox, то в объявлении класса формы получим:

type

TForm1 = class(TForm)

PaintBox1: TPaintBox;

Button1: TButton;

Button2: TButton;

Button3: TButton;

private

{ Private declarations }

public

{ Public declarations } end;

Для помещѐнных на форму компонентов непосредственно на форме или в окне Инспектора объектов задают значения свойств. Сначала выбирают нужный компонент из списка в верхней части Инспектора объектов или, щѐлкнув по нему на форме, а затем задают значения свойств. Следует помнить, что некоторые свойства нельзя изменить на этапе дизайна, они доступны только во время выполнения программы. Такие свойства можно изменять программным путѐм. Свойства же, перечисленные в инспекторе объектов, разрешено изменять как на этапе проектирования, так и программно во время работы приложения (run time).

Многие свойства компонентов имеют значения по умолчанию, например, Name,

Caption, Visible, Color. Свойство Name определяет имя, под которым компонент известен в программе. Свойство Caption – это заголовок. Первоначально Caption получает значение от свойства Name. В дальнейшем эти свойства можно изменить. Строка, определяющая свойство Caption, может отсутствовать, а имя Name должно быть задано обязательно.

Например, для кнопки Button задано имя Button1, а свойство Caption, определяющее надпись на кнопке, имеет значение «Выполнить». При большом числе однотипных компонент им следует присваивать информативные имена.

Свойство Visible имеет тип ТBoolean, определяет видимость компонента. Если это свойство имеет значение true, то компонент видим.

Изменения свойств на этапе проектирования называют статическими. Статические изменения выполняют в окне Инспектора объектов. Изменения в ходе выполнения программы называют динамическими. Для реализации динамического изменения свойства в каком-либо обработчике события задают новое значение свойства с помощью

24

оператора присваивания. Например, чтобы компонент стал невидим во время выполнения программы, надо изменить значение свойства Visible на False:

Label1.Visible:= False;

Или во время выполнения программы можно изменить надпись на кнопке:

Button1.Caption:='Выполнить';

Для задания свойств в Инспекторе объектов действуют редакторы свойств, которые могут быть нескольких типов:

• текстовый – свойство вводится и редактируется как строка символов. Delphi

интерпретирует строку (в зависимости от свойства) как данные числового или строкового типа;

перечисляемый – свойство выбирается из списка. Список раскрывается при щелчке мышью по кнопке со стрелочкой, которая появляется при переходе в область значений свойства (например свойство Visible);

множественный – свойство представляет собой комбинацию значений из предлагаемого списка. Слева от названия такого свойства расположен значок +. Список,

содержащий возможные значения, открывается двойным щелчком по названию свойства

(свойство BorderIcons);

• объект – свойство является объектом, то есть содержит другие свойства, которые могут редактироваться самостоятельно. Например, свойство Font включает Color, Name, и

др. Такое свойство слева от названия имеет символ + и задание значений может выполняться как для множественного свойства. Кроме того, если поместить курсор в область значения свойства, то появится кнопка с точками, щелчок по которой откроет окно для задания свойств. Пользоваться диалоговым окном для редактирования свойств удобнее, чем выбирать их из списка.

3.2.3.Определение функциональности проекта

Функциональность приложения определяется реакциями на возможные события. Для этого разрабатывают процедуры, которые вызываются при наступлении соответствующих событий.

Для создания процедуры обработки события (обработчика), необходимо выделить компонент и перейти в Инспекторе объектов на страницу событий (Events), на которой перечислены все возможные события компонента. Если выполнить двойной щелчок в области значения нужного события, то Delphi автоматически создаст в модуле формы заготовку процедуры-обработчика. На передний план переместится окно Редактора кода,

и курсор будет помещѐн в то место процедуры, где программист должен написать код.

При этом в описание класса формы будет добавлен заголовок процедуры-обработчика.

25

Название обработчика образуется добавлением к имени компонента названия события без приставки On. Например, TForm1.Button1Click. Если в Инспекторе объектов изменить имя компонента, то произойдѐт автоматическое переименование процедуры во всех файлах проекта.

Для удаления обработчика достаточно удалить код, написанный программистом.

Тогда при сохранении или компиляции модуля обработчик будет удалѐн из всех файлов проекта. Не рекомендуется удалять обработчики вручную. Следует помнить, что при удалении компонента все его обработчики остаются в модуле формы.

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

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

том числе для разных компонент. Такая процедура называется общим обработчиком и вызывается при возникновении любого связанного с ней события (например, одни и те же действия выполняются через меню и кнопкой).

Среди множества событий, предусмотренных для компонента, выделяют одно,

наиболее часто используемое. Создать заготовку обработчика такого события можно двойным щелчком по расположенному на форме компоненту.

3.2.4.События и их обработка

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

Событие представляет собой свойство процедурного типа, предназначенное для обеспечения реакции на те или иные действия. Задание значения этому свойству

(событию) означает определение метода, вызываемого при наступлении события.

События Delphi имеют различные типы, самым простым из которых является

TNotifyEvent, характерный для уведомляющих событий:

type TNotifyEvent = procedure (Sender: TObject) of object;

Единственный параметр Sender указывает объект-источник события. Более сложные события имеют кроме Sender и другие параметры, например событие, связанное с перемещением мыши, передаѐт координаты указателя.

26

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

3.2.5.Формирование кода

Код пишется в окне Редактора кода, который имеет встроенные средства,

существенно облегчающие работу. К инструментальным средствам, используемым при записи кода, относятся: Code Insight, Code Explorer, Object Browser, механизм навигации в коде.

Возможности Подсказчика Code Insight целесообразно использовать даже в самых простых программах, так как это сокращает время записи и, главное, гарантирует корректность введѐнных выражений. Если записать имя компонента, поставить точку и немного подождать, то появится длинный список всех свойств и методов класса, к

которому принадлежит компонент. Чтобы быстрее найти нужное название, желательно записать первые символы. Затем надо выбрать строку щелчком мыши и нажать на клавишу Enter (или дважды щѐлкнуть левой кнопкой мыши по нужной строке):

соответствующее имя будет вставлено в код. Повторный вывод Подсказчика выполняется комбинацией клавиш Ctrl+пробел. Эта же клавиатурная комбинация позволяет вывести

Code Insight на экран при отключении автоматического режима работы.

По умолчанию строки списка упорядочены по категориям. При желании их можно отсортировать по алфавиту, выбрав команду Sort by Name из контекстного меню.

Комбинацию клавиш Ctrl+пробел можно использовать после записи переменной,

оператора присваивания, в пустой строке. Во всех случаях появится подсказка. Правда,

иногда проще написать нужный текст, чем искать его в очень длинном списке.

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

Shift+Ctrl+пробел.

Иногда полезно воспользоваться имеющимися в Code Insight шаблонами стандартных структур языка Object Pascal. Перечень шаблонов выводится клавишами

Ctrl+J. Например, для оператора case один из шаблонов имеет вид:

case of

: ;

27

: ;

end;

Для быстрого перемещения по коду можно использовать закладки, которые устанавливаются командой контекстного меню Toggle Bookmark. Переход на нужную закладку выполняется командой контекстного меню Goto Bookmarks.

Очень удобно организован переход между объявлениями методов в интерфейсной секции и их реализацией. Для этой цели используются клавиши Ctrl+Shift и клавиша со стрелкой вверх или вниз (в зависимости от нужного направления перемещения).

3.2.6.Организация взаимодействия форм

Воперационной системе Windows можно выделить пять видов окон:

окна папок;

окна приложений;

диалоговые окна;

окна справочной системы;

окна сообщений.

Все виды окон представляют собой контейнеры. При разработке приложений,

функционирующих под управлением Windows, работа организуется в принятых в этой операционной системе окнах.

Стандартное окно в Windows имеет заголовок, кнопки для вызова системного

(оконного) меню, кнопки сворачивания, разворачивания, закрытия окна и рамки,

позволяющие плавно изменять размеры окна.

Диалоговые окна предназначены для задания параметров, уточнения характеристик или действий. Диалоговыми окнами пользуются, когда надо что-то настроить или изменить. Диалоговые окна стандартизованы (но не стандартны!) за счѐт применения в них типовых элементов управления. Диалоговые окна, как правило, имеют другой состав команд системного меню, не имеют средств для плавного изменения размеров, не содержат кнопок сворачивания и разворачивания окна.

Среда Windows поддерживает два режима отображения окон – модальный и немодальный. Диалоговые панели обычно работают в модальном режиме.

Модальное окно должно быть закрыто перед обращением к любому другому окну данного приложения. Модальное окно перехватывает управление, и пока оно не будет закрыто, попытка перейти в другое окно приложения блокируется Windows, операционная система выдаѐт предупреждающий сигнал. Запрет перехода в другое окно при незакрытом модальном окне относится только к текущему приложению, пользователь может активизировать любое другое приложение Windows. Программно возможен доступ к

28

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

Если форм в приложении несколько, то одна из них является главной. Главная форма отображается при запуске приложения, остальные создаются, но отображаются по запросу. Закрытие главной формы приводит к завершению работы приложения. По умолчанию главной назначается форма, созданная первой, но при необходимости главной можно назначить другую форму. Задание главной формы выполняется в окне Project Options на вкладке Forms.

Если одна форма выполняет действия с другой формой или с расположенными на ней элементами, то в списке uses раздела implementation модуля первой формы должна быть ссылка на модуль второй формы.

Допустим, создана главная форма main и дополнительная форма second. Чтобы из формы main можно было открыть форму second или получить какие-либо сведения с формы second, надо дополнительную форму подсоединить к главной. Для этого следует:

активизировать главную форму;

выполнить команду File|Use Unit. В окне Use Unit выбрать имя файла модуля нужной формы (second).

После этого в секции implementation модуля основной формы появится строка: uses second;

Если форма second должна получать сведения с главной формы main, то форму main

надо подсоединить к second. При наличии нескольких дополнительных форм, их надо связать друг с другом в соответствии с функциональностью проекта.

После того как дополнительные формы связаны с главной, необходимо организовать их вызов. В простейшем случае можно на главной форме установить кнопки, с помощью которых открывать нужные окна. Для обработки события OnClick, наступающего при нажатии на кнопку вызова дополнительного окна, используются методы Show и ShowModal. Например, записанный в обработчике события OnClick метод Form2.Show

откроет обычное окно, заданное формой Form2, а метод Form3.ShowModal откроет модальное окно.

3.3. Форма

Форма является основным интерфейсным элементом в Delphi. С точки зрения

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

определяющие функциональность приложения.

29

3.3.1.Свойства формы

Уформы достаточно много свойств. Первоначально Delphi устанавливает свойства

формы в значения по умолчанию. Изменить свойства формы можно в процессе проектирования (в Инспекторе объектов) или во время выполнения приложения.

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

Свойство Caption определяет заголовок окна. Изменить цвет, шрифт, размеры шрифта заголовка окна в Delphi нельзя. Это системные параметры Windows, которые задаются в свойствах экрана.

Разновидности форм определяются значениями свойства FormStyle и разнообразием заготовок, хранящихся в репозитории. Свойство FormStyle определяет, какой пользовательский интерфейс будет использован: Multiple Document Interface (MDI) –

многодокументный или Single Document Interface (SDI) – однодокументный. Это свойство может принимать значения:

fsMDIChild – дочернее окно MDI-приложения; fsMDIForm – главное окно MDI-приложения; fsNormal – обычное окно (значение по умолчанию):

fsStayOnTop – окно, расположенное поверх других окон на экране.

Если применяется SDI-интерфейс, то каждая форма (даже если их несколько)

существует в виде отдельного независимого окна. Одно из окон является главным, но не содержит других окон. В SDI приложении все формы имеют в свойстве FormStyle

значение fsNormal. Иногда устанавливается значение fsStayOnTop, чтобы окно всегда располагалось поверх других окон, даже если окно не активно.

MDI-интерфейс предполагает использование родительского окна, которое включает одно или несколько дочерних окон. Дочерние окна ограничены областью родительского окна и не могут выходить за его пределы. Дочерними окнами можно управлять из главного окна.

Стиль рамки задаѐтся свойством BorderStyle, которое имеет значения: bsDialog – неизменяемая в размерах рамка, свойственная окнам диалога; bsSingle – неизменяемая в размерах рамка обычного окна;

bsNone – окно без рамки и заголовка;

bsSizeable – изменяемая в размерах рамка обычного окна;

30

bsToolWindow – рамка аналогична bsSingle, но окно имеет уменьшенный заголовок

(целесообразно использовать для служебных окон);

bsSizeToolWin – рамка аналогична bsSizeable, но с уменьшенным заголовком.

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

разворачивания и закрытия окна. Если значение свойства BorderStyle предполагает наличие заголовка, то можно свойством булевского типа BorderIcons задать нужные системные элементы окна.

3.3.2.События формы

Вэтом разделе рассматриваются события, характерные только для формы.

Событие OnCreate происходит при создании формы. В обработчике этого события обычно устанавливают начальные значения для свойств формы и помещѐнных на неѐ компонентов, запрашивают у Windows необходимые ресурсы и выполняют другие действия, которые следует совершить до вывода формы на экран.

Событие OnShow происходит после того, как форма была создана, но перед тем, как она становится видимой.

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

например при щелчке по форме мышью. Событие OnDeactivate наступает, когда форма теряет активность.

Событие OnHide происходит перед тем, как форма становится невидимой.

Событие OnCloseQuery наступает при попытке закрыть форму. Действие задаѐтся пользователем (кнопка Close) или программно (вызван метод Close). В обработчик события передаѐтся булевский параметр CanClose, разрешающий или запрещающий действительное закрытие формы.

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

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

3.3.3.Создание форм разного вида

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

OnFormCreate выполнить действия:

объявить переменную типа HRgn;

создать регион функцией CreateRectRgn (для прямоугольного региона) или

CreateEllipticRgn (для эллиптического региона);