Лабораторная работа № 2
Интерфейс Delphi. Визуальные компоненты Delphi
Цель работы: научиться использовать компоненты, их свойства и события в Delphi.
Закрепление полученных навыков
Методические рекомендации
Создадим приложение, позволяющее ввести два числа и вывести сумму этих чисел.

Рис. 1
Форма приложения будет содержать следующие компоненты:
- три текстовых поля TEdit для ввода чисел и вывода их суммы,
- метку TLabel для изображения знака +,
- две кнопки TButton: для вычисления суммы чисел, для выхода из приложения.
Текст приложения по большей части генерируется Delphi при визуальном проектировании. Пользователь вводит свой код для обработки событий, наступающих при нажатии на кнопки.
Таблица 1 - Структура модуля приложения
unit Unit1; | Модуль начинается с ключевого слова unit, после которого указывается имя модуля, совпадающее с именем файла, где сохранен модуль |
interface | Открытый интерфейс модуля |
uses | Список подключаемых библиотечных модулей |
Windows, Messages, SysUtils, Variants, | |
Classes, Graphics, Controls, Forms, | |
Dialogs, StdCtrls; | |
type | Объявление класса формы, а также типов всех компонентов, включаемых в класс формы |
TForm1 = class(TForm) | |
Edit1: TEdit; | |
Edit2: TEdit; | |
Edit3: TEdit; | |
Label1: TLabel; | |
Button1: TButton; | |
Button2: TButton; | |
procedure Button1Click(Sender: Tobject); | Объявление процедур, описывающих действия, которые должны происходить при нажатии на кнопки |
procedure Button2Click(Sender: Tobject); | |
private | Закрытый раздел класса. Объявление переменных, функций и процедур, включаемых в класс формы, но недоступных для других модулей. |
{ Private declarations } | |
public | Открытый раздел класса. |
{ Public declarations } | Объявление переменных, функций и процедур, включаемых в класс процедур и модулей |
end; | |
var | Объявление типов, констант, переменных, функций и процедур, к которым будет доступ из других модулей, но которые не включаются в класс формы |
Form1: TForm1; | |
implementation | Реализация модуля. Сюда могут помещаться предложения uses, объявления типов, констант, переменных, к которым не будет доступа из других модулей. Здесь же располагаются все реализации процедур и функций, объявленных в разделе interface. |
{$R *.dfm} | Директива компилятора, обеспечивающая компоновку файлов ресурсов формы. Удалять из текста модуля нельзя, так как загрузочный модуль не будет создан. |
procedure TForm1.Button1Click(Sender: TObject); | Реализация процедуры, реализующей обработки события Click по кнопке Button1, в результате чего складываются два введенных числа и полученная сумма выводится на экран |
var | |
a, b,c :integer; | |
begin | |
a:=strtoint(edit1.Text); | |
b:=strtoint(edit2.Text); | |
c:=a+b; | |
Edit3.Text:=inttostr(c); | |
end; | |
procedure | Реализация процедуры, реализующей обработки события Click на кнопке Button2 для выхода из приложения |
TForm1.Button2Click(Sender: TObject); | |
begin | |
Close; | |
end; | |
end. | Конец программы |
Проект Delphi представляет набор программных единиц – модулей, которые хранятся в отдельных файлах.
Примечание. В Delphi существуют файл проекта и файлы, включенные в проект.
Файл проекта – это файл головной программы с расширением Dpr, файлы проекта – это набор всех файлов приложения.
Файл с расширением Dpr содержит основную информацию о проекте. По умолчанию этот файл называется Project1.dpr. Новичкам редактировать его не рекомендуется.
Файл с расширением Pas – это файл модуля. В нем хранится текст программы на языке Object Pascal. По умолчанию этот файл называется Unit1.pas. Это единственный файл, который можно редактировать начинающим.
Файл с расширением Dfm содержит информацию о внешнем виде формы. Информация закодирована.
Файл с расширением Res – это ресурсовый файл, в котором хранится информация о курсорах, иконках и т. п.
Файл с расширением Exe – исполняемый файл приложения.
Файлы с расширениями ~Df, ~Pa - файлы со старыми версиями приложения.
У файлов с расширениями Pas, Dfm, ~Df, ~Pa всегда одинаковое имя (по умолчанию Unit1). У файлов с расширениями Dpr, Exe, Res – также одинаковое имя (по умолчанию Project1).
Примечание.
1. При сохранении нового проекта приложения рекомендуется создавать отдельную папку.
2. Названия Project1 и Unit1 рекомендуется не изменять.
3. Копирование файлов проекта на дискету или в другую папку выполняется только с помощью файлового менеджера Windows (например, проводника). В среде Delphi это делать запрещается.
4. Файлы с расширением Exe, ~Df, ~Pa, Dsm можно не копировать.
Задание на закрепление материала
1. Изучить панель инструментов «Standart» (Рис. 2).

