Лаб_ППИ

advertisement
Министерство РФ по связи и информатизации
ПОВОЛЖСКАЯ ГОСУДАРСТВЕННАЯ АКАДЕМИЯ ТЕЛЕКОММУНИКАЦИЙ И
ИНФОРМАТИКИ
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
к лабораторно-практическим работам
«Проектирование пользовательского интерфейса в Delphi»
Одобрено Методическим Советом ПГАТИ
«___»__________ 2004г.
Авторы-составители:
О.В. СИРАНТ, ст. преп. каф. ВТ,
Редактор:
Э.А. АКЧУРИН, к.т.н., доцент
Рецензент:
М.А. Кораблин, д.т.н., профессор
Самара
2004
СОДЕРЖАНИЕ
Рекомендуемая литература: ................................................................................. 3
Содержание отчета ........................................................................................................3
Сохранение кода............................................................................................................3
Лабораторная работа 1. “Исследование некоторых элементов интерфейса
приложения в среде Delphi “(2 часа) ...........................................................................4
Лабораторная работа 2. “Использование компонент Delphi для организации
многозначного и однозначного выбора. Организация простейшей поддержки
пользователя”.(4 часа) ..................................................................................................6
Лабораторная работа 3. Создание диалога на основании меню в среде Delphi. ...9
Лабораторная работа 4. “Создание SDI приложений”. ............................................13
Лабораторная работа 5. “Создание MDI приложений”. ..........................................16
Методические указания .............................................................................23
Введение ......................................................................................................................23
ПРИЛОЖЕНИЕ 1 ........................................................................................................26
Особенности использования ИСР Delphi для разработки интерфейса приложения.
26
ПРИЛОЖЕНИЕ 2 ........................................................................................................30
ПРИЛОЖЕНИЕ 3 ........................................................................................................32
ПРИЛОЖЕНИЕ 4. Описание свойств . .....................................................................41
2
Лабораторно-практический цикл включает в себя пять работ, направленных на
изучение основ проектирования пользовательского интерфейса с использованием
приемов и методов объектно-ориентированного программирования в системе
Delphi. Цикл может использоваться в лабораторном практикуме по дисциплине
«Проектирование пользовательского интерфейса» (специальность 220400).
Рекомендуемая литература:
А.К. Гультяев, В.А. Машин. Проектирование и дизайн пользовательского
интерфейса.: Санкт-Петербург, КОРОНАпринт, 2000. -349с.
2. Тео Мандел. Разработка пользовательского интерфейса. Пер. с англ.- ДМК
Пресс, 2001.
3. В. Гофман, А. Хоменко. Delphi 5. Наиболее полное руководство.: СанктПетербург, bhv, 2000. – 800 с.
4. Фаронов В. Delphi 5. Учебный курс – М.: Нолидж, 2001.
5. Под ред. М. Дадашова. Проектирование пользовательского интерфейса на
персональных компьютерах IBM.: Вильнюс, DBS LTD, 1993.- 186 с.
6. Фаронов В. Delphi 5. Руководство программиста – М.: Нолидж, 2001.
7. Интернет ( англ.):
http://osiris.sunderland.ac.uk/~cs0car/hci/hci_all.htm
http://www.acm.org/~perlman/
http://www.hcibib.org/hci-sites/
1.
Содержание отчета
1. Название работы, цель работы, задание в соответствии с вариантом.
2. Коды модуля (или модулей, если их несколько) и код проекта.
3. Вид формы и вид исполняемой программы.
4. Выводы по работе.
Сохранение кода
 Создайте папку, где будут храниться все ваши программы;
 В этой папке создайте вложенную, в которой будут храниться все программы для
данного проекта (для каждого нового проекта отдельную папку)
 Выберите команду File/ Save project as. Сохраните два файла: файл проекта с
расширением (.dpr) и файл модуля формы с расширением (.pas).
 После окончательной отладки проекта сохраните все файлы командой Save All.
3
Лабораторная работа 1. “Исследование некоторых элементов интерфейса
приложения в среде Delphi “(2 часа)
1. Цель работы: составление простейшего интерфейса пользователя. Изучить
изменения свойств объектов среды программирования Delphi. Проектирования
интерфейса с использованием метафоры «что видишь, то и получаешь».
2.
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
3.
1)
2)
3)
4)
5)
6)
7)
8)
4
Контрольные вопросы:
Основные принципы создания интерфейса?
Назначение Дизайнера Форм в среде программирования Delphi (Form Designer).
Назначение Окна редактора исходного текста ( Editor Window).
Какие типы панелей Вы знаете?
Взаимодействие между пользователем и компьютером?
Способы, которыми пользователь мог бы связываться с компьютером?
Основные принципы создания интерфейса?
Цель создания эргономичного интерфейса?
Элементы главного меню в Delphi и их назначение.
Назначение и закладки Палитры Компонент (Component Palette).
Что позволяет определить Инспектор Объектов (Object Inspector)?
Что отражает Редактор?
Какие компоненты относятся к визуальным, а какие к невизуальным компонентам?
Порядок выполнения работы.
Запустите ИСР Delphi.
Создайте новое приложение, для этого задайте команду File/ New Application,
если проект не был создан при открытии программы.
Положите на форму объекты TMemo, TButton и TListBox.
Выделите объекты TListBox, TMemo. (Удерживая нажатой клавишу <Shift>,
щелкните на одном и другом объекте).
Установите Высоту (Height) и Ширину (Width) по большему значения, выбрав
меню Edit / Size.
Выберите пункт меню Edit / Align и установите выравнивать по горизонтали в
значение Center. Измените значение на Left Sides.
Измените свойство объектов Color. Каким способом это можно сделать ещё?
Установите цвет в соответствии с № варианта (таблица 1).
Настройте свойство Font для объекта TMemo, для этого дважды щелкните
мышкой в поле ввода. Установите в диалоговом окне тип шрифта (Font) размер
(Size) и цвет шрифта (Color) в соответствии с вариантом.
Таблица 1
№
Цвет объекта
Цвет шрифта
Размер шрифта
0.
Красный
Белый
24
1.
Синий
Черный
18
2.
Черный
Зеленый
20
3.
Зеленый
Черный
22
4.
Белый
Синий
32
5.
Черный
Белый
14
6.
Синий
Красный
16
7.
Белый
Зеленый
34
8.
Голубой
Черный
18
9.
Зеленый
Красный
38
9) Сохраните Вашу программу. Для этого:
 Создайте папку (директорию), где будут храниться все ваши программы;
 В этой папке создайте поддиректорию (папку), в которой будут храниться
все программы для данного проекта.
 Выберите команду File/ Save project as. Сохраните два файла: файл проекта с
расширением (.dpr) и файл модуля формы с расширением (.pas).
10) Поместите две кнопки TButton в нижнюю часть формы.
11) Введите в свойство Caption на первой кнопке «Выход» или «Закрыть».
12) Создайте процедуру действия этой кнопки для закрытия программы. Для этого
дважды щелкните по ней мышью на форме. Добавьте строчку " close " в
процедуре TForm1.Name1Click:
13) Сохраните изменения в программе и проекте командой Save All системного
меню. Просмотрите, какие файлы сохранились в Вашей папке. Определите что
это за файлы?
14) Выполните программу, задав команду Run. Посмотрите реакцию на нажатие
кнопки «Выход».
15) Введите в ListBox1 несколько строк, которые затем можно использовать для
выбора, для этого дважды щелкните в правом поле свойства Items, и в
открывшимся окне введите несколько строк.
16) Очистите строки в поле Memo1 (свойство Lines).
17) Вторую кнопку используйте для ввода строк, выбранных из списка ListBox1 в
Memo1.
В процедуре нажатия кнопки введите следующий код:
Procedure TForm1.Button2Click(Sender:TObject);
Var n:integer;
begin
n:=ListBox1.ItemIndex;
Memo1.Lines.Add( ListBox1.Items.Strings[n]);
end;
18) Изменить внешний вид главной формы. Для этого с помощью Инспектора
объектов сделать следующие установки:
 выделить саму форму;
 в списке свойств BorderIcons установить значения biMinimize=False и
