Министерство РФ по связи и информатизации ПОВОЛЖСКАЯ ГОСУДАРСТВЕННАЯ АКАДЕМИЯ ТЕЛЕКОММУНИКАЦИЙ И ИНФОРМАТИКИ МЕТОДИЧЕСКИЕ УКАЗАНИЯ к лабораторно-практическим работам «Проектирование пользовательского интерфейса в 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