Рис. 2
2. Заполнить экранную форму Form1 (Рис. 3).

Рис. 3
3. Создать три поля с именами Re1, Re2 и Wi1 и настроить их свойства.
4. Создать две кнопки «Сложение», «Вычитание» с названиями Button1, Button2.
5. Написать процедуру обработки нажатия кнопок «Сложение» и «Вычитание».
Образец сложения двух чисел
begin
Wi1.Text:=IntToStr(StrToInt(Re1.Text)+StrToInt(Re2.Text));
end;
6. Создать кнопку «Выход» с названием Button3.
7. Написать процедуру обработки нажатия кнопки «Exit».
8. Добавить поле вывода знака арифметического действия.
9. Сохранить проект и проверить работу калькулятора.
10. Изучить строковые функции (Таблица 2).
11. Самостоятельно выбрать строковую функцию для обработки данных в полях Re1, Re2 и добавить новую кнопку.
12. Написать процедуру для обработки данных в полях Re1, Re2 и Wi1 с помощью строковых функций.
13. На примере объектов формы изучить поля Свойств и Событий в Инспекторе объектов.
14. Поменять шрифт и его цвет объектов формы.
15. Изменить вид кнопок.
Таблица 2
Функция | Описание |
Concat(sl, s2, s3) | Возвращает последовательное соединение строк. Эквивалентна оператору sl+s2+s3 |
Copy(s, pos, len) | Возвращает подстроку длиной len символов, начинающуюся в позиции pos строки s |
Delete(s, pos, len) | Удаляет максимум len символов из строки s, начиная с позиции pos |
Insert(sourse, tar-get, pos) | Вставляет строку source в строковую переменную target, начиная с позиции pos |
Length (s) | Возвращает динамическую длину строки. Подобна функциям LEN в Basic и strlen – в C/C++ |
Pos(substring, s) | Возвращает место первого вхождения подстроки substring в строку s. Подобна функциям SUBSTR в Basic и strstr() – в C++ |
SetLength(s, newlen) | Задает новую динамическую длину newlen строковой переменной s |
SetString | Задает содержимое и длину строки |
Str(x, s) | Преобразует численное значение х в строковую переменную s |
StringOfChars | Возвращает строку с конкретным числом символов |
UniqueString | Делает данную строку уникальной со счетом обращений 1 |
Val(s, v, code) | Преобразует строку s в соответствующее численное представление v |
Теоретические сведения
В основе всего многообразия классов и компонентов, используемых в Delphi, лежат всего лишь пять базовых классов. Они обеспечивают выполнение основных функций любого объекта – будь это стандартный компонент VCL или специализированный объект, выполняющий некоторые операции в приложении.
В основе иерархии классов лежит класс TObject. Он обеспечивает выполнение важнейших функций "жизнедеятельности" любого объекта. Благодаря ему, каждый класс получает в наследство механизмы создания экземпляра объекта и его уничтожения.
Визуальные компоненты — это разнообразные стандартные для Windows и специальные (созданные разработчиками Inprise) элементы управления.
Понятно, что визуальные компоненты должны уметь отобразить себя на экране монитора и реагировать на целый ряд новых событий (реакция на мышь и клавиатуру, движение курсора и т. д.). Для этого в них встроен специальный механизм, обеспечивающий взаимодействие компонентов с графической подсистемой ОС (GUI).
Для определения размеров визуального компонента введены два опубликованных свойства:
property Height: Integer;
property Width: Integer;
Значения свойств задаются в пикселах. Для определения местоположения используется система координат рабочей области владельца данного компонента. Начало отсчета находится в левом верхнем углу.
Свойство
property ClientOrigin: TPoint;
содержит координаты левого верхнего угла элемента управления в системе координат экрана.
Координаты любой точки можно пересчитать в экранные при помощи метода
function ClientToScreen(const Point: TPoint): TPoint;
и наоборот:
function ScreenToClient(const Point: TPoint): TPoint;
Параметры рабочей области компонента определяются следующими свойствами:
• property ClientHeight: Integer;
определяет высоту рабочей области в пикселах.
• property ClientWidth: Integer;
определяет ширину рабочей области в пикселах.
• property ClientRect: TRect;
значение которого есть не что иное, как (о, о, .ciientwidth, ClientHeight).
Если разработчику неизвестны текущие параметры рабочей области, то он может воспользоваться следующими методами.
Функция
function GetClientOrigin: TPoint; virtual;
возвращает координаты левого верхнего угла рабочей области.
Функция
function GetClientRect: TRect; virtual;
возвращает размеры прямоугольника рабочей области.
Выравнивание элемента управления
Для выравнивания компонента в рабочей области его владельца (обычно это форма) применяется свойство
property Align: TAlign;
Тип TAlign объявлен следующим образом:
type TAlign = (alNone, alTop, alBottom, alLeft, alRight, alClient);
При значении alNone выравнивание отсутствует. При следующих четырех значениях выравнивание осуществляется по соответствующей стороне. Значение alClient приводит к тому, что элемент управления изменяет свои размеры до размеров рабочей области владельца.
Свойство
property Anchors: TAnchors;
type TAnchors = set of TAnchorKind;
type TAnchorKind = (akTop, akLeft, akRight, akBottom);
обеспечивает фиксацию элемента управления по сторонам владельца. "Якорь" можно установить по одной, двум, трем или четырем сторонам. При задании якоря по любой стороне расстояние между стороной и элементом управления сохраняется неизменным. Комбинируя якоря для сторон, можно добиться различных вариантов поведения компонента при изменении размеров владельца.
Если по вертикали или горизонтали якорь не установлен вообще, то при изменении размеров владельца компонент остается на том же месте с учетом изменившегося размера.
Если по вертикали или горизонтали установлены оба якоря, то при изменении размеров владельца размер элемента управления изменяется таким образом, чтобы расстояния до сторон владельца остались неизменными.
Свойство
property AutoSize: Boolean;
обеспечивает изменение размеров компонента в соответствии с размерами его содержимого (текста, изображения, списка, иерархического дерева и т. д.).
Внешний вид элемента управления
Для определения цвета компонента используется свойство
property Color: TColor;
При нахождении указателя мыши над компонентом его изображение может изменяться в соответствии со значением свойства
property Cursor: TCursor;
Для текста компонента шрифт обычно задается свойством
property Font: TFont;
Свойство
property DesktopFont: Boolean;
определяет возможность использования шрифта для отображения, который применяется ОС для представления текста в значках. Сам текст задается свойством
type TCaption = string;
property Text: TCaption;
Длину текста можно определить при помощи функции
function GetTextLen: Integer;
Она возвращает число символов в тексте.
Элемент управления можно сделать видимым или невидимым. Для этого применяется свойство
property Visible: Boolean;
Этих же результатов можно достичь методами show (компонент видим) и Hide (компонент невидим).
Опубликованное свойство
property Hint: string;
содержит текст ярлыка — однострочной подсказки, которая появляется в маленькой рамке при остановке мыши на элементе управления.
Для управления ярлыком используется свойство
property ShowHint: Boolean;
При значении True ярлык начинает работать, при значении False ярлык выключается.
Для каждого элемента управления можно создать собственное всплывающее меню. Ссылка на экземпляр класса TPopupMenu, инкапсулирующего такое меню, хранится в свойстве
property PopupMenu: TPopupMenu;
Текущее состояние элемента управления определяется свойством:
type TControlState = set of (csLButtonDown, csClicked, csPalette,
csReadingState, csAlignmentNeeded, csFocusing, csCreating, csPaintCopy,
csCustomPaint, csDestroyingHandle, csDocking,);
property ControlState: TControlState;
Доступность элемента управления в целом определяется свойством
property Enabled: Boolean;
При значении True элемент управления полностью работоспособен. При значении False элемент управления неактивен и отображается серым цветом.
Для передачи фокуса между элементами управления на одной форме часто используется клавиша <ТаЬ>. Порядок перемещения фокуса между элементами определяется свойством
type TTabOrder = -1..32767;
property TabOrder: TTabOrder;
В первую очередь фокус передается компоненту с минимальным значением свойства. Далее — по возрастанию значения. При переносе компонента на форму это значение задается автоматически в соответствии с числом компонентов на форме.
Компонент можно заставить не откликаться на клавишу <ТаЬ>. Для этого свойству
property TabStop: Boolean;
необходимо присвоить значение False.
Для передачи фокуса прямо элементу управления применяется метод
procedure SetFocus; virtual;
Чтобы узнать, имеет ли элемент управления фокус, в настоящее время используется метод
function Focused: Boolean; dynamic;
Все оконные элементы имеют рамку по контуру (впрочем, она может быть не видна). Ее параметры задаются группой свойств:
П property BevelEdges: TBevelEdges;
задает, какие стороны входят в рамку.
property Bevellnner: TBevelCut;
property BevelOuter: TBevelCut;
задают внешний вид рамки;
property BevelKind: TBevelKind;
определяет стиль рамки;
property BevelWidth: TBevelWidth;
задает размер рамки.
Свойство
property Brush: TBrush;
определяет параметры кисти (цвет и заполнение), которой рисуется фон элемента.
Оконный элемент может содержать другие компоненты. Для управления ими применяется индексированный список указателей, представляющих свойство
property Controls[Index: Integer]: TControl;
Общее число дочерних элементов управления содержится в свойстве
property ControlCount: Integer;
Внешний вид оконного элемента определяется свойством
property Ctl3D: Boolean;
При значении True элемент управления имеет трехмерный вид. Иначе элемент выглядит плоским.
Для вызова темы контекстной помощи для конкретного элемента управления предназначено свойство
type THelpContext = - MaxLonglnt..MaxLonglnt;
property HelpContext: THelpContext;
Значение свойства должно соответствовать номеру темы в файле помощи.
Основные свойства формы
Caption – заголовок;
Color – цвет;
FormStyle (тип TFormStyle ) – стиль формы
fsNormal – стандартный стиль;
fsMDIForm – родительская форма в многодокументном приложении;
fsMDIFChild – дочерняя;
fsStayOnTop – форма изображается поверх других окон. Обычно используется для заставки;
BorderStyle – (при TFormBordevStyle) – вид и поведение ограничивающей рамки;
bsDialog – диалоговая форма;
bsSingle – форма с неизменяемыми размерами;
bsNone – форма без рамки и заголовка, не изменяет размеры;
bsSizeable (по умолчанию) – обычная рамка, форма с неизменяемыми размерами, со строкой заголовка;
bsToolWindow – форма панели инструментов;
bsSizeToolWiolow – форма панели инструментов с неизменными размерами.
Свойство BorderIcons (тип TBorderIcons) определяет возможность изображения 4 – х кнопок.
biSystemMenu –кнопки системного меню,
biMinimize – кнопки свертывания,
biMaximize – кнопки восстановления,
biHelp – кнопки справки для вызова контекстно-ориентированной справки.
Если присутствует кнопка системного меню, то ни одна копка не отображается.
Если есть кнопки Min/Max, то кнопка Help не отображается. Кнопки Min/Max возможны только для обычной формы панели инструментов с изменяющимися размерами.
Свойства Width, Height задают размеры формы в пикселах.
ClientWidth, ClientHeight (тип Integer ) задают ширину и высоту клиентской части формы. В клиентской части отображаются компоненты формы, в неклиентской – рамка, заголовок, строка главного меню.
При необходимости могут появляться полосы прокрутки.
Свойство Icon (тип TIcon) определят пиктограмму в левой области заголовка формы. Если пиктограмма не задана, то используется пиктограмма из свойства Icon объекта Application.
Пример загрузки пиктограммы:
procedure TForml. FormCreate(Sender:TObgect);
begin
Forml. Icon. LoadFromFile(‘C:\Pic. ico‘);
end;
Position (типа TPosition) задаёт размещение и размер формы:
poDesigned – определены при конструировании формы значениями Left, Top, Width, Height,
poScreenCenter – расположение в центре экрана,
poDefault – Windows автоматически сам определяет начальную позицию и размеры формы,
poDefaultPosOnly – Windows автоматически определяет только позицию, а не размеры,
poDefaultSizeOnly – Windows автоматически определяет только размеры.
Свойство Active (тип Boolean) задаёт активность формы (обычно визуально отмечается синим заголовок), т. е. фокус ввода.
Свойство WindowsState (тип TWindowsState) определяет состояние формы:
wsNormal – обычное (по умолчанию),
wsMinimized – минимизация,
wsMaximized – максимизация.
Свойство ActivControl (типа TWinControl) определяет, какой элемент формы находится в фокусе ввода.
Например: Form1.ActivControl:=Edit2;
Эту же операцию проводит метод SetFocus: Edit2.SetFocus;
Свойство AutoScroll (типа Boolean) определяет автоматическое появление полосы прокрутки.
Процедура ScrollInView (AControl:TControl) автоматически изменяет полосы прокрутки так, чтобы заданный параметром AControl элемент был виден в отображаемой области.
Свойство KeyPreview (тип Boolean) определяет, будет ли форма обрабатывать события клавиатуры, прежде чем их обработают элементы управления формы.
Методические рекомендации
Поместить на форму компонент Label для отображения надписи и компонент Edit для создания строки ввода текста.
С помощью значения false свойства AutoSize запретить автоматическую коррекцию размера надписи по размеру текста надписи.
С помощью значения taCenter свойства Alignment выровнять надпись по центру формы.
С помощью значения true свойства WordWrap установить автоматический перенос слов надписи на другую строку, если весь текст не помещается в отведенный размер.
С помощью значения true (false) свойства Transparent сделать надпись прозрачной (непрозрачной).
С помощью свойства Caption задать текст надписи «Вводимая 1-я строка».
С помощью свойства Font изменить цвет и размер шрифта.
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
Создать строку ввода и редактирования с помощью компонента Edit. Компонент позволяет водить строку, использовать клавиши управления курсором, BackSpace, Delete, выделять фрагмент текста. Введенные символы сохраняются в свойстве Text. Компонент поместить на форме справа от созданной надписи. Инициализировать его значения пробелами.
Сделать ограничения на вводимые символы, разрешив ввод только цифр. Проверка вводимых символов происходит с помощью обработчика нажатия клавиш, например, OnKeyPress:
Procedure TForm1.Edit1KeyPress(Sender:TObject; var Key: Char);
Begin
If(Key<’0’) or (Key>’9’) then Key:=#0;
End;
Процедуру обработки события создать так, как описано выше.
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
Разрешить ввод цифр и других символов – для этого в созданной процедуре убрать строку с условным оператором.
В строке ввода нажатие клавиши Enter не обрабатывается, т. к. допускается ввод только одной строки. При необходимости программист должен сам кодировать действия, связанные с нажатием Enter.
Создать 2-е поле ввода строки с помощью компонентов Label с заголовком «Второе поле ввода строки» и компонента Edit.
Выровнять по левой границе компоненты Label1, Label2, выделив их с помощью жирной стрелки на панели стандартных компонентов и используя контекстного меню.
После ввода текста в первое поле и нажатия Enter требуется автоматически перейти во 2-е поле ввода, т. е. передать фокус компоненту Edit2. Для этого можно написать следующую процедуру:
Procedure Tform1.Edit1KeyPress(Sender: TObject; var Key: Char);
Begin
If Key=#13 then begin
Key:=#0;
Edit2.SetFocus; {вызов метода SetFocus для 2-го поля ввода}
{Можно было бы написать Form1.ActiveControl:=Edit2;}
end;
end;
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
Компонент из дополнительных компонентов MaskEdit аналогичен компоненту Edit, но к тому же позволяет задавать шаблон ввода с помощью свойства EditMask.
Создать компоненты Label для надписи «3-е поле с маской ввода» и справа от него MaskEdit для ввода строки по шаблону. Выбрать шаблон ShortTime.
Написать процедуру обработки onKeyPress для Edit2, чтобы посде нажатия Enter передать фокус компоненту MaskEdit.
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
На вкладке стандартных компонентов выбрать кнопку Button. Поместить ее на форму. Назвать кнопку «Выход», задав это значение свойству Caption.
Создать процедуру обработки нажатия кнопки мыши на созданной кнопке «Выход» с помощью обработчика события OnClick - для этого в процедуре записать:
Form1.Close; {закрыть форму}
или
Self. Close;
или
Close;
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
На вкладке дополнительных компонентов выбрать кнопку BitBtn, поместить ее в форму.
С помощью свойства Glyph задать рисунок на кнопке, щелкнув по … и выбрав какой-нибудь рисунок из C:\Program Files\Common Files\Borland Shared\Images\Buttons.
С помощью Layout задать взаимное расположение рисунка и подписи кнопки.
Создать процедуру обработки события OnMouseMove для случайного изменения цвета подписи кнопки при наведении на нее мыши:
BitBtn1.Font. Color:=Random($FFFFFF);
и изменения размера шрифта:
BitBtn1.Font. Size:=10;
Для восстановления прежнего размера шрифта подписи в процедуре TForm1.FormMouseMove надо записать строку:
BitBtn1.Font. Size:=8;
Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
Контрольные вопросы
1. В чем заключается преимущества визуального программирования интерфейса?
2. Опишите структуру и назначение отдельных элементов головной программы приложения Delphi.
3. Каково назначение модуля в проекте приложения Delphi? Опишите назначение отдельных разделов модуля.
4. Как различается доступность объектов, описанных в разделах interface и implementation?
5. Как указать ссылку на свойства и методы объекта в тексте программы?
6. Какие компоненты входят в интегрированную среду разработки приложений Delphi?
7. Перечислите основные компоненты окна среды Delphi и укажите их назначение.
8. Как получить подсказку Delphi по элементам окна и компонентам проектируемого графического интерфейса?
9. Каково назначение страниц Properties и Events в окне Object Inspector?
10. Как разместить компонент на форме?
11. Какими способами можно изменять свойства компонента? Приведите примеры.
12. Перечислите состав проекта Delphi. Опишите назначение различных файлов.
13. Каково назначение обработчиков событий? Каким образом можно инициировать создание процедуры-обработчика событий?
14. Опишите порядок получения справки по синтаксису языка Object Pascal в ИСР Delphi.
15. Изучите и опишите информацию о компонентах палитры Standard по справке Delphi.
16. Изучите и опишите информацию о числовых типах данных языка Object Pascal по справке Delphi.
17. Изучите и опишите информацию об арифметических операциях языка Object Pascal по справке Delphi.
18. Изучите и опишите информацию о функции Random языка Object Pascal по справке Delphi.
19. Что хранится в файле проекта с расширением. Dfm.
20. Что хранится в файле проекта с расширением. Pas.
21. Что хранится в файле проекта с расширением. Dpr.
22. Что хранится в файле проекта с расширением. Res.
Задание
1. Создать новый проект. Создать форму со свойствами:
· заголовок содержит системное меню, 3 стандартные кнопки (закрыть, свернуть, минимизировать);
· окно формы можно масштабировать;
· изменить цвет фона формы;
· задать заголовок формы и иконку;
· при наведении мыши форма случайным образом меняет цвет.
2. Поместить на форме 2 поля ввода, в одно из которых данные вводятся по шаблону – номер телефона. Оба поля ввода снабдить надписями. Закрасить цвет фона поля ввода произвольным цветом. Обеспечить автоматическое переключение фокуса на второе поле ввода после ввода данных в первое поле и нажатия клавиши Enter. После ввода данных во второе поле и нажатия клавиши Enter сделать это поле невидимым (с помощью свойства Visible). В поле вводе по шаблону должны вводиться только цифры.
3. Поместить на форме кнопки с рисунком предопределенного вида. Для этого использовать свойство Kind. Кнопки такого вида выполняют автоматически закрепленные за ними действия. Проверить работу этих кнопок.
4. Сохранить проект, откомпилировать: Project/Compile и проверить работу приложения: Run/Run.
Основные порталы (построено редакторами)