biMaximize = False (кнопка закрытия в строке заголовка);
 для свойства BorderStyle установить значение bsSingle (неизменяемые размеры);
 для свойства WindowState установить значение wsMaximized (полноэкранный
режим).
19) Запустить приложение на выполнение и убедиться в исполнении заданных
свойств.
20) Составьте отчет.
5
Лабораторная работа 2. “Использование компонент Delphi для организации
многозначного и однозначного выбора. Организация простейшей поддержки
пользователя”.(4 часа)
1.
2.
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
3.
Цель работы: создать программу, демонстрирующую различные способы, с
помощью которых можно изменять пользовательский интерфейс при
выполнении программы. Программа должна позволять в режиме выполнения
изменять размер, цвет и внешний вид объекта TShape, размер и цвет самой
формы. Использовать строку статуса для отображения подсказки пользователю.
Контрольные вопросы:
Назовите основные принципы проектирования: объект – действие; действие –
объект.
Согласованность
интерфейса.
Аспекты
согласованности:
физическая,
синтаксическая, семантическая.
Назовите основные стили взаимодействия с интерфейсом пользователя.
Каким образом программируются события в процессе выполнения программы?
Назначение формы, как основного элемента интерфейса?
Какое свойство компонента ScrollBar влияет на направление полосы прокрутки?
Как можно обратиться к обработчику события в Delphi?
Как подключит стандартный диалог изменения цвета в Delphi?
Какое свойство отвечает за надпись на компоненте? Какое свойство – за имя в
программе модуля?
Какие стили окна вы знаете и, какое свойство отвечает за создание стиля окна?
Поясните, какими компонентами можно реализовать однозначный выбор?
Особенности стилей окна? Как стиль окна влияет на возможность изменения
размера окна? На подключение системного меню окна? Для каких целей удобнее
использовать стиль bsNone? Другие стили?
Назначение компонентов Button, ComboBox? Какой выбор осуществляется с
помощью компонента ComboBox?
Порядок выполнения работы.
Задание 1.
1) Создать новое приложение, на форме которого разместить две панели: – одну для
размещения на ней объектов TShape (компонент Shape) вместе с двумя полосами
прокрутки (ScrollBar) – в верхней части формы; вторую (внизу формы) – для
размещения на ней управляющих элементов: двух кнопок (компонент Button) и
выпадающего списка (компонент ComboBox).
2) Установите свойство Kind первого компонента ScrollBars в sbHorizontal, а
второго - в sbVertical. Переключитесь на страничку “Events” в Инспекторе
Объектов и создайте заготовки метода для отклика на событие OnChange для
каждой полосы прокрутки.
3) Введите коды в заготовки методов ScrollBar1Change и ScrollBar2Change, который
устанавливает свойства Width и Height фигуры TShape в соответствие с
положением “бегунка” на полосах прокрутки:
Shape1.Width := ScrollBar1.Position * 3; и
6
Shape1.Height := ScrollBar2.Position * 2;
(сомножители 3 и 2 введены только для лучшего представления).
4) Для удобства чтения с помощью Object Inspector, измените имя компонента
(свойство Name) с “Button1” (дается по умолчанию) на “FonColor”, а его
заголовок (свойство Caption) - на “Цвет фона”, а “Button2” на имя “ShapeColor”, и
заголовок - на «Цвет фигуры».
5) Для выбора нового вида фигуры используйте выпадающий список (ComboBox) и
используйте его свойство Items. В диалоговом окно текстового редактора (String
List Editor), введите названия элементов (Прямоугольник, Квадрат, Закругленный
прямоугольник, Закругленный квадрат, Эллипс и Окружность) в соответствии со
списком опций свойства Shape компонента Shape1.
6) Установите начальную фигуру на форме в зависимости от варианта (номер
варианта задается преподавателем):
Номер варианта
1.
2.
3.
4.
5.
6.
Фигура
Прямоугольник
Квадрат
Закругленный прямоугольник
Закругленный квадрат
Эллипс
Окружность
7) Установите надпись, которая будет отображаться в компоненте ComboBox при
запуске программы, в соответствии с выбранной фигурой.
8) Задайте код обработка события выбора фигуры в ComboBox:
procedure TForrnl.ComboBoxlClick(Sender: TObject);
begin
Shape 1.Shape := TShapeType(ComboBoxl.Itemlndex);
end;
9) Для изменения цвета формы и фигуры поместите на форму компонент
ColorDialog из палитры компонентов (на страничке “Dialogs”)
10) Введите соответствующий код для подключения диалога изменения цвета
Изменение цвета фона и цвета фигуры должно производиться с помощью кнопок
«Цвет фона» и «Цвет фигуры», которые в свою очередь вызывают окно диалога
изменения цвета.
procedure TForml.ShapeColorClick (SenderTObject);
begin
if ColorDialog 1.Execute then Shape 1.Brush.Color := ColorDialogl.Color;
end;
Данный код при нажатии кнопки "Цвет фигуры " во время выполнения вызывает
стандартное диалоговое окно выбора цвета.
11) Аналогично задайте код для изменения цвета фона кнопкой "Цвет фона".
12) Сохраните программу в своей папке и запустите на выполнение.
13) Проанализируйте работу программы. Как созданное Вами окно и полосы
прокрутки реагируют на изменение размеров окна?
14) Сохраните программу под именем SHAPEDEM.
7
Задание 2.
1) Создать новое приложение (можно использовать предыдущий проект). В
нём разместите не одну, а две фигуры TShape.
2) Замените компонент ComboBox панелью с 6-тью кнопками однозначного
выбора для выбора каждой из фигур. Создайте соответствующий код в
модуле формы.
3) Создайте расширенный выбор для выбора одной или двух фигур, для этого
используйте элементы CheckBox. Следует так выбрать свойства
компонент, чтобы при выборе каждого из элементов TShape
визуализировалась бы своя панель кнопок (RadioGroup) для выбора
фигуры.
4) Создайте обработчики события для элементов CheckBox, RadioGroup1 и
RadioGroup2 ( см. приложение 3).
5) Добавьте строку статуса и задайте код обработчика таким образом, чтобы
в ней отображалась подсказка (Hint) при наведении мышью на
соответствующий элемент (см. приложение 2 ).
6) Сохраните программу под другим именем, например, под именем
SHAPEDEM2.
7) Проанализируйте работу программы. Сравните полученный интерфейс с
интерфейсом предыдущей программы
8) Составьте отчет.
4. Методические указания к выполнению работы 2
Элементы в список компонента ComboBox Вы можете ввести как в режиме
проектирования, так и при выполнении программы. При этом в режиме
проектирования Вы можете просто ввести нужные элементы в список Items, щелкнув
маленькую кнопку с тремя точками в правой части строки Инспектора Объектов,
показывающей данное свойство (Items). В диалоговом окно текстового редактора
(String List Editor) введите элементы (рис.1), список этих элементов совпадает со
списком опций свойства Shape компонента Shape1 (Shape), формирующие
перечислимый тип TShapeType:TShapeType = (stRectangle, stSquare, stRoundRect,
stRoundSquare, stEllipse, stCircle);
Для создания отклика на щелчок пользователем по выпадающему списку
ComboBox1 нужно в режиме проектирования выделить компонент ComboBox1 на
форме (как всегда, просто щелкнув по нему левой кнопкой мыши), затем дважды
щелкните по пустому полю напротив события OnClick на страничке “Events” в
Инспекторе Объектов.
Вставьте одну строчку кода, чтобы метод выглядел следующим образом:
procedure TForm1.ComboBox1Click(Sender: TObject);
begin
Shape1.Shape := TShapeType(ComboBox1.ItemIndex);
end;
8
Эта строчка кода устанавливает свойство Shape компонента Shape1 в вид,
который пользователь выберет в выпадающем списке. Этот код работает благодаря
соответствию между порядковыми членами перечислимого типа и числовыми
значениями различных элементов в ComboBox, первый элемент перечислимого типа
имеет значение 0, что соответствует первому элементу, показанному в ComboBox
(см. рис.1).
Рис.1: Текстовый редактор для ввода строк
На элементы в списке ComboBox также можно сослаться по их порядковому
номеру, начиная с 0. Именно поэтому так важно (в данном случае) вводить
указанные строки в строгом соответствии с декларацией типа TShapeType. Таким
образом, используя преобразование типа “TShapeType(ComboBox1.ItemIndex)”, Вы
можете указать компилятору, что общего имеют элементы в ComboBox и
перечислимый тип в TShapeType: а именно, порядковые номера.
Лабораторная работа 3. Создание диалога на основании
меню в среде Delphi.
1.
Цель работы: научиться создавать меню в виде строки, выпадающего меню;
проанализировать принципы создания меню, создавать поддержку для неопытного пользователя в виде всплывающей подсказки и опытного пользователя с
использованием горячих клавиш.
2. Контрольные вопросы:
1) Назначение меню? Какие типы меню используются в интерфейсе?
2) Основные принципы проектирования меню? Принципы размещения пунктов
меню?
3) Как добавить элемент меню в конце основного меню в среде Delphi?
4) Какое свойство меню влияет на размещение пунктов меню в одну или несколько
колонок?
5) Как создать субменю (подменю) в среде Delphi?
6) С чего начинается разработка приложений?
7) Как отредактировать один и несколько компонентов?
8) Приведите примеры простых свойств компонентов. Как они задаются?
9) Приведите примеры перечисляемых свойств компонентов. Как они задаются?
9
10) Как можно создавать процедуры обработки событий и как можно их удалять?
11) Как плотность размещения информации на экране влияет на качество
интерфейса?
12) Как создать процедуру обработки события выбора пункта меню?
13) Как придать параметру Sender тип требуемого в данный момент объекта?
3. Порядок выполнения работы.
1) Для создания программы откройте программу SHAPEDEM2, созданную в
предыдущей работе.
Её следует изменить таким образом, чтобы она сама обрабатывала изменение
размера окна, и в качестве управляющих элементов добавьте компонент меню. Для
этого:
2) Создайте главное меню для программы с помощью компонента MainMenu
(находится на страничке “Standard” палитры компонентов). Поместив его на
форму, дважды щелкните по нему мышкой - откроется редактор меню, в
котором Вы сможете ввести нужные Вам названия пунктов меню и, при
желании, изменить их имена (задаваемые Delphi по умолчанию) для
удобочитаемости. Создайте меню программы SHAPEDEM2 с тремя
главными пунктами: “Цвет, Фигуры, Выход”.
 Для первого пункта «Цвет» создадим следующие подпункты:
 Цвет фигуры
 Цвет окна
 Для второго:
 Прямоугольник
 Квадрат
 Закругленный прямоугольник
 Закругленный квадрат
 Эллипс
 Окружность
 Третий пункт меню будет содержать только одну команду «Выход»..
3) После создания всех пунктов и подпунктов меню воспользуйтесь свойством
Tag, имеющимся у каждого пункта меню, для того, чтобы назначить номера для
каждого из подпунктов меню, связанных с типом фигуры. Назначьте 0 свойству
Tag пункта “Прямоугольник”, 1 - пункту “ Квадрат”, 2 - пункту “ Закругленный
прямоугольник” и т.д.
4) Методы, реализующие реакцию на выбор подпунктов меню изменения вида
фигуры очень похожи на методы выбора фигуры через выпадающий список.
Следует использовыать свойство Tag пунктов меню.
5) Определите назначение параметра Sender. Как поставить в соответствие метод
и объект его вызвавший (на примере выбора фигуры через выпадающий список
в меню NewShapeClick).
6) Разберитесь с организацией изменения размеров окна процедурой FormResize;
Две полосы прокрутки в программе всегда будут располагаться возле границ
окна, независимо от его размеров. Выполнение этих действий требует от Вас
написания несколько более сложного программирования, чем было ранее.
procedure TForml.FormResize(Sender: TObject);
10
var
Menu, Caption, Frame: Integer;
begin
Caption := GetSystemMetrics(sm_cyCaption);
Frame := GetSystemMetrics(srn_cxFrame) * 2;
Menu := GetSystemMetrics(sm_cyMenu);
Scrollbar I.Max := Width; Scrollbar2.Max :=
Height;
Scrollbar2.Left := Width - Frame - Scrollbar2.Width; Scrollbar2.Height :=
Height - Frame - Caption - Menu; Scrollbarl .Top := Height - Scrollbar2.Width - Frame - Caption - Menu; Scrollbarl.Width := Width - Scrollbar2.Width - Frame;
end;
Первое, что делается в методе FormResize - запрашиваются системные параметры, определяющие размеры заголовка окна, огибающей его рамки и меню. Эта информация "добывается" путем вызова функции GetSystemMetrics, являющейся частью Windows API. Функции GetSystem Metrics передается один аргумент в виде
константы, определяющей вид запрашиваемой информации. Например, если Вы передадите функции константу sm_cyCaption (см. Приложение 1), получите в качестве
результата высоту заголовка окна (в пикселах). Полный список этих констант
имеется в on-line справочнике Delphi (Help|Windows API|Alphabetical functions|User
functions|GetSystemMerrics).
7) Создайте методы для подпунктов изменения цвета аналогично тем, которые были в программе SHAPEDEM и SHAPEDEM2.
8) Сохраните программу в своей папке с именем SHAPEDEM3.
9) Запустите программу на исполнение. Проанализируйте работу программы при
изменении размеров окна.
10) Измените свойства Align линеек прокрутки: для горизонтальной – на alBotton, а
вертикальной - на alRight.
11) Добавьте на форму компонент PoupMenu. С помощью конструктора меню
предусмотрите в контекстном меню выполнение пунктов основного меню для
установки цвета фона, цвета фигуры и изменение фигуры. Для этого поставьте в
соответствие пункты всплывающего меню и события OnClick на странице
Events инспектора объектов. Все ли компоненты имеют свойство PoupMenu?
12) Составьте отчет.
4. Методические указания к созданию программы с использованием меню.
1) Создание меню включает три шага:
 (1) помещение TMainMenu на форму,
 (2) вызов Дизайнера Меню через свойство Items в Инспекторе Объектов,
 (3) определение пунктов меню в Дизайнере Меню.
Главное меню для программы создается с помощью компонента MainMenu
(находится на страничке “Standard” палитры компонентов). Поместив его на форму,
дважды щелкните по нему мышкой - откроется редактор меню, в котором Вы
сможете ввести нужные Вам названия пунктов меню и, при желании, изменить их
имена (задаваемые Delphi по умолчанию) для удобочитаемости.
11
2) После создания всех пунктов и подпунктов меню для работы программы
SHAPEDEM2 нужно назначить номера для каждого из подпунктов меню, связанных
с типом фигуры. Для этого используется свойство Tag, имеющимся у каждого пункта
меню. Свойство Tag (типа Integer) специально введено в каждый компонент Delphi с
тем, чтобы программисты могли использовать его по своему усмотрению. 3) Методы,
созданные для подпунктов изменения цвета аналогичны тем, которые были в
программе SHAPEDEM:
procedure TForm1.ShapeColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Shape1.Brush.Color := ColorDialog1.Color;
end;
procedure TForm1.FonColorClick(Sender: TObject);
begin
if ColorDialog1.Execute then
Panel1.Color := ColorDialog1.Color;
end;
Методы уже вызываются из меню, а не из кнопок. Методы, реализующие
реакцию на выбор подпунктов меню изменения вида фигуры очень похожи на
методы выбора фигуры через выпадающий список:
procedure TForm1.NewShapeClick(Sender: TObject);
begin
Shape1.Shape := TShapeType((Sender as TMenuItem).Tag);
end;
Этот код “работает” правильно благодаря тому, что перечислимый тип
TShapeType в качестве начального имеет значение 0 и в свойство Tag подпунктов
меню мы также записали порядковые номера, начинающиеся с нуля.
Оператор as позволяет надежно преобразовывать типы из одного в другой: в
частности, преобразовать параметр Sender (имеющий общий тип TObject) в тип
TMenuItem. Как правило, параметр Sender в Delphi - это управляющий элемент,
посылающий сообщения функции, в которой он фигурирует. В данном случае, Sender
является пунктом меню, и, следовательно, Вы можете работать с этим параметром,
как если бы он был декларирован с типом TMenuItem.
Оператор as обеспечивает проверку преобразования в режиме выполнения
программы. Когда Вы используете оператор as, Вы можете быть уверены в том, что
преобразование Sender в TMenuItem реально будет произведено лишь в том случае,
если Sender действительно имеет тип TMenuItem. Для проверки принадлежности
параметра Sender определенному объекту используется оператор is (например, Sender
is TMenuItem).
12
Лабораторная работа 4. “Создание SDI приложений”.
1.
Цель работы: научиться создавать SDI приложение, изучить принцип
построения интерфейса этого приложения и получить практику написания кода
для создания подобного приложения для просмотра растровых изображений.
2.
1)
2)
3)
4)
5)
Контрольные вопросы:
В чем особенности SDI приложения? Какие типы приложений Вы знаете?
Возможно ли подключение других форм при создании SDI приложения?
Как создать панель инструментов в среде Delphi?
Можно ли использовать для создания панели инструментов отдельную форму?
Какое свойство следует использовать для просмотра графических объектов в
среде Delphi?
Как задать фильтр для диалога открытия файлов?
Как задать иконку (картинку) для компонента TSpeedButton?
Какое свойство компонента Imege ответственно за растягивание изображения,
какое - за выравнивание по центру?
Каким методом подключить стандартный диалог открытия или сохранения
файла?
6)
7)
8)
9)
Порядок выполнения .
Для демонстрации SDI создадим простую программу просмотра изображения.
Первым шагом построения программы является создание интерфейса. Выполните
следующие действия:
1) Выберите команду File/New Application, и появится пустое приложение.
2) Установите следующие свойства форм.
Свойство
Значение
Caption
Image Viewer
Name
frmMain
ShowHint
True
3) Поместите компонент TPanel в форму. Установите свойства:
Свойство
Значение
Align
alTop
Caption
4) Поместите три компонента TSpeedButton в TPanel и назовите их spbtnLoad,
spbtnStretch и spbtnCenter. Установите следующие их свойства.
Свойство
Значение
spbtnLoad.Hint
Load
spbtnLoad.Left
8
spbtnLoad.Top
8
spbtnStretch.AllowAlIUp
True
spbtnStretch.Grouplndex
1
spbtnStretch.Hint
Stretch
spbtnStretch.Left
48
3.
13
spbtnStretch.Top
8
spbtnCenter.AllowAlIUp
True
spbtnCenter.Grouplndex
2
spbtnCenter.Hint
Center
spbtnCenter.Left
80
spbtnCenter.Top
8
5) Поместите еще одну TPanel в форму и установите следующие ее свойства.
Свойство
Значение
Align
alClient
Caption
6) Поместите компонент ТImage во вновь созданную ТPanel и установите
следующие его свойства.
Свойство
Значение
Align
alClient
Name
imgMain
7) Добавьте в форму TOpenDialog со следующими свойствами.
Свойство
Значение
Filter
Bitmaps (*.bmp)|*.bmp
Name
opndlgLoad
Options
[ofPathMustExist,ofFileMustExist]
Delphi предоставляет вам множество значков для компонента TSpeedButton;
они находятся в каталоге IMAGES\BUTTONS. Для нас вполне подойдут следующие
установки свойств Glyph.
Свойство
Значение
spbtnLoad.Glyph
FLDROPEN.BMP
spbtnStretch.Glyph
FONTSIZE.BMP
spbtnCenter.Glyph
PICTURE.BMP
8) Сохраните проект, выбрав в меню команду File/Save Project As. Сохраните Unit1,
например, как Main, а проект — как EgSDIApp.
9) После создания интерфейса, перейдите к написанию исходного текста вашего
приложения. Для загрузки изображения выполните следующие действия:
 Дважды щелкните на компоненте spbtnLoad для автоматического создания
обработчика события OnClick.
 Введите код для просмотра изображения, загруженного из файла:
if opndlgLoad.Execute then
imgMain.Picture.LoadFromFile(opndlgLoad.FileName);
10) Выберите команду Run/Run для компиляции и запуска приложения и
попытайтесь открыть картинку.
11) Теперь добавьте возможность растягивания изображения при щелчке на
компоненте spbtnStretch.
 создаите обработчик события OnClick (дважды щелкните на компоненте
spbtnStretch)
 Введите код.
imgMain.Stretch:= spbtnStretch.Down;
Компонент TSpeedButton имеет свойство Down, которое равно True при нажатой
14
кнопке.
Свойство Stretch класса TImage позволяет растянуть картинку.
12) Для выравнивания картинки по центру используйте компонент spbtnCenter) и
введите следующий код:
imgMain.Center:= spbtnCenter.Down;
Методические указания.
Термин SDI (Single Document Interface) дословно означает однодокументный интерфейс и описывает приложения, способные загрузить и
использовать одновременно только один документ.
5.
Рис. 1. Программа Notepad как пример SDI-приложения
Программа Notepad, приведенная на рис. 1, является ярким представителем
такого класса программ.
Следует сказать несколько слов о термине документ. Приложения становятся
все более объекто - центричными, т.е. они работают с неким центральным объектом,
в который могут быть внедрены внешние объекты. В общем случае эти внешние
объекты обрабатываются другим специализированным приложением. Примером
может служить Wordpad, позволяющий внедрять любые OLE-объекты в свои файлы.
Но он остается при этом SDI-приложением, так как может работать только с одним
объектом (или документом в широком смысле этого слова) Wordpad.
Способность одновременно работать только с одним объектом не мешает
приложению использовать дополнительные формы, например диалоговые окна,
панели инструментов и прочее. Для реализации этих возможностей в Delphi просто
добавьте форму в ваше приложение и установите ее свойство FormStyle равным
fsSizeToolWin или fsToolWindow.
Еще одним примером может служить сама Delphi — огромное количество
панелей инструментов, меню, разнообразных библиотек компонентов,
взаимодействующих между собой форм... Delphi по умолчанию создает именно SDIприложение. Однако хранилище объектов предоставляет возможность назначить
новый шаблон проекта по умолчанию. Но в целом она остается SDI-приложением,
так как может загрузить и использовать одновременно только один объект.
15
Написание кода
Метод opndlgLoad.Execute вызывает стандартное диалоговое окно открытия
файла. Если вы выбрали файл и щелкнули на ОК, метод возвращает True и загружает
в свойство FileName полный путь к имени файла. При щелчке на Cancel или нажатии
клавиши <Esc> метод вернет False.
Компонент TImage предоставляет свойство Picture, которое является
экземпляром класса TPicture. Этот класс обеспечивает работу с растровыми
изображениями, пиктограммами и метафайлами. Один из его методов, LoadFromFile,
служит для загрузки изображения по имени файла.
Лабораторная работа 5. “Создание MDI приложений”.
1.
Цель работы: научиться создавать MDI приложение, изучить принцип
построения интерфейса этого приложения и получить практику написания кода
для создания подобного приложения для просмотра растровых изображений.
2. Контрольные вопросы:
1) В чем особенности MDI приложения? Приведите примеры подобных
приложений.
2) Возможно ли подключение других форм при создании SDI приложения?
3) Автоматическое создание форм в среде Delphi?
4) Динамическое создание форм в среде Delphi?
5) Какие MDI-свойства Вы знаете?
6) MDI-события TForm ?
7) MDI-методы TForm?
8) Поясните следующие свойства TForm: ActiveMDIChild, MDIChildren и
MDIChildCount , TileMode.
9) Как удалить дочернюю форму из автоматически создаваемых форм?
10) WindowMenu в MDI-приложениях?
11) Особенности создания дочерних форм в MDI-приложениях?
Порядок выполнения работы.
Создайте MDI-приложение, которое расширит возможности созданной ранее
программы просмотра изображений.
Создание интерфейса
Создайте интерфейс MDI-приложения для просмотра изображений, но каждое
изображение должно выводиться в отдельной, а не в главной форме. Выполните
следующие действия для создания родительской формы.
1) Выберите команду File/New Application, и появится пустое приложение.
2) Установите следующие свойства.
Caption
Image Viewer
FormStyle
fsMDIForm
Name
frmMDIParent
ShowHint
True
3) Поместите компонент TPanel в форму. Разместите её вверху формы по всей
ширине, для чего установите его свойства Align в значение alTop. Свойство
3.
16
Caption без значения.
4) Поместите три компонента TSpeedButton (для открытия файла, для размещения
изображения в центре формы и для растягивания изображения на всю форму) в
TPanel и назовите их spbtnLoad, spbtnStretch и spbtnCenter . Установите
следующие их свойства.
Свойство
Значение
spbtnLoad.Hint
Load
spbtnLoad.Left
8
spbtnLoad.Top
8
spbtnStretch.AllowAllUp
True
spbtnStretch.GroupIndex
1
spbtnStretch.Hint
Stretch
spbtnStretch.Left
48
spbtnStretch.Top
8
spbtnCenter.AllowAllUp
True
spbtnCenter.GroupIndex
2
spbtnCenter.Hint
Center
spbtnCenter.Left
80
spbtnCenter.Top
8
Свойства Glyph установите те же, что и для SDI-приложения (см. работу
"Создание SDI приложений".
5) Добавьте в форму компонент TOpenDialog и установите следующие его свойства.
Свойство
Значение
Filter
Bitmaps (*.bmp)]*.bmp
Name
opndlgLoad
Options
[ofPathMustExist,ofFileMustExist]
6) Теперь создайте дочернюю форму.
 Выберите из меню File/New Form, и появится пустая форма
 Установите ее свойства FormStyle в значение fsMDIChild
 Свойство Name, например, frmMDIChild. Свойство Position - poDefaultPosOnly
7) Поместите компонент TImage во вновь созданную форму и установите его
следующие свойства.
Align
alClient
Name
imgMain
8) Удалите дочернюю форму из списка автоматически создаваемых форм.
1. Выберите команду Project/ Options, и появится диалоговое окно Project
Options, показанное на рис. 1.14.
2. Выберите frmMDIChild в списке Auto-create forms.
3. Щелкните на кнопке. Форма frmMDIChild при этом будет перенесена в
список Available forms.
4. Щелкните на кнопке ОК.
9) Сохраните проект, выбрав команду File/Save Project As. Сохраните Unit1 как
MDIParent, а проект — как EgMDIApp.
10) Создав интерфейс, перейдем к написанию исходного текста приложения,
который будет очень похож на код для SDI-приложения.
11) Для загрузки изображения введите следующий код в обработчик события
17
OnClick компонента spbtnLoad.
procedure TfrmMDIParent.spbtnLoadClick(Sender: TObject);
begin
if OpnDlgLoad.Execute then
with TfrmMDIChild.Create(Application) do
begin
Caption:= opndlgLoad.FileName;
imgMain.Picture.LoadFromFile(opndlgLoad.FileName);
ClientWidth:= imgMain.Picture.Width;
ClientHeight:= imgMain.Picture.Height;
end;
end;
После запуска диалогового окна создается новый экземпляр дочерней формы и
загружается файл изображения. После загрузки размеры дочерней формы
изменяются так, чтобы можно было видеть все изображение.
Еще пара штрихов— и приложение заработает, как и предусматривалось.
Поскольку модуль ссылается на тип TfrmMDIChild, находящийся в модуле MDIChild,
после строки implementation следует добавить еще одну строку:
uses MDIChild;
12) Запустите приложение. Закройте дочернюю форму, щелкнув на кнопке Close.
Дочерняя форма не закрывается, а сворачивается в пиктограмму. Чтобы
заставить ее закрыться, следует добавить в коде обработчика OnClose класса
TfrmMDIChild изменить свойство Action:
Action:= caFree;
13) Создайте код для обработчиков события OnClick компонентов TSpeedButton
Stretch (растягивает изображение на всю клиентскую часть дочерней формы) и
Center (центрирует изображение) следующим образом
if not (ActiveMDIChild = Nil) then
if ActiveMDIChild 15 TfrmMDIChild then
TfrmMDIChild(ActiveMDIChild).imgMain.Stretch:= spbthStretch.Down;
и
if not (ActiveMDIChild = Nil) then
if ActiveMDIChild is TfrmMDIChild then
frmMDIChild(ActiveMDIChild).imgMain.Center:= spbthCenter.Down;
14) Остается последняя проблема — состояния кнопок Stretch и Center одинаковы
для всех дочерних форм. Для решения этой задачи добавьте в обработчик
события OnActivate класса TfrmMDIChild строки.
frmMDIParent.spbtnStretch.Down:= imgMain.Stretch;
frmMDIParent.spbtnCenter.Down:= imgMain.Center;
15) Для подключение модуля MDIParent в модуле MDIChild добавьте после строки
implementation строку.
uses MDIParent;
16) Сохраните созданную программу. Запустите и проанализируйте созданное MDIприложение.
18
Методические указания по создания MDI-приложения..
Термин MDI (Multiple Document Interface) дословно означает
многодокументный интерфейс и описывает приложения, способные загрузить и
использовать одновременно несколько документов или объектов. Примером такого
приложения может служить диспетчер файлов (File Manager).
Обычно MDI-приложения состоят минимум из двух форм — родительской и
дочерней.
Свойство родительской формы FormStyle установлено равным fsMDIForm.
Для дочерней формы установите стиль fsMDIChild.
Родительская форма служит контейнером, содержащим дочерние формы,
которые заключены в клиентскую область и могут перемещаться, изменять
размеры, минимизироваться или максимизироваться. В вашем приложении могут
быть дочерние формы разных типов, например одна — для обработки изображений, а
другая — для работы с текстом.
Создание форм
В MDI-приложении, как правило, требуется выводить несколько экземпляров
классов формы.
Поскольку каждая форма представляет собой объект, она должна быть создана
перед использованием и освобождена, когда в ней больше не нуждаются. Delphi
может делать это автоматически, а может предоставить эту работу вам .
Автоматическое создание форм
По умолчанию при запуске приложения Delphi автоматически создает по
одному экземпляру каждого класса форм в проекте и освобождает их при
завершении программы. Автоматическое создание обрабатывается генерируемым
Delphi кодом в трех местах.
 Первое — раздел интерфейса в файле модуля формы.
type
TForm1 = class (TForm)
private
{Закрытые объявления.}
public
{Открытые объявления.}
end;
В данном фрагменте кода объявляется класс TForm1.
 Вторым является место, в котором описывается переменная класса.
var Form1: TForm1;
Здесь описана переменная Form1, указывающая на экземпляр класса TForm1 и
доступная из любого модуля. Обычно она используется во время работы программы
для управления формой.
 Третье место находится в исходном тексте проекта, доступ к которому можно
получить с помощью меню View/ Project Source. Этот код выглядит как:
Application.CreateForm(TForm1, Form1);
Процесс удаления форм обрабатывается с помощью концепции владельцев
объектов: когда объект уничтожается, автоматически уничтожаются все объекты,
которыми он владеет. Созданная описанным образом форма принадлежит объекту
4.
19
Application и уничтожается при закрытии приложения.
Динамическое создание форм
Хотя автоматическое создание форм полезно при разработке SDI-приложений,
при создании MDI-приложении оно, как правило, неприемлемо.
Для создания нового экземпляра формы используйте конструктор Create
класса формы.
Приведенный ниже код создает новый экземпляр TForm1 во время работы
программы и устанавливает его свойство Caption равным 'New Form'.
Form1:= TForm1.Create(Application);
Form1.Caption:= 'New Form';
Конструктор Create получает от вас в качестве параметра потомка
TComponent, который и будет владельцем вашей формы. Обычно в качестве
владельца выступает Application, чтобы все формы были автоматически закрыты по
окончании работы приложения. Вы можете также передать параметр Nil, создав
форму без владельца (или владеющую собой — как вам больше нравится), но тогда
закрывать и уничтожать ее придется вам. В случае возникновения необрабатываемой
ошибки такая форма останется в памяти, что не говорит о высоком
профессионализме программиста...
В приведенном ниже коде Form1 указывает только на последнюю созданную
форму. Если вам это не нравится, воспользуйтесь приведенным ниже кодом —
возможно, он более точно отвечает вашим запросам:
with TFormI.Create(Application) do
Caption:= 'New Form';
Рис. 2. Диалоговое окно Project Options для установок опций текущего проекта
Даже при динамическом создании форм Delphi попытается навязать вам свои
20
услуги по созданию экземпляра каждой формы. Чтобы отказаться от них,
воспользуйтесь диалоговым окном Project Options, изображенным на рис. 2, и
удалите классы форм из списка Auto-create forms.
При разработке MDI-приложения метод Show не нужен, так как Delphi
автоматически показывает все вновь созданные дочерние MDI-формы. В случае SDIприложения вы обязаны использовать метод Show.
Если вы захотите получить доступ к отдельному дочернему экземпляру
класса, используйте свойство MDIChildren.
MDI-свойства TForm
 ActiveMDIChild
 MDIChildren и MDIChildCount
 TileMode
 WindowMenu
Объект TForm имеет несколько свойств, специфичных для MDI-приложений.
ActiveMDIChild
Это свойство возвращает дочерний объект TForm, имеющий в текущее время фокус
ввода. Оно полезно, когда родительская форма содержит панель инструментов или
меню, команды которых распространяются на открытую дочернюю форму.
Например, представим, что проект использует дочернюю форму, содержащую
элемент TMemo, названный memDailyNotes. Имя класса этой дочерней формы—
TfrmMDIChild. Родительская форма содержит кнопку Clear в панели инструментов,
которая удаляет содержимое memDailyNotes в активной дочерней форме. Вот как это
реализуется.
procedure TfrmMDIParent.spbtnClearClick(Sender: TObject);
begin
if not (ActiveMDIChild = Nil) then
if ActiveMDIChild is TfrmMDIChild then
TfrmMDIChild(ActiveMDIChild).memDailyNotes.Clear;
end;
В первой строке проверяется, равен ли ActiveMDIChild значению Nil, так как в
этом случае обращение к объекту вызовет исключительную ситуацию.
ActiveMDIChild равен Nil, если нет открытых дочерних форм или свойство FormStyle
не равно fsMDIForm.
Поскольку ActiveMDIChild возвращает объект TForm, компилятор не имеет
доступа к memDailyNotes — объекту TfrmMDIChild. Вторая строка проверят
соответствие типов, т.е. действительно ли ActiveMDIChild указывает на объект
TfrmMDIChild.
Третья строка выполняет преобразование типа и вызывает метод Clear
компонента memDailyNotes.
MDIChildren и MDIChildCount
Свойство MDIChildren является массивом объектов TForm, предоставляющих
доступ к созданным дочерним формам. MDIChildCount возвращает количество
элементов в массиве MDIChildren.
Обычно это свойство используется при выполнении какого-либо действия над
всеми открытыми дочерними формами. Вот код сворачивания всех дочерних форм
21
командой Minimize All.
procedure TFormI.mnuMinimizeAllClick(Sender: TObject);
var
iCount: Integers;
begin
for iCount:= MDIChildCount-1 downto 0 do
MDIChildren[iCount].WindowState:= wsMinimized;
end;
WindowMenu
Если вы будете сворачивать окна в порядке возрастания элементов массива,
цикл будет работать некорректно, так как после сворачивания каждого окна массив
MDIChildren обновляется и пересортировывается, и вы можете пропустить
некоторые элементы.
TileMode
Это — свойство перечислимого типа, определяющее, как родительская форма
размещает дочерние при вызове метода Tile. Используются значения tbHorizontal (по
умолчанию) и tbVertical для размещения форм по горизонтали и вертикали.
WindowMenu
Профессиональные MDI-приложения позволяют активизировать необходимое
дочернее окно, выбрав его из списка в меню. Свойство WindowMenu определяет
объект TMenuItem, который Delphi будет использовать для вывода списка доступных
дочерних форм.
Для вывода списка TMenuItem должно быть меню верхнего уровня. Это меню
имеет свойство Caption, равное swindow.
MDI-события TForm
В MDI-приложении событие OnActivate запускается только при переключении
между дочерними формами. Если фокус ввода передается из не MDI-формы в MDIформу, генерируется событие OnActivate родительской формы, хотя ее свойство
Active никогда и не устанавливается равным True.
Эта странность на самом деле строго логична: ведь, если бы OnActivate
генерировался только для дочерних форм, не было бы никакой возможности узнать
о переходе фокуса ввода от другого приложения.
MDI-методы TForm
Специфичные для MDI-форм методы перечислены ниже.
Arrangelcons выстраивает пиктограммы минимизированных дочерних форм в
нижней части родительской формы.
Cascade располагает дочерние формы каскадом, так что видны все их заголовки.
Next и Previous переходит от одной дочерней формы к другой, как будто вы нажали
<Ctrl+Tab> или <Ctrl+Shift+Tab>.
Tile выстраивает дочерние формы так, что они не перекрываются.
Создание интерфейса MDI-приложения
Интерфейс MDI-приложения очень похож на интерфейс разработанного ранее
SDI-приложения, но каждое изображение выводится в отдельной, а не в главной
22
форме.
Методические указания
Введение
Человеко-машинный интерфейс обеспечивает связь между пользователем и
компьютером - он позволяет достигать поставленных целей, успешно находить
решение поставленной задачи. Взаимодействие - обмен действиями и реакциями на
эти действия между компьютером и пользователем.
Имеется ряд стилей взаимодействий, которые делятся на два основных вида.
Первый – это использование интерфейса языка команд - ввод команд текстовыми
средствами; и второй – это непосредственное манипулирование. Таким образом,
имеется ряд способов, которыми пользователь мог бы связываться с компьютером:
 Языки команд - пользователь управляет системой, вводя соответствующие
команды в тестовом режиме;
 Вопрос и ответ - диалог, где компьютер задает вопросы, а пользователь
отвечает ему (или наоборот);
 Формы - пользователь заполняет формы или поля диалога, вводя данные в
необходимые поля;
 Меню - пользователь обеспечен рядом опций и управляет системой, выбирая
необходимые пункты;
 Прямое манипулирование - пользователь управляет объектами на экране
посредством устройства манипулирования, типа мыши. Другой термин,
используемый для прямого интерфейса манипулирования - Графический
Интерфейс Пользователя.
В различных операционных системах не сегодняшний день обычно
используются комбинированные стили взаимодействия из приведенных выше.
Например, в графическом интерфейсе операционной системы Windows
используется прямое манипулирование, а также меню, диалоговые элементы, формы
и язык команд. Такой подход важен для проектировщика, поскольку позволяет
тщательно рассмотреть поставленную задачу заказчика (будущего пользователя),
чтобы выбрать наилучший вариант решения задачи.
Цель создания эргономичного интерфейса состоит в том, чтобы отобразить
информацию настолько эффективно насколько это возможно для человеческого
восприятия и структурировать отображение на дисплее таким образом, чтобы
привлечь внимание к наиболее важным единицам информации. Основная же цель
состоит в том, чтобы минимизировать общую информацию на экране и представить
только то, что является необходимым для пользователя.
Основные принципы создания интерфейса
1. Естественность (интуитивность)
Работа с системой не должна вызывать у пользователя сложностей в поиске
необходимых директив (элементов интерфейса) для управления процессом решения
поставленной задачи.
2. Непротиворечивость
23
Если в процессе работы с системой пользователем были использованы некоторые
приемы работы с некоторой частью системы, то в другой части системы приемы
работы должны быть идентичны. Также работа с системой через интерфейс должна
соответствовать установленным нормам (например, использование клавиши Enter).
3. Не избыточность
Это означает, что пользователь должен вводить только минимальную информацию
для работы или управления системой. Например, пользователь не должен вводить
незначимые цифры (00010 вместо 10). Аналогично, нельзя требовать от пользователя
ввести информацию, которая была предварительно введена или которая может быть
автоматически получена из системы. Желательно использовать значения по
умолчанию, где только возможно, чтобы минимизировать процесс ввода
информации.
4. Непосредственный доступ к системе помощи
В процессе работы необходимо, чтобы система обеспечивала пользователя
необходимыми инструкциями. Система помощи отвечает трем основным аспектам качество и количество обеспечиваемых команд; характер сообщений об ошибках и
подтверждения того, что система делает. Сообщения об ошибках должны быть
полезны и понятны пользователю.
5. Гибкость
Насколько хорошо интерфейс системы может обслуживать пользователя с
различными уровнями подготовки? Для неопытных пользователей интерфейс может
быть организован как иерархическая структура меню, а для опытных пользователей
как команды, комбинации нажатий клавиш и параметры.
Размещение информации на экране
Количество информации, отображаемой на экране, называется экранной плотностью.
Исследования показали, что, чем меньше экранная плотность, тем отображаемая
информация наиболее доступна и понятна для пользователя и наоборот, если
экранная плотность большая, это может вызвать затруднения в усвоении
информации и ясном ее понимании. Однако опытные пользователи могут
предпочитать интерфейсы с большой экранной плотностью. Информация на экране
может быть сгруппирована и упорядочена в значимые части. Это может быть
достигнуто с использованием кадров (фреймов), методов типа цветового
кодирования, рамок, негативного изображения или других методов для привлечения
внимания.
Правила использования Меню в интерфейсе пользователя
Необходимый элемент автоматизированной системы - меню, позволяющее
пользователю выполнять задачи внутри приложения и управлять процессом решения.
Меню - набор опций, отображаемых на экране, где пользователи могут выбирать и
выполнять действия, тем самым, производя изменения в состоянии интерфейса.
Достоинство меню в том, что пользователи не должны помнить название элемента
или действия, которое они хотят выполнить - они должны только распознать его
среди пунктов меню. Таким образом, меню может использовать даже неопытный
пользователь. Однако проект меню должен быть тщательно продуман – чтобы меню
было эффективным, названия пунктов меню должны быть очевидными.
24
Меню может занимать много экранного места, но есть решение для этой проблемы использование всплывающего или ниспадающего меню. При нажатии на иконку,
строку меню или другой объект вызывается всплывающее или ниспадающее меню.
Основные принципы размещения пунктов меню
В процессе проектирования системы меню приложения, необходимо принять
наилучший способ отображения меню, чтобы оно было понятно и легко в
использовании. Обычно команды меню упорядочены некоторым иерархическим
способом. Основная проблема состоит в том, чтобы правильно распределить
различные пункты меню по различным уровням и правильно их сгруппировать.
Исследования показывают, что имеются четыре варианта для организации меню:
 Алфавитный
 Категорийный
 В соответствии с нормальными соглашениями
 В соответствии с частотой использования
Принципы проектирования меню:

Структура меню должна соответствовать структуре решаемой системой задачи,
организация меню должна отразить наиболее эффективную последовательность
шагов, чтобы достичь решения поставленной задачи;
 Пункты Меню должны быть краткими, грамматически правильными и
соответствовать своему заголовку в меню. Порядок пунктов меню выбирается
согласно соглашению, частоте использования, порядку использования, в
зависимости от потребностей задачи или пользователя.
 Выбор пунктов меню должен быть обеспечен несколькими способами – с
помощью клавиатуры, с помощью мыши, а также через другие объекты
пользовательского интерфейса. Необходимо использовать легко запоминаемые
сочетания клавиш для более быстрого доступа к пунктам меню, поскольку это
очень экономит время.
Формы – основной элемент интерфейса.
Назначение форм – удобный ввод и просмотр данных, состояния, сообщений
автоматизированной системы.
Основные принципы проектирования форм:
 Форма проектируется для более удобного, более понятного и скорейшего
достижения решения поставленной задачи. Если форма переносится из бумажной
формы, то передвижение по смежным полям не должно вызывать затруднений у
пользователя.
 Размещение информационных единиц на пространстве формы должно
соответствовать логике ее будущего использования: это зависит от необходимой
последовательности доступа к информационным единицам, частотой их
использования, а также от относительной важности элементов.
 Важно использовать незаполненное пространство, чтобы создать равновесие и
симметрию среди информационных элементов формы, для фиксации внимания
пользователя в нужном направлении.
25

Логические группы элементов необходимо отделять пробелами, строками,
цветовыми или другими визуальными средствами.
 Взаимозависимые или связанные элементы должны отображаться в одной форме.
ПРИЛОЖЕНИЕ 1
Особенности использования ИСР Delphi для разработки
интерфейса приложения.
Все работы по созданию приложений предполагают использование
Интегрированной Среды Разработки (ИСР) Delphi
ИСР Delphi следует спецификации, называемой Single Document Interface (SDI –
одно-документный интерфейс), и состоит из нескольких отдельно расположенных
окон .
Delphi - это комбинация нескольких важнейших технологий:
 Высокопроизводительный компилятор в машинный код
 Объектно-ориентированная модель компонент
 Визуальное построение приложений из программных прототипов
 Масштабируемые средства для построения баз данных
 Деловая графика.
Главные составные части среды программирования Delphi:
1. Дизайнер Форм (Form Designer)
2. Окно Редактора Исходного Текста (Editor Window)
3. Палитра Компонент (Component Palette)
4. Инспектор Объектов (Object Inspector)
5. Справочник (On-line help)
Дизайнер Форм (Form Designer) первоначально состоит из одного пустого окна,
которое Вы заполняете всевозможными объектами, выбранными на Палитре
Компонент. Редактор (Editor Window) содержит текст модуля формы, который
позволяет выполнять различные действия Вашему приложению. Палитра Компонент
позволяет выбрать нужные объекты для размещения их на Дизайнере Форм.
Инспектор Объектов (Object Inspector) – этот инструмент представляет из себя
отдельное окно, где вы можете в период проектирования программы устанавливать
значения свойств и событий объектов (Properties & Events).
На рис.1.1. представлен общий вид среды Delphi при открытии программы.
Формы - это объекты, в которые вы помещаете другие объекты для создания
пользовательского интерфейса вашего приложения.
Модули состоят из кода, который реализует функционирование вашего
приложения, обработчики событий для форм и их компонент.
Информация о формах хранится в двух типах файлов - .dfm и .pas, причем
первый тип файла - двоичный - хранит образ формы и ее свойства, второй тип
описывает функционирование обработчиков событий и поведение компонент. Оба
файла автоматически синхронизируются Delphi, так что если добавить новую форму
в ваш проект, связанный с ним файл .pas автоматически будет создан, и его имя
будет добавлено в проект.
26
Менеджер проектов дает возможность разработчику просмотреть все модули в
соответствующем проекте и снабжает удобным механизмом для управления проектами.
Палитра
Компонент
(Component
Palette)
Инспектор
объектов
Дизайнер
Форм (Form
Designer)
Окно
Редактора
Исходного
Текста (Editor
Window)
Рис.1.1. Среда разработки программ Delphi.
Менеджер проектов показывает имена файлов, время/дату выбранных форм и пр.
Можно немедленно попасть в текст или форму, просто щелкнув мышкой на
соответствующее имя.
Палитра Компонент
Набор и порядок компонент на каждой странице являются конфигурируемыми.
Вы можете добавить к имеющимся компонентам новые, изменить их количество и
порядок. Это можно сделать, вызвав всплывающее меню (нажать правую кнопку
мыши, когда указатель над Палитрой).
дается обзор стандартных и дополнительных
Страница Standard
Страница Additional компонент из Палитры Компонент Delphi
страницы диалогов (Dialogs),
Страница Dialogs
системных компонент (стр.System),
Страница System
страницы объектов в формате Visual Basic (VBX).
Страница VBX
Палитра Компонент (см. рис.1.2) позволяет Вам выбрать нужные объекты для
размещения их на Дизайнере Форм. Для использования Палитры Компонент просто
Рис.1.2: Палитра Компонент.
первый раз щелкните мышкой на один из объектов, и потом второй раз - на
Дизайнере Форм. Выбранный Вами объект появится на проектируемом окне и им
можно манипулировать с помощью мыши. Для того чтобы после добавления
компонентов восстановить нормальное функционирование мыши, следует щелкнуть
на кнопке со стрелкой выбора
27
Инспектор Объектов (см. рис.1.3.) состоит из двух страниц: первая страница
(Properties)- это список свойств, вторая (Events) - список событий
Страница
свойств
(Propeties)
Страница
событий
(Events)
Рис 1.3. Все изменения, связанные с определенным компонентом, делаются в
Инспекторе
Объектов.
К примеру,
Вы можете
изменить имя и размер компонента TLabel, изменяя
свойства Caption, Left, Top, Height, и Width.
Вы можете использовать закладки внизу Инспектора Объектов для
переключения между страницами свойств (Properties)- и событий (Events).
Страница событий связана с Редактором; если Вы дважды щелкнете мышкой на
правую сторону какого-нибудь пункта, то соответствующий данному событию код
автоматически запишется в Редактор, сам Редактор немедленно получит фокус, и Вы
сразу же имеете возможность добавить код обработчика данного события. При
добавлении нового объекта или кода, Delphi устанавливает т.н. “кодовую
синхронизацию” между визуальными элементами и соответствующими им кодовыми
представлениями.
За всеми объектами в программе стоит код на Паскале, к которому Вы имеете
доступ при “прямом” программировании. Вы можете изменить поведение любой
части Вашей программы во время выполнения путем написания соответствующего
кода.
Например, при добавлении на форму кнопки для вызова окна сообщения по
нажатию кнопки. Такое описание появляется при двойном щелчке мышкой
непосредственно на объект Button1 в форме или дважды щелкнуть мышью на
строчку On Click на странице Events в Инспекторе объектов. В любом случае Delphi
создаст процедуру или заголовок метода, куда вы можете добавить код.
procedure TForm1.Button1Click(Sender: TObject);
begin
{сюда следует добавить код для обработки соответствующего события}
end;
Создавая этот код, Delphi автоматически формирует декларацию объекта
TForm1, которая содержит процедуру ButtonClick, представляющую из себя
собственно обработчик события.
28
Type
TForm1 = class (TForm)
Button1: Tbutton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Если после получения этого кода Вы решите, что автоматически созданные
имена Вас не устраивают, их можно заменить. Например, Button1 на BatInput. Это
можно сделать, изменив свойство Name для Button1 при помощи Инспектора
объектов. Как только вы нажмете <Enter>, Delphi автоматически произведет
соответствующую синхронизацию в коде. Так как объект TForm1 существует в коде,
вы свободно можете добавлять любые другие поля, процедуры, функции. Вы можете
дописать в коде свою собственную процедуру, обрабатывающую событие, а не
делать это визуальным методом.
Выдержка из справочника Delphi:
SM_CXBORDER
быть изменен
SM_CYBORDER
Ширина огибающей окно рамки, размер которой не может
. Высота огибающей окно рамки, размер которой не может
быть изменен.
SM_CYCAPTION
Высота заголовка окна, включая высоту огибающей окно
рамки, размер которой не может быть изменен
(SM_CYBORDER).
SM_CXCURSOR
Ширина курсора.
SM_CYCURSOR
Высота курсора.
SM_CXFRAME
Ширина огибающей окно рамки, размер которой может
быть изменен.
SM_CYFRAME
Высота огибающей окно рамки, размер которой может
быть изменен.
SM_CXFULLSCREEN Ширина клиентской части для полноэкранного окна.
SM_CYFULLSCREEN Высота клиентской части для полноэкранного окна
(эквивалентна высоте экрана за вычетом высоты заголовка
окна).
SM_CXICON
Ширина иконки
SM_CYICON
Высота иконки.
SM_CYMENU
Высота полосы меню в одну строку. Это высота меню за
вычетом высоты огибающей окно рамки, размер которой не
может быть изменен (SM_CYBORDER).
SM_CXMIN
Минимальная ширина окна.
SM_CYMIN
Минимальная высота окна
SM_CXSCREEN
Ширина экрана.
SM_CYSCREEN
Высота экрана.
SM_MOUSEPRESENT Не 0, если мышь установлена.
29
ПРИЛОЖЕНИЕ 2
Компонент - строка состояния
Удобно отображать информацию о состоянии ПРИЛОЖЕНИЯ, используя
специальный компонент StatusBar Палитры компонентов, расположенный на
странице Win32.
Компонент StatusBar представляет coбoй cтpoкy состояния, которая может
иметь одну или несколько панелей для вывода тeкcтoвой информации.
Возможность поддержки строкой состояния нескольких панелей определяет
свойство SimplePanel типа Boolean. Если свойство имеет значение True, то в строке
состояния отображаетcя только ОДНА панель, a выводимый на ней текст можно
задать через свойство simpleText типа String. Если свойство SimplePanel имеет
значение False (по умолчанию), то строка состояния СОДЕРЖИТ несколько панeлей,
причём текст на каждой из них устанавливается c помощью свойства Text типа String
соответствующей панели.
Чтобы создать несколько панeлей в строке состояния и управлять ими, можно
использовать свойство Panels типa TStatusPanels, позволяющее обращаться к пaнeлям
cтpoки состояния как к элементам мaccивa, нумераций которых начинается c нуля.
Первым элементом бyдyт Panels[0], вторым —Panels[1] и т.д.
Рис. 2.1. Вывод строки состояния с помощью компонента StatusBar
procedure TForm1.IdleProc(Sender :TObject; var Done :Boolean);
begin
StatusBar1.Panels[0].Text:=TimeToStr(Time);
if GetKeyState(VK_NumLock) = 1
then StatusBar1.Panels[1].Text:='Клавиша "Num Lock" выключена';
else StatusBar1.Panels[1].Text:='Клавиша "Num Lock" включена';
if GetKeyState(VK_Insert) = 1
then StatusBarl.Panels[2].Text:='Режим замены'
else StatusBarl.Panels[2].Text:='Режим вставки'; Done:=false;
end;
Для проверки состояния клавиш используется API-функция GetKeyState.
Функция GetKeyState (nVirtKey: int) : short получает в качестве параметра код nVirtKey клавиши, а возвращает описание состояния этой клавиши в виде целого числа.
Если старший бит равен единице, это означает, что клавиша нажата, если равен
нулю — отпущена. Если клавиша типа <Num Lock> включена, то функция
возвращает 1 в младшем бите, а если выключена — 0. Для задания кодов клавиш
удобно использовать константы с именами VK_xxx, например, константы VK_space,
VK_F3 и VK_W соответствуют клавишам <Пробел>, <F3> и <W>. Эти константы
описаны в соответствующем модуле Dephi. Для получения кодов различных клавиш
можно использовать API-функцию VkKeyScan.
Вместо приведенного варианта решения можно поместить на форму компонент
таймер Timer и использовать обработчик его события OnTimer.
30
Часто в строке состояния отображают подсказки, поясняющие назначение того
или иного интерфейсного элемента. Наиболее простой способ выполнить это —
использовать свойство Hint компонентов и событие OnHint приложения.
Пример. Вывод подсказок в строке состояния.
Подсказки о назначении управляющих элементов выводятся во второй панели строки
состояния StatusBarl. В окне, представленном на рис. 8.15, указатель мыши находится
на кнопке Закрыть и отображается соответствующая подсказка.
Рис. 2.2. Подсказка в строке состояния
Ниже приводится код модуля uExtend, реализующего строку состояния.
unit uExtend; interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls,
StdCtrls, ExtCtrls;
type
TForm1 = class (TForm)
StatusBar1: TStatusBar;
Buttonl: TButton;
procedure FormCreate(Sender: TObject);
procedure PanelHint(Sender: TObject);
procedure ButtonlClick(Sender: TObject); private
{ Private declarations } public
{ Public declarations ) end;
var
Form1: TForm1;
implementation ($R
*.DFM)
procedure TForm1.FormCreate(Sender: TObject);
begin
// Свойству Hint интерфейсных элементов должны быть присвоены
// соответствующие значения
Application.OnHint:=PanelHint;
StatusBarl.Panels[0].Text:='Помощь';
end;
procedure TForm1.PanelHint(Sender: TObject);
begin
StatusBar1.Panels[1].Text:=Application.Hint;
31
end;
procedure TForml .ButtonlClick(Sender: TObject);
begin
Close;
end;
end.
Событию OnHint приложения назначается обработчик PanelHint. В обработчике PanelHint выполняется вывод в строку состояния значения свойства Hint
компонента, на котором установлен указатель мыши. Предварительно свойству Hint
интерфейсных элементов должно быть присвоено соответствующее значение. При
этом значение свойства showHint компонентов влияет только на отображение
посказок, выводимых рядом с компонентом, а в строке состояния эти подсказки
отображаются всегда, когда указатель мыши находится над данным интерфейсным
элементом.
Для обновления информации, отображаемой в строке состояния, можно
применять обработчик события ) OnIdle приложения. Когда приложение содержит
большое количество форм, для отображения информации о состоянии удобнее
использовать процедуру обработки события объекта-таймера. В этом случае на
форме размещается компонент Timer, затем создается обработчик его события OnTimer, в котором располагаются операторы отображения текста в строке состояния.
Данные в строке состояния обновляются при каждом событии таймера.
Событие таймера можно использовать для выполнения других операций.
ПРИЛОЖЕНИЕ 3
Использование переключателей
Переключатели (флажки) позволяют выбрать какое-либо значение из определенного множества. Они могут находиться во включенном (установленном) или
выключенном (сброшенном) состояниях. Анализируя состояние переключателя,
программист может выполнять соответствующие операции.
Для работы с переключателями Delphi предоставляет компоненты CheckBox,
RadioButton и RadioGroup. Классы компонентов CheckBox И RadioButton происходят
от того же класса, что и кнопка Button, — от класса TButtonControl. Поэтому иногда
такие переключатели называют кнопками с фиксацией: CheckBox — с независимой
фиксацией, RadioButton — с зависимой фиксацией.
Переключатель с независимой фиксацией
Переключатель с независимой фиксацией представлен компонентом CheckBox.
Данный переключатель действует независимо от других подобных переключателей,
несмотря на то, что по функциональному назначению их часто объединяют в группу
с общим названием, например, группы Показывать и Окно (рис. 3.1).
Переключатель выглядит как прямоугольник с текстовым заголовком. Если в
нем находится галочка, то обозначенная этим флажком опция включена. В этом
32
случае также говорят, что флажок установлен или отмечен. Если прямоугольник
пуст, то флажок сброшен. Действия с одним переключателем не отражаются на
состоянии других переключателей, если это не было специально предусмотрено, что
на практике применяется редко.
Рис. 3.1. Пример группы переключателей
Для определения состояния флажка используется свойство Checked типа
Boolean. По умолчанию оно имеет значение False, и флажок сброшен.
Пользователь может переключать флажок щелчком мыши. Если флажок
сброшен, то после щелчка он становится включенным, и наоборот. При этом
соответственно изменяется значение свойства checked. Флажок можно переключить
и с помощью клавиши <Пробел>, когда компонент checkBox находится в фокусе
ввода, и вокруг его заголовка имеется черный пунктирный прямоугольник.
Пример. Анализ состояния независимого переключателя.
If CheckBoxl.Checked then MessageDlg('Время истекло!', mtError, [mbOK], 0);
Сообщение Время истекло! выдается при включенном состоянии флажка
CheckBox1, управляющего параметром выдачи сообщения об истечении лимита
времени.
Флажком можно управлять программно, устанавливая свойство Сhecked в
требуемые значения.
Пример. Программное управление независимым переключателем (флажком).
CheckBox2.Checked:=true; CheckBox3.Checked:=false;
Флажок CheckBox2 устанавливается, а флажок CheckBox3 сбрасывается.
33
Сделать флажок недоступным для изменения, заблокировать его, можно путем
установки свойству Enabled значения False, например:
CheckBoxl.Enabled:=false;
После перехода переключателя в заблокированный режим он сохраняет свое
состояние, которое было до выполнения блокировки. То есть неактивный
переключатель может находиться во включенном и в выключенном состояниях.
Кроме двух состояний (включен/выключен) флажок может иметь еще и третье
состояние — запрещенное, или отмененное. Наличием или отсутствием отмененного
состояния управляет свойство AllowGrayed типа Boolean. Если это свойство имеет
значение True, то при щелчке кнопкой мыши флажок циклически переключается
между тремя состояниями: включенный, выключенный и отмененный. В отмененном
состоянии переключатель выделяется серым цветом, а в прямоугольнике находится
знак галочки.
Замечание
Отображение переключателем в отмененном состоянии галочки способно ввести
в заблуждение, так как подобное состояние можно интерпретировать как
включенное.
Свойство checked имеет значение True только для выбранного режима переключателя.
Для анализа и установки одного из трех состояний флажка (рис. 3.2) служит
свойство State типа TCheckBoxState. Оно может принимать следующие значения:
 CbUnchecked — флажок сброшен
 CbChecked - флажок установлен

CbGrayed — флажок запрещен
Рис. 3.2. Состояния переключателя CheckBox
При изменении состояния переключателя возникает событие OnClick, независимо от того, в какое состояние переходит переключатель. В обработчике события
Onclick обычно располагаются операторы, выполняющие проверку состояния
переключателя и осуществляющие требуемые действия.
Пример. Процедура обработки события выбора независимого переключателя.
procedure TForml.CheckBox3Click(Sender: TObject);
begin
case CheckBoxS.State of
cbUnchecked:CheckBoxS .Caption:='Переключатель включен';
cbChecked: CheckBoxS. Caption :='Переключатель не включен';
34
cbGrayed: CheckBoxS .Caption:='Переключатель запрещен1;
end;
end;
Флажок CheckBox3 при его переключении отображает в заголовке свое состояние.
Переключатель с зависимой фиксацией
Переключатели с зависимой фиксацией представлены компонентом RadioButton, их также называют кнопками однозначного выбора. Соответствующие элементы управления отображаются в виде круга с текстовой надписью.
Кнопки выбора обычно располагаются по отдельным группам, выделенным на
форме. Выбор переключателя является взаимно исключающим, то есть при выборе
одного переключателя другие становятся невыбранными. Delphi поддерживает
автоматическое
группирование
переключателей.
Каждый
переключатель,
помещенный в контейнер (о контейнерах речь пойдет ниже в этой главе), включается
в находящуюся на нем группу (рис. 3.3). Контейнерами обычно служат такие
компоненты, как форма Form, панель Panel и группа GroupBox.
Рис. 3.3. Виды контейнеров для переключателей
При работе с группой один из зависимых переключателей рекомендуется
делать выбранным, что можно выполнить при проектировании формы или в процессе
выполнения приложения. Например, для приведенной на рис. 3.26 формы это можно
выполнить следующим образом:
procedure TFormi.FormCreate(Sender: TObject);
begin
RadioButton2.Checked:=true;
RadioButton3.Checked:=true;
RadioButton6.Checked:=true;
RadioButton12.Checked:=true;
end;
Когда в группе выбран один из зависимых переключателей, то, в отличие от
независимого переключателя, его состояние нельзя изменить повторным щелчком.
Для отмены выбора зависимого переключателя нужно выбрать другой
переключатель из этой же группы.
__Замечание
35
Для компонента RadioButton событие OnClick возникает только при выборе
переключателя. Повторный щелчок на переключателе не приводит к
возникновению события Onclick.
Кроме уже упомянутых элементов — контейнеров, объединяющих зависимые
переключатели в группу, Delphi предлагает специализированный компонент RadioGroup (рис. 3.4), представляющий собой группу переключателей RadioButton. Такая
группа создана для упорядочения переключателей и упрощения организации их
взаимодействия по сравнению с добавлением их вручную к обычной группе.
Рис. 3.4. Группа переключателей RadioGroup
Группа переключателей RadioGroup может содержать другие элементы
управления, например, независимый переключатель checkBox или однострочный
редактор Edit.
Управление количеством и названиями переключателей производится с помощью свойства Items типа TStrings, которое позволяет получить доступ к
отдельным переключателям в группе. Это свойство содержит строки, отображаемые
как заголовки переключателей. Отсчет строк в массиве начинается с нуля: Items [0],
Items [1], и т.д. Для манипуляции со строками (заголовками) можно использовать
такие методы, как Add и Delete.
Доступ к отдельному переключателю можно получить через свойство ItemIndex типа Integer, содержащее позицию (номер) переключателя, выбранного в группе
в текущий момент. Это свойство можно использовать для выбора отдельного
переключателя или для определения, какой из переключателей является выбранным.
По умолчанию свойство ItemIndex имеет значение -1 и не выбран ни один из
переключателей.
Свойство Columns типа integer задает число столбцов, на которое разбиваются
переключатели при расположении в группе (по умолчанию 1). Это свойство
действует только на переключатели, принадлежащие массиву Items группы, и не
действует на другие управляющие элементы, например, однострочный редактор Edit
или надпись Label, размещенные в группе RadioGroup.
Пример. Работа с группой переключателей.
procedure TForml.FormCreate(Sender: TObject);
begin
RadioGroup1.Items.Clear;
RadioGroup1.Items.Add('Item 1');
RadioGroup1.Items.Add('Item 2');
36
RadioGroup1.Items.Add('Item 3');
RadioGroup1.Items.Add('Item 4');
RadioGroup1.Items.Add('Item 5');
RadioGroup1.Items.Add('Item 6');
RadioGroup1.Columns:=2;
RadioGroup1.Itemindex:=4;
end;
При создании формы в группу RadioGroup1 включается 6 переключателей,
расположенных в две колонки. Переключатель с заголовком Item 5 становится
выбранным.
Объединение элементов управления
При разработке приложения часто возникает задача объединения, или группирования различных элементов управления. Группирование может понадобиться,
например, при работе с переключателями на форме или при создании панели
инструментов.
Объединение элементов выполняется с помощью специальных компонентов
— контейнеров. Контейнер представляет собой визуальный компонент, который
позволяет размещать на своей поверхности другие компоненты, объединяет эти
компоненты в группу и становится их владельцем. Владелец также отвечает за
прорисовку своих дочерних элементов. Дочерний элемент может ссылаться на
владельца с помощью свойства Parent.
В предыдущем разделе рассмотрен специализированный компонент — контейнер RadioGroup, используемый для организации группы зависимых переключателей. В качестве универсальных контейнеров для различных объектов Delphi
предлагает такие компоненты:
 Группу GroupBox
 Панель Panel
 Область с прокруткой ScroiiBox
 Фрейм (рамку) Frame
Отметим, что форма также является контейнером, с которого обычно и начинается
конструирование интерфейсной части приложения. Форма является владельцем всех
расположенных на ней компонентов.
Группа
Группа используется в основном для визуального выделения функционально
связанных управляющих элементов. Для работы с группой Delphi предоставляет
компонент GroupBox, задающий прямоугольную рамку с заголовком (свойство Caption) в верхнем левом углу, объединяющий содержащиеся в нем элементы
управления. Например, на рис. 3.1 группа с заголовком Показывать используется
для отображения функциональной зависимости между шестью переключателями,
устанавливающими различные параметры, и полем ввода Затенение полей. На рис.
3.4 группа используется для объединения зависимых переключателей RadioButton.
37
Панель
Панель представляет собой контейнер, в котором можно размещать другие элементы
управления. Панели применяются в качестве визуальных средств группирования, а
также для создания панелей инструментов и строк состояния. Для работы с панелями
в Delphi предназначен компонент Panel.
Панель имеет край с двойной фаской: внутренней и внешней. Внутренняя фаска
обрамляет панель, а внешняя отображается вокруг внутренней.
Ширина каждой фаски в пикселях задается свойством BevelWidth типа TBevelWidth. Значение типа TBevelwidth представляет собой целое число (TBevelwidth =
1. .MaxInt). По умолчанию ширина фаски равна 1.
Свойства BevelInner и BevelOuter типа TPanelBevel определяют вид внутренней и внешней фаски соответственно. Каждое из свойств может принимать
следующие значения:

bvNone — фаска отсутствует

bvLowered — фаска утоплена


bvRaised — фаска приподнята
bvSpace — действие не известно
По умолчанию свойство BevelInner имеет значение bvNone, а свойстве BevelOuter — значение bvRaised.
Между фасками может быть промежуток, ширина которого в пикселах определяется свойством Borderwidth типа TBorderWidth. По умолчанию ширина
промежутка равна нулю, т. е. промежуток отсутствует.
На рис. 3.5 показаны различные виды панелей в зависимости от установки
свойств BevelInner, BevelOuter, BorderWidth И BevelWidth, значения которых
приведены в табл. 3.1.
Панель
BevelInner
Рис. 3.5. Виды панелей
Таблица 3.1 Значения свойств панелей
BevelOuter
BorderWidth
BevelWidth
Panel1
Panel2
Panel3
Panel4
bvNone
bvNone
bvLowered
bvNone
bvRaised
bvRaised
bvRaised
bvLowered
38
1
5
1
1
0
0
0
0
Panel5
Panel6
Panel7
Panel8
Panel9
bvNone
bvLowered
5
0
bvRaised
bvLowered
1
0
bvRaised
bvRaised
5
5
bvLowered
bvLowered
5
5
bvLowered
bvRaised
1
10
Управление расположением заголовка панели осуществляется с помощью
свойства Alignment типа TAlignment, которое может принимать следующие
значения:
 taLeftJustify — выравнивание по левому краю
 taCenter — выравнивание по центру (по умолчанию)
 taRightJustify — выравнивание по правому краю
Если заголовок панели не нужен, то значением свойства Caption должна быть пустая
строка.
Область прокрутки
Область прокрутки представляет собой окно, предоставляющее возможность
прокрутки информации. Внутри нее размещаются другие управляющие элементы. В
Delphi область прокрутки представлена компонентом ScrollBox.
Компонент ScrollBox является элементом управления, область поверхности которого
может быть больше той, которую видит пользователь. Если какой-либо элемент,
содержащийся в компоненте ScrollBox, виден не полностью, то автоматически могут
появляться полосы прокрутки: горизонтальная (рис. 3.6, слева), вертикальная или обе
одновременно. При увеличении размеров области полосы прокрутки могут
автоматически исчезать (рис. 3.6, справа), если в них нет необходимости.
Рис. 3.6. Компоненты ScrollBox
Компонент ScrollBox удобно использовать, например, в том случае, когда форма
содержит панель инструментов и строку состояния. Если не все управляющие
элементы полностью видны в отображаемой области окна, то на нем могут
присутствовать полосы прокрутки. Однако при использовании вертикальной полосы
прокрутки для формы не будет видна панель инструментов или строка состояния
(рис. 3.6, слева).
Этого не произойдет, если при проектировании расположить на форме компонент
ScrollBox и установить его свойству Align значение alClient. Область прокрутки
займет все место формы, не занятое панелью инструментов и строкой состояния,
после чего в ней размещаются другие элементы управления. Теперь, в случае
появления полос прокрутки, они будут принадлежать компоненту ScrollBox,
обеспечивая доступ ко всем управляющим элементом. В то же время панель
39
инструментов и строка состояния , расположенные выше и ниже прокручиваемой
области, будут видны и доступны для выполнения операций
40
ПРИЛОЖЕНИЕ 4. Описание свойств
Свойства
Name
.
Описание свойства
Имеют все компоненты Delphi. Содержит идентификатор компонента,
по которому в программном коде производится обращение к этому
компоненту. Каждому компоненту автоматически присваивается имя
(латинскими буквами), исходя их типа компонента, например Lebel1.
Component Доступно для всех компонентов. Содержит индекс данного
Index
компонента в списке Components его владельца. Первый компонент в
списке имеет значение свойства равное 0, второе –1 и т.д.
Tag
Служит для хранения произвольного целого числа или указателя.
Caption
Содержит текст, который отображается как надпись компонента.
BordenIcon Доступно для компонента Form. Определяет, какие кнопки
Значение: отображаются в строке заголовка формы.
biSystemMenu В строке заголовка формы отображается значок системного меню.
biMinimize
В строке заголовка формы отображается кнопка Свернуть
biMaximize В строке заголовка формы отображается кнопка Развернуть
biHelp
В строке заголовка формы отображается значок Справка
Align
Определяет вариант выравнивания компонента внутри контейнера
Значение: (формы или панели), в котором находится этот компонент.
alNone
Элемент остается там, где он был помещен на форму
alTop
У верхнего края по всей ширине контейнера (высота компонента не
меняется).
alBottom У нижнего края по всей ширине контейнера (высота компонента не
меняется).
alLeft
У левого края по всей высоте контейнера (ширина компонента не
меняется).
alRight
У правого края по всей высоте контейнера (ширина компонента не
меняется).
alClient
Компонент занимает весь контейнер.
Brush
Доступно компонентам Canvas, Shape. Определяет цвет и образец
заливки элемента управления.
Height
Содержит высоту элемента управления в пикселях.
Width
Содержит ширину элемента управления в пикселях.
Top
Содержит вертикальную координату (Y) левого верхнего угла
элемента управления (в пикселах) относительно формы.
Left
Определяет горизонтальную координату (Y) левого края элемента
управления (в пикселах) относительно формы.
Position Доступно для компонентов Form, ScrollBar.
Определяет размер и положение компонента при появлении его на
экране компьютера во время выполнения приложения (вариант этого
свойства для линеек прокрутки, когда пользователь передвигает
бегунок на линейке значение Position изменяется).
ScrollBars Доступно для компонентов Memo, StringGrid, DrowGrid.
Определяет, имеются ли линейки прокрутки для просмотра текста в
поле Memo или в таблице строк StringGrid. Свойству можно присвоить
41
значение: нет линеек ssNone, горизонтальная ssHorizontal (вдоль
нижней стороны), вертикальная ssVertical (вдоль правой стороны), обе
линейки прокрутки ssBoth (справа и снизу).
Kind
Определяет, будет ли линейка прокрутки отображаться горизонтально
(sbHorizontal) или вертикально (sbVertical).
Items
Доступно для компонентов ComboBox, ListBox.
Представляет собой массив строк и определяет количество элементов
списка и их содержимое в данном компоненте.
ItemIndex Значение этого свойства – это номер выбранного элемента в данный
момент в списке. Индекс первого элемента в списке равен 0
Autosize Доступно для компонента Edit. Если это свойство имеет значение True,
то высота поля ввода (при изменении размера шрифта) приводится в
соответствие с содержащимся в поле текстом. Если данное свойство
имеет значение False, то размер поля ввода остается постоянным.
Text
Доступно для компонентов Edit, Memo. Свойство содержит текст,
который появляется в поле ввода или в поле Memo. Свойство доступно
лишь во время выполнения программы.
SetFocus Доступно для компонента Edit. Устанавливает курсор в поле ввода.
Pen
Доступно для компонентов Canvas, Shape. Определяет, какое перо
будет использоваться для рисования линии и контура.
Shape
Доступно для компонентов Canvas, Shape. Определяет форму элемента
Значения: управления Shape.
StCircle
Круг
StEllipse Эллипс
StRectangle Прямоугольник
StRoundRect Прямоугольник со скругленными углами
stRoundSquare Квадрат со скругленными углами
stSquare Квадрат
Canvas
Обеспечивает доступ к окну для рисования
Color
Определяет цвет фона элемента управления или графического объекта
Font
Указатель на объект типа Font, определяющий шрифт, который будет
использоваться при отображении текста в компоненте
ColCount Доступно для компонентов ТstringGrid и TdrawGrid. Значение свойства
определяет число колонок таблицы. По умолчанию установлено
значение 5.
RowCount Доступно для компонентов ТstringGrid и TdrawGrid. Значение свойства
определяет число строк таблицы. По умолчанию установлено значение
5.
Col
Доступно для компонентов ТstringGrid и TdrawGrid. Значение свойства
указывает на колонку активной в данный момент ячейки таблицы.
ColОпределяет ширину колонки, номер которой указан в параметре Index.
Widths[Index] Ширина указывается в пикселях. Первая колонка имеет индекс 0.
DefaultCol- Определяет ширину всех колонок таблицы. По умолчанию
Widths
установлено значение 64 пикселя. При изменении значения свойства
DefaultColWidths, все колонки приобретут ширину, указанную в этом
свойстве. При необходимости изменения ширины отдельной колонки,
42
используется свойство ColWidths.
RowHeights[In Определяет высоту строки, номер которой указан в параметре Index.
dex]
Высота указывается в пикселях. Первая строка имеет индекс 0.
Default
Определяет высоту всех строк таблицы. По умолчанию установлено
RowHeights значение 24 пикселя. При изменении значения свойства DefaultRowHeights, все строки приобретут высоту, указанную в этом
свойстве. При необходимости изменения высоты отдельной строки,
используется свойство RowHeights.
EditorMode Определяет, может ли производить редактирование содержимого
текущей ячейки таблицы, применяется во время выполнения
программы. Если в наборе свойств Options имеется значение goAlwaysSgowSditor, то таблица автоматически переходит в режим
редактирования. То же самое происходит при присвоении свойству EditorMode значение True..
Options
Определяется внешний вид и функциональные свойства таблицы.
ПРИЛОЖЕНИЕ 5. Состав палитры компонент.
Компоненты на странице Standard (Стандартная):
Курсор – это пиктограмма для быстрой отмены выбора какого-либо объекта.
MainMenu – компонент, позволяющий поместить главное меню в программу.
PopupMenu – позволяет создавать контекстное (всплывающее) меню.
Label – служит для отображения текста на экране.
Edit – строка ввода для отображения и ввода короткого фрагмента текста.
Memo – управляющий элемент для работы с большими текстами.
Button – позволяет выполнить действия при нажатии кнопки во время выполнения
программы.
CheckBox – ячейка для многозначного выбора. Отображает строку текста с
маленьким окошком рядом. В окошке можно поставить отметку, которая означает
что что-то выбрано.
RadioButton – радио кнопка (позволяет выбрать только одну опцию из нескольких).
ListBox – нужен для показа прокручиваемого списка для формирования полей
выбора.
ComboBox – напоминает ListBox, за исключением того, что позволяет вводить
информацию в маленьком поле ввода сверху..
Scrollbar – полоса прокрутки, появляется автоматически в объектах редактирования.
GroupBox – используется для визуальных целей и для указания Windows, каков порядок перемещения по компонентам на форме (при нажатии клавиши Tab).
RadioGroup – используется аналогично GroupBox, для формирования поля
однозначного выбора (с использованием RadioButton.)
Panel – управляющий элемент, используется в декоративных целях
Компоненты на странице Additional (Дополнительная):
BitBtn – управляющая кнопка, на которой можно поместить пиктограмму.
SpeedButton – кнопка со значком для создания панелей инструментов.
43
TabSet – горизонтальные закладки для создания многостраничных окон вместе с
NoteBook.
NoteBook– используется для создания много страничного диалога
MaskEdit – поле ввода с возможностью форматированного ввода данных
пользователя.
StringGrid – представление текстовых данных в виде таблицы.
DrawGrid – представление данных любого типа в виде таблицы.
Image – отображение графических изображений на форме в различных форматах.
Shape – объект для представления геометрических фигур
Bevel – объёмный прямоугольник для рельефного оформления интерфейса.
ScrollBox – объект-контейнер для отображения объектов большого размера с
полосами прокрутки.
CheckListBox – окно списка опций с полосой прокрутки.
Компоненты на странице Dialogs (Создание стандартных диалоговых окон):
OpenDialog – стандартное окно диалога Windows для открытия файла
Рис.3.
Все
SaveDialog
– стандартное окно диалога Windows для сохранения файлов
изменения,
QpenPictureDialog – диалоговое окно Windows для выбора и открытия графических
связанные с
файлов
определенны
SavePictureDialog – диалоговое окно Windows для сохранения графических файлов
м
FontDialog
– стандартное окно диалога Windows для выбора шрифта
компоненто
ColorDialog – стандартное окно диалога Windows для выбора цвета
м, делаются
PrintDialog – стандартное окно диалога Windows для печати
в
PrinterSetupDialog
– стандартное окно диалога Windows для настройки принтера
Инспекторе
FindDialog – стандартное окно диалога Windows для поиска
Объектов.
ReplaceDialog – стандартное окно диалога Windows для замены текста
44
Download