Глава I. Знакомство со средой Delphi

advertisement
Borland Delphi 5.0
УЧЕБНОЕ ПОСОБИЕ
Автор: Сазонова Марина Анатольевна
Улан-Удэ
2002
Глава I. Знакомство со средой Delphi ................................ 6
1.1. ОБЩИЕ СВЕДЕНИЯ .......................................................... 6
Глава II. Создание приложений в среде Delphi ............. 11
2.1. ХАРАКТЕРИСТИКА ПРОЕКТА ........................................ 11
2.2. ФАЙЛ ПРОЕКТА ............................................................. 11
2.3. ФАЙЛ ФОРМЫ ............................................................... 12
2.4. ФАЙЛ МОДУЛЯ .............................................................. 13
2.5. ФАЙЛ РЕСУРСОВ ........................................................... 13
2.6. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 14
Глава III. Использование компонентов .......................... 17
3.1. ПОНЯТИЕ КОМПОНЕНТА ............................................... 17
3.2. СТРАНИЦА STANDART. ................................................. 17
3.3. СТРАНИЦА ADDITIONAL. .............................................. 20
3.4. СТРАНИЦА WIN32......................................................... 23
3.5. СТРАНИЦА SYSTEM. ..................................................... 28
3.6. СТРАНИЦА DATA ACCESS............................................. 29
3.7. СТРАНИЦА DATA CONTROLS. ....................................... 30
3.8. СТРАНИЦА QREPORT. ................................................... 33
3.9. СТРАНИЦА DIALOGS. .................................................... 37
3.10. ОСНОВНЫЕ СВОЙСТВА ОБЪЕКТОВ. ............................ 39
3.11. ПРАКТИЧЕСКАЯ РАБОТА ............................................. 41
Глава IV. Введение в Объектно-ориентированное
программирование (ООП) ................................................. 44
4.1. АЛФАВИТ ЯЗЫКА. ......................................................... 44
4.2. СЛОВАРЬ ЯЗЫКА. .......................................................... 44
4.3. СТРУКТУРА ПРОГРАММЫ. ............................................ 45
4.3. ТИПЫ ДАННЫХ ............................................................. 47
4.3.1. Простые типы данных .................................... 49
4.3.2. Структурные типы данных............................ 50
4.4. ОПЕРАТОРЫ .................................................................. 50
4.5. ПРАКТИЧЕСКАЯ РАБОТА. ОБЪЕКТ MAINMENU. .......... 50
Глава V. Работа с формами ............................................... 55
5.1. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 55
Глава VI. Объединение элементов управления ............. 57
6.1. ОБЪЕКТ PANEL. ............................................................. 57
6.2. ОБЛАСТЬ ПРОКРУТКИ SCROLLBOX .............................. 58
6.3. ФРЕЙМЫ FRAME. .......................................................... 58
2
6.4. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 59
Глава VII. Классы в Object Pascal. ................................... 65
7.1. ПОНЯТИЕ КЛАССА ........................................................ 65
7.2. ПОЛЯ КЛАССА ............................................................... 65
7.3. МЕТОДЫ КЛАССА.......................................................... 66
7.4. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 66
Глава VIII. Работа с кнопками ......................................... 69
8.1. СТАНДАРТНАЯ КНОПКА BUTTON. ................................ 69
8.2. КНОПКА С РИСУНКОМ BITBTN. .................................... 70
8.3. КНОПКА БЫСТРОГО ДОСТУПА SPEEDBUTTON. ............ 72
8.4. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 73
8.4.1. Решение квадратного уравнения. ................... 73
8.4.2. Игра «Пятнашки»............................................. 75
Глава IX. Работа со строками ........................................... 77
9.1. ФУНКЦИИ ПРЕОБРАЗОВАНИЯ СТРОК В ДРУГИЕ ТИПЫ. 78
9.2. ПРАКТИЧЕСКАЯ РАБОТА ............................................... 78
Глава X. Работа с датами ................................................... 81
10.1. ОБЪЕКТ DATETIMEPICKER ......................................... 81
10.2. ОБЪЕКТ MONTHCALENDAR ........................................ 81
10.3. ОБЪЕКТ CALENDAR..................................................... 82
10.4. ПРАКТИЧЕСКАЯ РАБОТА ............................................. 82
Глава XI. Работа со списками ........................................... 84
11.1. ПРОСТОЙ СПИСОК LISTBOX. ...................................... 84
11.2. КОМБИНИРОВАННЫЙ СПИСОК COMBOBOX. ............. 84
11.3. ОБЩАЯ ХАРАКТЕРИСТИКА СПИСКОВ......................... 85
11.4. МЕТОДЫ ...................................................................... 87
11.5. ПРАКТИЧЕСКАЯ РАБОТА ............................................. 88
Глава XII. Использование переключателей. ................. 91
12.1. ПРАКТИЧЕСКАЯ РАБОТА ............................................. 92
Глава XIII. Процедуры и функции, реализующие
диалоги .................................................................................. 96
13.1. ПРОЦЕДУРА SHOWMESSAGE. ..................................... 96
13.2. ФУНКЦИЯ MESSAGEDLG. ........................................... 96
13.3. ФУНКЦИЯ MESSAGEDLGPOS. ..................................... 98
13.4. СТАНДАРТНЫЕ ДИАЛОГИ. .......................................... 98
13.4.1. Общие свойства OpenDialog и
SaveDialog: .................................................................... 99
13.5. ПРАКТИЧЕСКАЯ РАБОТА ........................................... 100
3
Глава XIV. Компонент Timer .......................................... 104
14.1. ПРАКТИЧЕСКАЯ РАБОТА.......................................... 104
ИГРА «УГАДАЙ ЧИСЛО» .............................................. 106
ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ: .......................................... 109
Глава XV. Работа с таблицами ....................................... 110
15.1. ПРАКТИЧЕСКАЯ РАБОТА.......................................... 111
Глава XVI. Элементы с закладками .............................. 114
16.1. ОДНОСТРАНИЧНЫЙ БЛОКНОТ TABCONTROL. ........ 114
16.2. МНОГОСТРАНИЧНЫЙ БЛОКНОТ PAGECONTROL. .... 115
16.3. ПРАКТИЧЕСКАЯ РАБОТА.......................................... 116
Глава XVII. Панели инструментов ................................ 120
17.1. КОМПОНЕНТ TOOLBAR. .......................................... 120
17.2. TOOLBUTTON ........................................................... 122
17.3. ПРАКТИЧЕСКАЯ РАБОТА.......................................... 122
Глава XVIII. Графика в Delphi ....................................... 125
18.1. КЛАСС TFONT. ......................................................... 125
18.2. КЛАСС TREN. ........................................................... 126
18.3. КЛАСС TBRUSH........................................................ 127
18.4. КЛАСС TCANVAS ..................................................... 127
18.5. ПРАКТИЧЕСКАЯ РАБОТА.......................................... 130
Глава XIX. Основы баз данныхError!
Bookmark
not
defined.
19.1. ТАБЛИЦЫ БАЗ ДАННЫХ.ERROR! BOOKMARK NOT
DEFINED.
19.2. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
19.2. НАБОРЫ ДАННЫХ ERROR! BOOKMARK NOT DEFINED.
19.3. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
19.4. РЕЖИМЫ НАБОРОВ ДАННЫХERROR! BOOKMARK NOT
DEFINED.
19.5. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
Глава XX. Работа с полями ... Error! Bookmark not defined.
20.1. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
Глава XXI. Навигационный способ доступа к базе
данных ....................................... Error! Bookmark not defined.
4
21.1. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
21.2. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
Глава XXII. Фильтрация данных в наборах данных.
..................................................... Error! Bookmark not defined.
22.1. ФИЛЬТРАЦИЯ ПО ВЫРАЖЕНИЮ.ERROR! BOOKMARK
NOT DEFINED.
22.2. ПРАКТИЧЕСКАЯ РАБОТА.ERROR! BOOKMARK NOT
DEFINED.
22.3. ФИЛЬТРАЦИЯ ПО ДИАПАЗОНУ.ERROR! BOOKMARK
NOT DEFINED.
22.4. ФИЛЬТРАЦИЯ ПО ЧАСТИЧНОМУ СООТВЕТСТВИЮ:
.................................... ERROR! BOOKMARK NOT DEFINED.
Глава XXIII. Поиск записей .. Error! Bookmark not defined.
23.1. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
23.2. ПОИСК ЗАПИСЕЙ В ИНДЕКСИРОВАННОМ НАБОРЕ
ДАННЫХ ...................... ERROR! BOOKMARK NOT DEFINED.
23.3. ТОЧНЫЙ ПОИСК. . ERROR! BOOKMARK NOT DEFINED.
23.4. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
23.5. НЕТОЧНЫЙ ПОИСКERROR!
BOOKMARK
NOT
DEFINED.
Глава XXIV. Работа со связанными таблицами ..... Error!
Bookmark not defined.
24.1. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
Глава XXV. Построение отчетовError! Bookmark not
defined.
25.1. КОМПОНЕНТ TQUICKREPERROR! BOOKMARK NOT
DEFINED.
25.2. КОМПОНЕНТ TQRBANDERROR! BOOKMARK NOT
DEFINED.
25.3. ПРАКТИЧЕСКАЯ РАБОТАERROR! BOOKMARK NOT
DEFINED.
25.3.1. Создание простейшего отчета ... Error!
Bookmark not defined.
5
25.4. ИСПОЛЬЗОВАНИЕ КОМПОНЕНТА QREXP. ........ ERROR!
BOOKMARK NOT DEFINED.
25.5. ПРЕДСТАВЛЕНИЕ ЗАГОЛОВКОВ СТОЛБЦОВ...... ERROR!
BOOKMARK NOT DEFINED.
25.6. ИСПОЛЬЗОВАНИЕ КОМПОНЕНТА QRSYSDATA ERROR!
BOOKMARK NOT DEFINED.
6
Глава I. Знакомство со средой Delphi
1.1. Общие сведения
Среда
Delphi
это
сложный
механизм,
обеспечивающий
высоко
эффективную
работу
программиста. Визуально она реализуется несколькими
одновременно раскрытыми на экране окнами. Окна могут
перемещаться по экрану, частично или полностью
перекрывая друг друга, что обычно вызывает у
пользователя, привыкшего к относительной «строгости»
среды текстового процессора Word или табличного
процессора Excel, ощущение некоторого дискомфорта.
После приобретения опыта работы с Delphi это ощущение
пройдет и вы научитесь быстро отыскивать нужное окно,
чтобы изменить те или иные функциональные свойства
создаваемой вами программы, ибо каждое окно несет в
себе определенную функциональность, т.е. предназначено
для решения определенных задач
Рис. 1. Наиболее важные окна Delphi 1 – главное окно; 2
1
6
2
4
5
3
– окно формы; 3 – окно кода программы; 4 – окно Инспектора
объектов; 5 – окно Навигатора кода, 6 – Палитра компонент.
Запустите Delphi - и вы увидите нечто, похожее на
рис. 1. На нем изображены четыре наиболее важных окна
7
Delphi, главное окно (оно имеет заголовок Delphi 5 Projectl), окно формы (заголовок Forml), окно Инспектора
Объектов (Object Inspector) и окно кода программы
(Unitl.pas).
Слева
в
окне
кода
располагается
вспомогательное окно броузера (на рисунке помечено
цифрой 5), с помощью которого можно просматривать
структуру всех объявлений в окне кода.
Если вы не видите на экране окна кода, но хотите его
увидеть, просто нажмите клавишу F12. Повторное нажатие
F12 вновь активизирует окно формы и т.д. - эта клавиша
работает как двоичный переключатель, попеременно
показывая окно формы или окно кода программы.
Палитра компонентов - это главное богатство
Delphi. Она занимает правую часть главного окна и имеет
закладки, обеспечивающие быстрый поиск нужного
компонента. Под компонентом понимается некий
функциональный элемент, содержащий определенные
свойства и размещаемый программистом в окне формы. С
помощью компонентов создается каркас программы, во
всяком случае - ее видимые на экране внешние
проявления: окна, кнопки, списки выбора и т.д.
Как и панель кнопок, палитра компонентов может
настраиваться. Для этого используется специальный
редактор, окно которого появляется на экране после
щелчка правой кнопкой мыши на любой пиктограмме в
палитре компонентов и выбора опции Properties(Свойства).
Окно формы
Окно формы представляет собой проект Windowsoкна будущей программы. Вначале это окно пусто. Точнее,
оно содержит стандартные для Windows интерфейсные
элементы
- кнопки вызова
системного меню,
максимизации, минимизации и закрытия окна, полосу
заголовка и очерчивающую рамку; вся рабочая область
заполнена точками координатной сетки, служащей для
упорядочения размещаемых на форме компонентов.
8
Программист в любой момент времени контролирует
содержание окна создаваемой программы и может внести в
него необходимые изменения.
Окно Инспектора Объектов
Любой размещаемый на форме компонент
характеризуется
некоторым
набором
параметров:
положением, размером, цветом и т.д. Часть этих
параметров, например, положение и размеры компонента,
программист
может
изменять,
манипулируя
с
компонентом в окне формы. Для изменения других
параметров предназначено окно Инспектора Объектов.
Это окно содержит две страницы - Properties (Свойства) и
Events (События). Страница Properties служит для
установки нужных свойств компонента, страница Events
позволяет определить реакцию компонента на то или иное
событие. Совокупность свойств отображает видимую
сторону компонента: положение относительно левого
верхнего угла рабочей области формы, его размеры и цвет,
шрифт и текст надписи на нем и т.п.; совокупность
событий - его поведенческую сторону: будет ли
компонент реагировать на щелчок мыши или на нажатие
клавиш, как он будет вести себя в момент появления на
экране или в момент закрытия окна и т.п.
Каждая страница окна инспектора объектов
представляет собой двухколончатую таблицу, левая
колонка которой содержит название Properties (свойства)
или Events (события), а правая - конкретное значение
свойства или имя подпрограммы, обрабатывающей
соответствующее событие.
Строки таблицы выбираются щелчком мыши и
могут отображать простые или сложные свойства.
К простым относятся свойства, определяемые
единственным значением - числом, строкой символов,
значением True (Истина) или False (Ложь) и т.п. Например,
свойство Caption (Заголовок) представляется строкой
символов, свойства Height (Высота) и Width (Ширина) 9
числами, свойство Enabled (Доступность) - значениями
True или False. Сложные свойства определяются
совокупностью значений. Слева от имени таких свойств
указывается значок «+», а двойной щелчок мышью на
имени свойства (в левой колонке таблицы) приводит к
раскрытию списка составляющих сложного свойства.
Чтобы закрыть раскрытый список, нужно вновь дважды
щелкнуть по имени сложного свойства.
В верхней части окна Инспектора Объектов
располагается раскрывающийся список всех помещенных
на форму компонентов. Поскольку форма сама по себе
является компонентом, ее имя также присутствует в этом
списке.
Окно кода программы
Окно кода предназначено для создания и
редактирования
текста
программы.
Этот
текст
составляется по специальным правилам и описывает
алгоритм работы программы. Совокупность правил записи
текста называется языком программирования. В системе
Delphi используется язык программирования Object Pascal,
который
представляет
собой
расширенную
и
усовершенствованную версию широко распространенного
языка Паскаль корпорации Borland (Turbo Pascal и Borland
Pascal). Несмотря на то, что визуальная среда Delphi берет
на себя многие рутинные аспекты программирования,
знание этого языка является непременным условием для
любого программиста, работающего в этой среде.
Первоначально окно кода содержит минимальный
исходный
текст,
обеспечивающий
нормальное
функционирование
пустой
формы
в
качестве
полноценного Windows-OKHА. В ходе работы над
проектом программист вносит в него необходимые
дополнения, чтобы придать программе нужную
функциональность. Поскольку для создания даже
простых программ вам понадобится создавать и изменять
10
(редактировать) код программы, ниже описываются
основные приемы работы с окном кода.
11
Глава II. Создание приложений в среде
Delphi
Программирование в Delphi строится на тесном
взаимодействии
двух
процессов:
процесса
конструирования визуального проявления программы
(т.е. её Windows-окна) и процесса написания кода,
придающего элементам этого окна и программе в целом
необходимую функциональность.
2.1. Характеристика проекта
Приложение, создаваемое в среде Delphi , состоит
из нескольких элементов, объединенных в проект. В состав
проекта входят следующие элементы (в скобках указаны
расширения файлов):

Код проекта (DPR);

Описания форм (DFM);

Модули форм (PAS);

Модули (PAS);

Параметры проекта (OPT);

Описание ресурсов (RES);
Ниже показана взаимосвязь между отдельными
частями проекта
2.2. Файл проекта
Файл проекта является основным и представляет
собой программу. Для приложения, включающего в свой
состав одну форму, файл проекта имеет следующий вид:
12
Форма
Параметры
Описание
Компиляция
Сборка
Модуль
Проект
Приложения
Форма
Описание
Ресурсы
Модуль
Модуль
Модуль
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Имя программы совпадает с именем файла проекта.
2.3. Файл формы
Для каждой формы в составе проекта автоматически
создаются файл описания (DFM) и файл модуля (PAS).
Файл описания формы (DFM) – это ресурс Delphi .
Он содержит характеристики формы и ее компонентов.
13
Файл автоматически заполняется по мере того, как
программист заполняет форму компонентами.
2.4. Файл модуля
Содержит описание класса формы. Для пустой
формы, добавляемой к проекту по умолчанию, файл
модуля имеет следующий код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
2.5. Файл ресурсов
При первом сохранении автоматически создается
файл ресурсов(RES) с именем, совпадающим с именем
14
файла проекта. Файл ресурсов может содержать
пиктограммы, растровые изображения, курсоры и т.д.
При разработке приложений важно позаботиться о
том, чтобы эти файлы не растерялись по вашему
жесткому диску. Поэтому приучите себя сохранять
проект в ОТДЕЛЬНОЙ ПАПКЕ (желательно с
англоязычным именем), куда будут автоматически
сохраняться и другие файлы, необходимые для работы
проекта.
!
2.6. Практическая работа
Теперь попробуем создать собственное работающее
приложение.
1. Разместите на форме компонент label (Метка) из
страницы
палитры
компонентов
Standart
(Стандартная).
2. В окне Object Inspector (Инспектора Объектов ) на
вкладке Properties (Свойства) найдите свойство
Caption (Заголовок), и напишите в нем строку «Я
программирую на Delphi ».
3. Поставьте на форму 3 компонента Button (Кнопка),
находящихся на палитре компонентов Standart
(Стандартная). Для каждого из них найдите в окне
Object Inspector (Инспектора Объектов) тоже
свойство Caption(Заголовок),
и запишите
соответственно
«ИМЯ»,
«ФАМИЛИЯ»,
«ОТЧЕСТВО».
4. Выделите саму форму (один раз щелкнув мышью)
и этому же свойству присвойте строку «Моя первая
программа»
После выполненных действий ваша форма примет
вид:
15
1. Для каждого поставленного вами компонента
попробуйте изменить свойства Color(цвет) и
Font(шрифт) в окне Object Inspector (Инспектора
Объектов ), поочередно выделяя каждый
компонент, в том числе и вашу форму.
2. выделите кнопку с заголовком «ФАМИЛИЯ». В
окне Object Inspector (Инспектора Объектов)
перейдите на вкладку Events (События). найдите
событие OnClick (По нажатию) и дважды щелкните
на нем. Вы перейдете в окно редактора кода или ,
по-другому в окно модуля.
3. В том месте, где находится курсор, напишите
следующую строку:
label1.Caption:='Иванов';
4. Выполните теже действия для двух других кнопок,
только вместо фамилии напишите имя, например
Петр, и отчество, например Сидорович.
5. нажав F9 или выбрав пункт меню Run –> Run вы
откомпилируете исходный файл, т.е. запустите
вашу программу на исполнение.
6. Для того, чтобы вернуть режим разработки
закройте ваше приложение или выберите пункт
меню Run->Program reset.
7. В отдельной папке с англоязычным именем
сохраните ваш проект: выберите пункт меню File>Save project as и в появившемся окне укажите
нужную папку для вашего файла модуля (PAS) и
проекта (DPR).
16
Сформулируем основные выводы, полученные в
ходе работы над нашей программой:
 Процесс создания Delphi – программы разбивается
на две фазы: фазу конструирования формы и фазу
кодирования;
 Конструирование
формы
осуществляется
с
помощью выбора компонентов из палитры и
размещения их на форме;
 Программист
может
перемещать
любой
размещаемый на форме компонент и изменять его
размеры с помощью мыши;
 Чтобы придать компоненту нужные свойства,
используется страница Properties (Свойства) окна
Object Inspector (Инспектора Объектов );
 Чтобы компонент мог откликаться на то или иное
событие, программист должен создать обработчик
события и указать его имя на странице Events
(События) окна Object Inspector (Инспектора
Объектов );
 Обработчик
события оформляется в виде
процедуры, имеющей составное имя. Первая часть
имени представляет собой имя класса формы,
вторая часть отделяется от первой точкой и может
быть произвольной. Если Delphi автоматически
формирует заголовок для обработчика, то вторая
часть имени представляет собой объединение
имени компонента и имени события без предлога
ON.
 Тело процедуры ограничено словами BEGIN
…END и состоит из отдельных предложений
(операторов) языка OBJECT PASCAL. В конце
каждого предложения ставится точка с запятой.
 Свойства компонента могут изменяться внутри
работающей программы;
17
Глава III. Использование компонентов
3.1. Понятие компонента
Компоненты представляют собой элементы, из
которых
конструируется
видимое
изображение,
создаваемое работающей программой. Существуют
компоненты, которые не создают видимое изображение, но
которые, тем не менее, играют важную роль в тех или
иных случаях.
Компоненты
располагаются
на
Палитре
компонентов, расположенной в правой части окна.
Рассмотрим
некоторые
страницы,
которые
вам
понадобятся в дальнейшем и их стандартные компоненты.
Компоненты
Визуальные
Невизуальные
3.2. Страница Standard.
На странице Standard палитры компонентов
сосредоточены стандартные Windows интерфейсные
элементы, перечисленные в следующей таблице.
Пиктограмма
Имя
Frame
MainMenu
18
Назначение
Фрейм.
Это
контейнер для других
компонентов. На нем,
как и на форме, можно
размещать и удалять
разные компоненты.
Главное
меню
программы. Компонент
PopupMenu
Label
Edit
Memo
Button
CheckBox
19
способен создавать и
обслуживать сложные
иерархические меню.
Вспомогательное
меню. Обычно это
меню появляется в
виде отдельного окна
после нажатия правой
кнопки мыши.
Метка.
Этот
компонент
используется
для
размещения в окне не
очень
длинных
однострочных
надписей.
Строка
ввода.
Предназначена
для
ввода
и/или
отображения
одной
текстовой строки.
Многострочный
текстовый
редактор.
Используется для ввода
и/или
отображения
многострочного текста.
Командная кнопка.
Обработчик
события
Onclick
этого
компонента
используется
для
реализации некоторой
команды.
Независимый
переключатель.
Щелчок мышью на
этом компоненте в
работающей программе
изменяет
его
логическое
свойство
Checked
RudioButton
ListBox
ComboBox
ScrollBar
GroupBox
20
Зависимый
переключатель.
Обычно объединяется
как минимум с еще
одним
таким
же
компонентом в группу.
Щелчок
по
переключателю
приводит
к
автоматическому
освобождению ранее
выбранного
переключателя в той
же группе.
Список выбора.
Содержит
список
предлагаемых
вариантов (опций) и
дает
возможность
проконтролировать
текущий выбор.
Комбинированный
список
выбора.
Представляет
собой
комбинацию
списка
выбора и текстового
редактора.
Полоса управления.
Представляет
собой
вертикальную
или
горизонтальную
полосу,
напоминающую
полосы прокрутки по
бокам Windows-окна.
Группа
элементов.
Этот
компонент
используется
для
группировки
нескольких по смыслу
компонентов.
RadioGroup
Panel
ActionList
Группа
зависимых
переключателей.
Содержит специальные
свойства
для
обслуживания
нескольких связанных
зависимых
переключателей.
Панель.
Этот
компонент,
как
и
GroupBox, служит для
объединения
нескольких
компонентов.
Содержит внутреннюю
и внешнюю кромки,
что позволяет создать
эффекты
«вдавленности»
и
«выпуклости»
Список
действий.
Служит
для
централизованной
реакции программы на
действия пользователя,
связанные с выбором
одного
из
группы
однотипных
управляющих
элементов, таких как
опции
меню,
пиктографические
кнопки и т.п.
3.3. Страница Additional.
В страницу Additional помещено 15 дополнительных
компонентов, с помощью которых можно разнообразить
вид диалоговых окон.
Пиктограмма
Имя
21
Назначение
BitBtn
SpeedButton
MaskEdit
StringGrid
DrawGrid
Image
Shape
22
Командная строка с
надписью
и
пиктограммой.
Пиктографическая
кнопка.
Обычно
используется
для
быстрого доступа к
тем или иным опциям
главного меню.
Специальный
текстовый редактор.
Способен
фильтровать
вводимый
текст,
например,
для
правильного
ввода
даты.
Таблица строк. Этот
компонент обладает
мощными
возможностями для
представления
текстовой
информации
в
табличном виде.
Произвольная
таблица. В отличие от
StringGrid,
строки
этого
компонента
могут
содержать
произвольную
информацию, в том
числе и рисунки.
Рисунок.
Этот
компонент
предназначен
для
отображения
рисунков.
Фигура. С помощью
этого компонента вы
можете вставить в
Bevel
ScrollBox
CheckListBox
Splitter
23
окно
правильную
геометрическую
фигуру
–
прямоугольник,
эллипс, окружность и
т.п.
Кромка. Служит для
выделения отдельных
частей
окна
трехмерными
рамками
или
полосами.
Панель с полосами
прокрутки. В отличие
от компонента Panel,
автоматически
вставляет
полосы
прокрутки,
если
размещенные в нем
компоненты
отсекаются
его
границами.
Список
множественного
выбора. Отличается
от
стандартного
компонента ListBox
наличием рядом с
каждой
опцией
независимого
переключателя типа
CheckBox,
облегчающего выбор
сразу
нескольких
опций.
Граница.
Этот
компонент
размещается
на
форме между двумя
другими видимыми
компонентами и дает
StaticText
ControlBar
Chart
возможность
пользователю
перемещать границу,
отделяющую
компоненты друг от
друга.
Статический
текст.
Отличается
от
стандартного
компонента
Label
наличием
собственного
Windows-окна,
что
позволяет обводить
текст рамкой или
выделять его в виде
«вдавленной» части
формы.
Панель
контроля.
Служит
для
размещения
и
перемещения
объектов внутри неё.
Диаграмма.
Этот
компонент упрощает
создание
специальных панелей
для
графического
представления
данных.
3.4. Страница Win32.
Страница Win32 содержит интерфейсные элементы
для 32-разрядных операционных систем Windows 95/98/NT
Пиктограмма
Имя
TabControl
24
Назначение
Набор
закладок.
Каждая
закладка
представляет
собой
прямоугольное поле с
PageControl
ImageList
RishEdit
TrackBar
25
надписью
и/или
текстом. Выбор той или
иной
закладки
распознается
программой
и
используется
для
управления
содержимым
окна
компонента.
Набор
панелей
с
закладками.
Каждая
панель
может
содержать свой набор
интерфейсных
элементов и выбирается
щелчком по связанной
с ней закладке.
Набор
рисунков.
Представляет
собой
хранилище
для
нескольких рисунков
одинакового размера.
Многострочный
редактор
форматированного
текста. В отличие от
компонента
Memo
страницы
Standard,
текст в компоненте
RiсhEdit
подчиняется
правилам
Расширенного
Текстового
Формата
(RTF-Rich Text Format)
и может изменять такие
свои характеристики,
как
шрифт,
цвет,
выравнивание и т.д.
Регулятор.
Используется
для
управления значениями
ProgressBar
UpDown
HotKey
Animate
26
некоторых величин в
программах. Например,
с его помощью удобно
изменять
громкость
звучания
в
мультимедийных
программах.
Индикатор процесса. С
помощью
этого
компонента
можно
отображать
ход
исполнения достаточно
длительного
по
времени
процесса,
например,
процесса
переноса данных на
дискету.
Цифровой регулятор.
Две
кнопки
этого
компонента
предназначены
для
увеличения (верхняя)
или
уменьшения
(нижняя) связанной с
компонентом числовой
величины.
Управляющая клавиша.
Компонент
используется для ввода
управляющих клавиш,
таких как F1, Alt+A,
Crtl+Shift+1 и т.п.
Мультипликатор.
Предназначен
для
отображения
последовательно
сменяющих друг друга
кадров
движущихся
изображений
(видео
клипов). Компонент не
может
сопровождать
DateTimePicker
MonthCalendar
TreeView
ListView
HeaderControl
27
видеоклип звуком.
Селектор
времени/даты.
Этот
компонент
предназначен для ввода
даты или времени.
Календарь
месяца.
Служит для выбора
даты.
Дерево
выбора.
Представляет
собой
совокупность
связанных
в
древовидную структуру
пиктограмм.
Обычно
используется
для
просмотра структуры
каталогов (папок) и
других
подобных
элементов, связанных
иерархическими
отношениями.
Панель
пиктограмм.
Организует просмотр
нескольких пиктограмм
и выбор нужной. Этот
компонент
способен
располагать
пиктограммы
в
горизонтальных
или
вертикальных рядах и
показывать
их
в
крупном или мелком
масштабе.
Управляющий
заголовок.
Представляет
собой
горизонтальную
или
вертикальную полосу,
разделенную на ряд
смежных
секций
с
StatusBar
ToolBar
CoolBar
28
надписями.
Размеры
секций можно менять
мышью на этапе работы
программы.
Обычно
используется
для
изменения
размеров
столбцов или строк в
различного
рода
таблицах.
Панель
статуса.
Предназначена
для
размещения
разного
рода
служебной
информации в окнах
редактирования.
Посмотрите
на
нижнюю часть рамки
окна кода Delphi или
текстового редактора
Word, и вы увидите
этот
компонент
в
действии.
Инструментальная
панель. Этот компонент
служит
контейнером
для командных кнопок
BitBtn
и
способен
автоматически
изменять их размеры и
положение
при
удалении кнопок или
при добавлении новых.
Инструментальная
панель. В отличие от
ToolBar, используется
как
контейнер
для
размещения
стандартных
интерфейсных
компонентов Windows
таких как Edit, ListBox,
Combobox и т.д.
Прокручиваемая
панель. Служит для
размещения
узких
инструментальных
панелей.
При
необходимости
автоматически создает
по
краям
панели
стрелки прокрутки.
PageScroller
3.5. Страница System.
На этой странице представлены компоненты,
которые имеют различное функциональное назначение, в
том числе компоненты, поддерживающие стандартные для
Windows технологии межпрограммного обмена данными
OLE (Object Linking and Embedding – связывание и
внедрение объектов) и DDE (Dynamic Data Exchange –
динамический обмен данными).
Пиктограмма
Имя
Timer
PaintBox
MediaPlayer
29
Назначение
Таймер. Этот компонент
служит
для
отсчета
интервалов
реального
времени.
Окно
для
рисования.
Создает прямоугольную
область, предназначенную
для
прорисовки
графических
изображений.
Мультимедийный
проигрыватель.
С
помощью
этого
компонента
можно
управлять
различными
мультимедийными
устройствами.
OleContainer
DDEClientConv
DDEClientItem
DDEServerConv
DDEServerItem
OLE- контейнер. Служит
приемником связываемых
или внедряемых объектов.
DDE-связь. Совместно с
DDEClientItem
используется для создания
клиентской
программы
DDE-связи.
DDE-тема.
Определяет
тему
DDE-связи
в
клиентском приложении.
DDE-связь. Совместно с
DDEServerItem
используется для создания
серверной
программы
DDE-связи.
DDE-тема.
Определяет
тему
DDE-связи
в
серверном приложении.
3.6. Страница Data Access.
В Delphi развиты средства построения приложений,
рассчитанных на работу с электронными архивами (базами
данных). Девять компонентов страницы Data Access
облегчает доступ программ к базам данных (БД).
Пиктограмма
Имя
DataSource
Table
Query
Назначение
Источник данных. Служит
связующим элементом между
компонентами
доступа
к
данным
и
компонентами
отображения данных.
Таблица. Служит мощным
средством доступа к файлам
баз данных (к таблицам).
Запрос.
Осуществляет
выборку данных из таблиц с
помощью структурированного
языка запросов SQL.
30
StoredProc
Database
Session
BatchMove
UpdateSQL
NestedTable
Сохраняемая
процедура.
Обеспечивает
доступ
к
процедурам
сервера
баз
данных,
такового
как
InterBase, Oracle, Ms SQL и
т.п.
База данных. Этот компонент
используется
для
явного
управления
процессом
соединения с защищенной
паролем базой данных.
Сеанс связи с базой данных.
Необходимость
в
этом
компоненте
возникает
в
многопотоковых приложениях
баз данных, когда два или
более потока одновременно
обращаются к одной и той же
базе данных.
Пакетная
пересылка.
Используется для массовых
пересылок данных, например,
для копирования локальных
таблиц в таблицы сервера баз
данных.
Модификация данных. Этот
компонент используется для
управления
изменениями
(модификациями) данных, с
которыми
манипулируют
компоненты Table, Query или
StoredProc.
Многоуровневая
таблица.
Создает набор данных из
таблицы, которая является
полем в другой таблице.
3.7. Страница Data Controls.
Компоненты страницы Data Controls представляют
собой
модификацию
стандартных
интерфейсных
31
элементов применительно к работе с базами данных. Они
обслуживают текущий набор данных, доступ к которому
реализует один из компонентов Table, Query и т.п.
Пиктограмма
Назначение
Имя
DBGrid
DBNavigator
DBText
DBEdit
DBMemo
32
Таблица
БД.
Использует табличную
форму
для
визуализации
и
изменения данных в
текущем
наборе
данных.
Навигатор
БД.
Обеспечивает
перемещение
по
записям набора данных,
а
также
реализует
вставку, удаление или
редактирование
записей.
Текст
БД.
Предназначен
для
отображения (но не
изменения) текстовых
полей из текущего
набора данных.
Текстовый
редактор
БД. Используется для
отображения
и
изменения, текстовых
полей набора данных.
Многострочный
текстовый редактор БД.
С
помощью
этого
компонента
отображаются
и/или
изменяются
многострочные
текстовые поля (Memoполя) набора данных.
DBImage
DBListBox
DBComboBox
DBCheckBox
DBRadioGroup
DBLookUpListBox
33
Рисунок
БД.
Предназначен
для
отображения
и
редактирования
хранящихся
в
БД
графических
изображений.
Список выбора БД.
Предназначен
для
отображения текущего
значения
текстового
поля БД, а также
занесения в него одного
из
возможных
значений,
содержащихся с списке.
Раскрывающийся
список выбора БД.
Подобен
компоненту
ComboBox
страницы
Standart,
но
обслуживает текстовое
поле БД.
Независимый
переключатель
БД.
Обслуживает
логическое поле БД.
Группа
зависимых
переключателей
БД.
Служит
для
отображения состояния
или выбора одного из
взаимоисключаемых
значений поля БД.
Список выбора БД.
Отличается
от
DBListBox тем, что
элементы
списка
заполняются
содержимым,
берущимся из полей
DBLookUpComboBox
DBRichEdit
DBCtrlGrid
DBChart
другого набора данных,
в то время как список
DBListBox формируется
произвольными
значениями.
Комбинированный
список выбора БД. В
отличие
от
DBComboBox,
содержимое
списка
берется из другого
набора данных.
RTF-редактор. Служит
для
отображения/изменения
текстовых
полей,
использующих
расширенный
текстовый формат RTF.
Многострочная таблица
БД. В отличие от
DBGtid,
позволяет
редактировать
в
удобном
для
пользователя формате
(в
так
называемом
формате формы) сразу
несколько
записей
набора данных.
График БД. Реализует
функциональные
свойства
компонента
Chart применительно к
данным из БД.
3.8. Страница Qreport.
Компоненты страницы Qreport обеспечивают
простой способ создания отчетов по результатам выборки
данных из баз данных.
34
Пиктограмма
Имя
QuickRep
QRSubDetail
Назначение
Отчет.
Этот
компонент
превращает
форму,
на
которую
он
помещен, в отчет.
Главныйдетальный.
В
отличие
от
компонента
QRGroup,
не
требует
включения
компонента Query
для
создания
отчета
типа
главныйдетальный.
Строковая полоса.
QRStringsBand
QRBand
QRChildBand
QRGroup
35
Полоса
отчета.
Формирует
в
отчете
полосу
того или иного
назначения
–
полосу-заголовок,
полосу данных и
т.д.
Вспомогательная
полоса.
Предназначена
для размещения
других
компонентов
отчета.
Группа
отчета.
Используется
совместно
с
компонентом
QRLabel
QRDBText
QRExpr
QRSysData
QRMemo
36
Query
для
создания отчета
типа
главныйдетальный.
Текст.
Обеспечивает
вывод в отчете
статического
текста, например,
заголовка
Текстовое поле.
Используется для
вывода в отчете
текстовой
информации
из
БД.
Вычисляемое
поле.
Обеспечивает
типичные
для
отчета
вычисления
–
суммирование
данных,
вычисление
среднего, общего
количества и т.д.
Системная
величина.
Используется для
вывода
разнообразной
системной
информации
текущей
даты,
времени, номера
страницы и т.п.
Многострочный
текст.
QRExprMemo
QRRichText
QRBDRichText
QRShape
QRImage
QRDBImage
Многострочное
вычисляемое
поле.
Многострочный
форматированный
текст, в формате
RTF.
Многострочное
форматируемое
текстовое
поле
формата RTF.
Фигура.
С
помощью
этого
компонента
можно поместить
в
отчет
геометрическую
фигуру.
Рисунок.
Этот
компонент служит
для размещения в
отчете
произвольной
текстовой
информации.
Поле
данных,
содержащее
рисунок.
Составной отчет.
QRCompositeReport
QRPreview
QRTextFilter
37
Просмотр.
Обеспечивает
базу для создания
пользовательского
варианта
просмотра образа
отчета.
Компонент
для
экспорта отчета
при его печати в
QRCSVFilter
QRHTMLFilter
QRChart
формат текстовых
строк.
Компонент
для
экспорта отчета
при его печати в
формат CSV
Компонент
для
экспорта отчета
при его печати в
формат HTML.
Компонент
для
вставки в отчет
генератора
диаграмм.
3.9. Страница Dialogs.
Компоненты
страницы
стандартные для Windows диалоги.
Пиктограмма
Имя
OpenDialog
SaveDialog
OpenPictureDialog
38
Dialogs
реализуют
Назначение
Открыть.
Реализует
стандартное
диалоговое окно
«Открыть файл».
Сохранить.
Реализует
стандартное
диалоговое окно
«Сохранить
файл».
Открыть рисунок.
Реализует
специальное окно
выбора
графических
файлов
с
возможностью
предварительного
просмотра
SavePictureDialog
FontDialog
ColorDialog
PrintDialog
PrinterSetupDialog
FindDialog
39
рисунков.
Сохранить
рисунок.
Реализует
специальное окно
сохранения
графических
файлов
с
возможностью
предварительного
просмотра
рисунков.
Шрифт.
Реализует
стандартное
диалоговое окно
выбора шрифта.
Цвет. Реализует
стандартное
диалоговое окно
выбора цвета.
Печать.
Реализует
стандартное
диалоговое окно
выбора
параметров для
печати
документа.
Настройка
принтера.
Реализует
стандартное
диалоговое окно
для
настройки
печатающего
устройства.
Поиск. Реализует
стандартное
диалоговое окно
поиска
ReplaceDialog
текстового
фрагмента.
Замена.
Реализует
стандартное
диалоговое окно
поиска и замены
текстового
фрагмента.
3.10. Основные свойства объектов.
Все компоненты имеют свойства и реагируют на
события.
Свойства позволяют управлять внешним видом и
поведением компонентов при создании и выполнении
приложения. Установка значений большинства свойств
компонентов обычно выполняется при создании
приложения с помощью Инспектора Объектов.
Визуальные компоненты способны генерировать и
обрабатывать достаточно большое число (несколько
десятков) события различных видов. К наиболее общим
группам событий можно отнести следующие:
 Выбор управляющего элемента;
 Перемещение указателя мыши;
 Нажатие клавиш;
 Получение и потеря управляющим элементом
фокуса ввода;
 Перемещение объектов методом drag-and=drop.
Рассмотрим основные свойства компонентов, на
примере компонента Label (Метка)
Поставьте на форму компонент Label (Метка) из
палитры компонентов Standard (Стандартная).
Обратите внимание на окно Object Inspector
(Инспектора Объектов).
Рассмотрим основные свойства данного компонента,
которые применимы и другим визуальным компонентам:
40
Свойство
Значение
Align
Caption
Расположение на форме:
-alNone - отсутствует
-alBottom –внизу формы
-alClient – по всей клиентской области формы
-alLeft – слева на форме
-alRight справа на форме
-alTop –наверху формы
Расположение текста внутри метки
taCenter – по центру
taLeftJustify – по левому краю
taRightJustify –по правому краю
Заголовок метки
Color
Цвет метки
Cursor
Вид курсора, который будет виден при
наведении мыши на метку
Определяет
доступность
компонента
пользователю
True – компонент доступен, цвет обычный
False – компонент не доступен, цвет серый
Шрифт
Высота компонента
Текст подсказки, если свойство ShowHint=true
Отступ компоненты слева от края формы
Alignment
Enabled
Font
Height
Hint
Left
Name
ShowHint
Top
Visible
Width
Имя компоненты, к которому можно
обращаться в программе
Включение/Выключение подсказок
True - подсказка включена
False - подсказка выключена
Отступ компонента от верхнего края формы
Определяет видимость компонента
True - видимый
False – невидимый
Ширина компонента
41
3.11. Практическая работа
Создадим приложение, которое по нажатию на
кнопку
будет
переносить
строку,
введенную
пользователем в многострочный редактор.
Разместите на форме компоненты
 Панель Panel (страница Standard);
 Две кнопки с рисунком Bitbtn (страница Additional
Дополнительная);
 Строка ввода Edit (страница Standard);
 Метка Label (страница Standard);
 Многострочный
редактор
Memo
(страница
Standard);
Панель нужна для того, чтобы размещаемые на ней
кнопки, строка ввода и метка всегда располагались в
нижней части окна, даже если окно распахнуто на весь
экран. Левая кнопка ОК служит для сообщения программе
о том, что в строке ввода подготовлен текст. Правая
кнопка Close служит для завершения работы программы.
Измените свойства компонентов:
Форма
С
войство
C
aption
H
eight
N
ame
P
osition
W
idth
Значение
Учебная
программа
375
FmExample
PoScreenCe
nter
544
Панель Panel
С
войство
A
lign
B
З
начение
A
lBottom
b
42
evelouter
C
aption
H
eight
vNone
С
войство
K
ind
L
eft
N
ame
T
op
З
начение
b
kOk
3
2
b
bRun
4
8
8
4
Кнопка ОК
Кнопка Close
С
войство
K
ind
L
eft
N
ame
T
op
З
начение
b
kClose
1
28
b
bClose
4
8
Строка ввода Edit
С
войство
N
ame
L
eft
T
ext
T
op
W
idth
З
начение
e
dInput
1
28
1
6
2
89
43
Метка Label
С
войство
A
lign
C
aption
N
ame
З
начение
A
lBottom
L
bOutput
Многострочный редактор Memo
С
войство
Al
ign
Li
nes
Sc
rollBars
N
ame
W
ordWrap
З
начение
A
lClient
S
sBoth
m
mOutput
F
alse
Щелкните дважды по кнопке с именем bbRun
(кнопка ОК) и запишите в процедуру следующие строки:
procedure TfmExample.bbRunClick(Sender: TObject);
begin
lboutput.Caption:=edinput.Text;
//Повторяем текст в метке
mmoutput.Lines.Add(edinput.text);
//и в многострочном редакторе
edinput.Text :='';
//Очищаем строку ввода
edinput.SetFocus;
// Передаем ей фокус ввода
end;
44
Глава IV. Введение в Объектноориентированное программирование
(ООП)
Язык
Object
Pascal
является
языком
программирования Delphi и представляет собой объектноориентированное расширение стандартного языка Pascal.
Система
Delphi
обеспечивает
возможность
визуального программирования на нем с помощью
библиотеки визуальных компонентов.
4.1. Алфавит языка.
Алфавит языка включает:
53 буквы(A-Z,a-z, и знак _)
0-9
23 специальных символа(+ - * / , ; := > < ‘ ( ) [ ] { }
# $ ^ & знак пробела).
Комбинации специальных символов образуют
следующие составные символы:
:= присваивание
<> не равно
.. диапазон значений
>= больше либо равно
<=меньше либо равно
(* *) тоже что и { }
(. .) тоже что и [ ]



4.2. Словарь языка.
Словарь языка:
ключевые слова
стандартные идентификаторы
идентификаторы пользователя
Ключевые (зарезервированные слова) являются
составной частью языка, имеют фиксированное написание
и определенный смысл, изменить который программист не
может.



45
Например, : label, goto, unit,begin.
Стандартные идентификаторы служат для
обозначения
следующих
заранее
определенных
конструкция языка

типов данных

констант

процедур и функций
Например: sin,pi,real;
Идентификаторы пользователя применяются для
обозначения имен меток, констант, переменных, процедур,
функций и типов данных. Задаются программистом и
должны отвечать следующим требованиям:
 составляются из букв и цифр;
 всегда начинаются только с букв(исключенияметки)
 можно использовать как строчные так и прописные
буквы, компилятор интерпретирует их одинаково.
 Между двумя идентификаторами в программе
должен быть по крайней мере один разделитель.
4.3. Структура программы.
Исходный текст программы представляется в виде
последовательности строк, в которой строка начинается с
любой позиции. Структурно программа состоит из
заголовка и блока.
46
Блок
Описательная
Описание
элементов
программы; включает:
 Подключение модулей;
 Объявление меток;
 Объявление констант;
 Описание типов данных;
 Объявление переменных;
 Описание процедур и
функций;
Исполнительная
Указываются действия с
различными
элементами
программы, позволяющие
получить
требуемый
результат
В конце каждого из указанных разделов ставится
точка с запятой.
Заголовок находится в начале программы и имеет
вид
Структуру программы в общем случае можно
представить следующим образом:
program <Имя программы>;
uses <список модулей>;
label <список меток>;
const <список констант>;
type<описание типов>;
var<объявление переменных>;
<описание процедур>;
<описание функций>;
begin
<операторы>;
end.
47
Раздел
Формат описания
Подключение
модулей
Uses
<Имя1>,<Имя2>,…,<И
мяN>
Uses crt,
MyLib;
Объявление
меток
Label
<Имя1>,<Имя2>,…,<И
мяN>
Const
<идентификатор1>=<В
ыражение>;
…
<идентификаторN>=<
Выражение>;
Type
<Имя
типа1>=<описание
типа>;<Имя
типа2>=<описание
типа>;
Label
metka1,10,Y;
Var
<идентификатор>:<Ти
п>;
…
<идентификаторN>:<Т
ип>;
Var
k:integer;
symbol:char;
a,b,c:real;
Объявление
констант
Описание
типов
Объявление
переменных
Пример
dos,
Const
st1=’word’;
ch=’5’;n=3;
Type
char2=(‘a’..’z’);
massiv=array[1..
100] of real;
month=1..12;
Подпрограммой называют логически законченную
и специальным образом оформленную часть программы,
которая по имени может вызываться для выполнения из
других точек программы неограниченное число раз.
4.3. Типы данных
48
Данные
Константы
Переменные
Литералы
Данные,
значения которых
установлены
в
разделе
объявления
констант(const) и
не изменяются в
процессе
выполнения
программы
Данные,
объявляющиеся в
разделе описания
переменных(var) ,
которые получают
свои значения в
процессе
выполнения
программы
Данные, данные
которые не имеют
имени
и
представляются в
тексте программы
непосредственно
значением.
По
другому- значения
Тип определяет множество значений, которые
могут принимать элементы программы, и совокупность
операций, допустимых над этими значениями.
Типы данных можно разделить на следующие
группы:

Простые

Структурные

Указатели

Процедурные

Вариантные
Важное значение имеет понятие совместимости
типов, которое означает, что типы равны друг другу или
один из них может быть автоматически преобразован к
другому.(например, совместимым являются вещественный
и целочисленный тип, так как целое число
преобразовывается в вещественное, но не наоборот)
49
4.3.1. Простые типы данных
Данные простых типов не содержат данных других
типов. Переменные этих типов могут в каждый момент
времени иметь только одно значение.
К ним относятся:

Целочисленные

Литерные(символьные)

Логические(булевские)

Вещественные
Все
типы(кроме
вещественного)
являются
порядковыми, то есть значения переменных каждого из
этих
типов
образуют
упорядоченную
конечную
последовательность.
Для значений и имен переменных порядковых
типов можно применять следующие функции:
Low(T) – минимальное значение типа данных Т
High(T) – максимальное значение типа Т
Ord(X) – порядковый номер значения Х
Pred(X) – значение, предшествующее значению
выражения Х
Succ(X) – значение, следующее после значения
выражения Х
Кроме того, к ним применимы следующие
процедуры:
DEC(X) – уменьшение значения переменной Х на
единицу
INC(X) – увеличение значения переменной Х на
единицу
Название
Целочисленный
тип данных
Обозначение
Integer
Литерный тип
Char
Логический тип
Boolean
Примечания
Диапазон
2 147 483 6482 147 483 647
Отдельные символы
2
значения:
true(истина)
и
50
false(ложь)
Вещественный тип
Запись возможна с
фиксированной
точкой
и
с
плавающей
Real
4.3.2. Структурные типы данных
Данные структурного типа состоят из данных
других типов, в том числе и с структурного. К данным
структурного типа относятся:

Строки

Массивы

Множества

Записи

Файлы

Классы
4.4. Операторы
Операторы представляют собой законченные
предложения языка, которые выполняют некоторые
действия над данными. Операторы Delphi можно разделить
на две группы:

Простые

Структурированные
Правила
записи
операторов:
Операторы
разделяются точка с запятой. Точка с запятой – это
разделитель операторов, и ее отсутствие между
операторами является ошибкой. Между операторами
может находиться несколько точек с запятой, что не
является ошибкой, так как они обозначают пустые
операторы.
4.5. Практическая работа. Объект
MainMenu.
Работа с меню
51
Практически все приложения Windows имеют свое
меню – один из распространенных элементов
пользовательского интерфейса. Меню представляет собой
список пунктов, объединенных по функциональному
признаку, каждый из которых обозначает команду или
вложенное меню (подменю).
Обычно в приложении имеется главное меню и
несколько контекстных (всплывающих) меню. Главное
используется для управления работой всего приложения,
каждое из контекстных меню служит для управления
отдельным интерфейсным элементом. Меню в Delphi
реализуют компоненты MainMenu – главное меню и
PopupMenu – всплывающее меню. Рассмотрим основное
свойство этих компонентов:
Items – содержит строки –пункты меню. Это
свойство можно заполнить при помощи дизайнера меню,
щелкнув в окне Object Inspector (Инспектора Объектов) на
пункте Items или щелкнув правой кнопкой мыши на
компоненте и в контекстном меню выбрав пункт Menu
Designer.
Отдельный пункт меню – это текст, описывающий
назначение пункта меню. Основные свойства пункта меню:
Caption – содержит строку текста, отображаемую
как название (заголовок ) пункта меню. Если в качестве
названия символ "-", то на месте пункта отображается
разделительная линия.
Bitmap – определяет изображение пиктограммы,
размещаемое слева.
Enabled – определяет, активен ли пункт меню, т.е
будет ли он реагировать на события от клавиатуры или
мыши. По умолчанию True, то есть активен.
Visible – определяет, виден ли пункт на экране. По
умолчанию true, то есть виден.
Shotcut –определяет комбинацию клавиш для
активизации пункта меню.
Break –задает, разделяется ли меню на колонки.
mbNone – меню не разделяется;
52
mbBreak – пункты меню, начиная с текущего,
образуют новую колонку;
mbBreakBar – пункты меню, начиная с текущего,
образуют новую колонку, которая отделена линией.
Checked –определяет, является ли пункт меню
выделенным.
RadioItem –определяет вид отметки, появляющейся
в заголовке пункта. Если False, то отметка в виде галочки.
Items –массив строк, состоящий из названий
пунктов меню. Нумерация начинается с нуля. Items[0],
Items[1], Items[2] и т.д .
Count – задает количество подпунктов в данном
пункте меню.
Поместите на форму метку Label и два
невизуальных компонента MainMenu (главное меню),
PopupMenu (контекстное меню). В главном меню два
пункта: Цвет и выход. Подпунктами «цвета» будут: «фон»
и «текст». В свою очередь они будут распадаться на
пункты: «красный», «зеленый», «синий».
Пункты контекстного (всплывающего) меню:
«синий», «белый», «красный».
Код программы:
// процедура на пункт меню «Выход»:
procedure TForm1.N9Click(Sender: TObject);
begin
close;
end;
// процедура на пункт меню «Цвет фона»-> «Красный»
procedure TForm1.N3Click(Sender: TObject);
begin
form1.Color:=clred;
53
end;
// процедура на пункт меню «Цвет фона»-> «Зеленый»
procedure TForm1.N4Click(Sender: TObject);
begin
form1.Color:=clgreen;
end;
// процедура на пункт меню «Цвет фона»-> «Синий»
procedure TForm1.N5Click(Sender: TObject);
begin
form1.Color:=clblue;
end;
// процедура на пункт меню «Цвет текста»-> «Лимонный»
procedure TForm1.N8Click(Sender: TObject);
begin
label1.Font.Color:=cllime;
end;
// процедура на пункт меню «Цвет текста»-> «Желтый»
procedure TForm1.N7Click(Sender: TObject);
begin
label1.Font.Color:=clyellow;
end;
// процедура на пункт меню «Цвет текста»-> «Лимонный»
procedure TForm1.N8Click(Sender: TObject);
begin
label1.Font.Color:=cllime;
end;
// процедура на пункт всплывающего меню «Синий»
procedure TForm1.N10Click(Sender: TObject);
begin
label1.Font.Color:=clblue;
end;
// процедура на пункт всплывающего меню «Белый»
procedure TForm1.N12Click(Sender: TObject);
begin
label1.Font.Color:=clwhite;
end;
// процедура на пункт всплывающего меню «Красный»
procedure TForm1.N11Click(Sender: TObject);
begin
label1.Font.Color:=clred;
end;
54
// процедура на событие метки MouseUp, всплытие
контекстного меню по нажатию правой кнопкой мыши на
метке.
procedure
TForm1.Label1MouseUp(Sender:
TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
label1.PopupMenu:=popupmenu1;
end;
55
Глава V. Работа с формами
Форма
является
важнейшим
визуальным
компонентом,
на
основе
которого
начинается
конструирование приложения. Каждое приложение может
иметь несколько форм, одна из которых является главной и
отображается первой при запуске.
Указать главную форму можно через пункт меню
Project/Options(Проект/Параметры).
Главная
форма
выбирается в раскрывающемся списке Main form на
странице form.
Форма
Немодальная
–
позволяет
переключиться
в
другую
форму
приложения
без
своего
закрытия.
Вызывается
процедурой Show.
Модальная
–
требует
обязательного своего
закрытия
перед
обращением к любой
другой
форме
приложения.
Вызывается
процедурой
ShowModal.
5.1. Практическая работа
Рассмотрим простейшее приложение, работающее с
несколькими формами.
1. На форму поместите кнопку с рисунком BitBtn,
которая находится на палитре компонентов
Additional (Дополнительная).
2. Свойству Caption кнопки присвойте значение
«Следующая».
3. Создайте еще две формы.
4. Перейдите на первую форму и напишите
процедуру для кнопки:
56
procedure
TForm1.BitBtn1Click(Sender:
TObject);
begin
Form2.show;
end;
5. На вторую форму поставьте такую же кнопку и
опишите для нее процедуру.
procedure
TForm2.BitBtn1Click(Sender:
TObject);
begin
Form3.showmodal;
end;
57
Глава VI. Объединение элементов
управления
При разработке приложения часто возникает задача
объединения, или группирования различных элементов
управления.
Объединение элементов управления выполняется с
помощью специальных компонентов – контейнеров.
Контейнер представляет собой визуальный компонент,
который позволяет размещать на свое поверхности другие
компоненты, объединяет эти компоненты в группы и
становится их владельцем. В качестве универсальных
компонентов для различных объектов Delphi предлагает
такие компоненты:
Группу GroupBox
Панель Panel
Область прокрутки ScrollBox
Фрейм (рамку) Frame
Форма также является контейнером, с которого
обычно и начинается конструирование интерфейсной
части приложения.
Группа GroupBox используется в основном для
визуального
выделения функционально связанных
управляющих элементов.
Панель Panel представляет собой контейнер, в
котором можно размещать другие элементы управления.
Панели применяются в качестве визуальных средств
группирования, а также для создания панелей
инструментов и строк состояния.
6.1. Объект Panel.
Панель имеет край с двойной фаской: внутренней и
внешней. Внутренняя фаска обрамляет панель, а внешняя
отображается вокруг внутренней.
Свойство BevelWidth ширина фаски в пикселах
BevelInner - вид внутренней фаски;
BevelOuter – вид внутренней фаски;
58
Значения свойств могут быть:
bvNone – фаска отсутствует
bvLowered – фаска утоплена
bvRaid – фаска приподнята
bvSpace – действие не известно
BorderWidth ширина между фасками.
6.2. Область прокрутки ScrollBox
Область прокрутки ScrollBox представляет собой
окно,
предоставляющее
возможность
прокрутки
информации.
Свойства:
AutoScroll – определяет автоматическое появление
полос прокрутки. По умолчанию True.
BorderStyle – определяет наличие рамки
bsNone – рамки нет
bsSingle – рамка есть (по умолчанию)
6.3. Фреймы Frame.
Фреймы Frame представляет собой контейнер для
других компонентов, который на этапе разработки
создается так же, как и форма, но в отличие от нее, может
быть размещен в другом контейнере, например, форме или
панели.
Работа с фреймом включает два этапа:
Создание и конструирование фрейма
Размещение созданного фрейма в нужном месте
формы или на панели
Для создания фрейма следует выполнить команду
File/New Frame (Файл/ Новый Фрейм).
Вид фрейма на этапе разработки ни чем не
отличается от вида формы. Для размещения фрейма на
форме в Палитре компонентов следует выбрать компонент
Frame и поместить его в нужное место формы. При
отпускании компонента появляется диалоговое окно Select
frame to insert (выберите фрейм для вставки), в котором
выбирается имя фрейма.
59
6.4. Практическая работа
Калькулятор со свободным вводом
Разработаем аналог калькулятора, который будет
выполнять 4 основные операции с числами.
Форма
Свойство
Caption
Значение
Калькулятор
со
свободным вводом
Position
PoScreenCenter
Width
400
Height
250
BorderStyle
BsSingle
Примечание
Заголовок
«Калькулятор
со
свободным вводом»
Размещение формы
симметрично
по
центру экрана
Ширина формы –
400
Высота формы –
250
Границы
формы
фиксированные
2 строки ввода (компонент Edit на странице Standard)
Свойство Значение
Примечание
Name
EditOpetand1, EditOperand2
Имя
первой
строки
ввода
EditOpetand1,
Имя
второй
строки
ввода
EditOperand2
Text
Значение
свойства Text
отсутствует
Строка вывода результата (компонент Edit на странице
Standard)
Свойство Значение
Примечание
Name
EditResult
Имя
объекта
EditResult
Text
Значение
свойства Text
60
ReadOnly
отсутствует
Только
для
чтения
True
Символы операций (компонент Label на странице
Standard)
Свойство Значение
Примечание
Caption
?
Заголовок
меток «?»
Name
LabelOperator, LabelResult
Имя
первой
метки
LabelOperator
Имя
второй
метки
LabelResult
Font Size
15
Размер шрифта
– 15
Style
True
Начертание
–
fsBold
полужирный
Кнопка Close (компонент BitBtn на странице Additional)
Свойство Значение
Примечание
Kind
BkClose
Тип bkClose
Name
CloseBitBtn
Имя
кнопки
CloseBitBtn
Функциональные клавиши (компонент SpeedButton на
странице Additional)
Caption
Name
Font Size
Style
+
AddBtn
SubBtn
*
MulBtn
10
Bold
/
DivideBtn
Mod
ModBtn
Div
DivBtn
Clear
ClearBtn
Сохранение программы
1. Создайте папку Calculator на диске С:\
2. Выполните команду File => Save Project As…
61
3. Файл
модуля
FreeCalcUnit.pas
4. Файл
проекта
FreeCalcProject.dpr
сохраните
под
именем
сохраните
под
именем
Ввод кода программы
Добавьте методы обработки событий управления
функциональными клавишами калькулятора.
1. Создайте событие OnClick для кнопки сложения и
запишите код программы для сложения двух
чисел:
В разделе переменных объявите переменную:
Var Result: Integer;
procedure TForm1.SBtnAddClick(Sender: TObject);
begin
Result:= StrToInt(EditOperand1.Text)+
StrToInt(EditOperand2.Text);
EditResult.Text:=IntToStr(Result);
LabelOperator.Caption:=AddBtn.Caption;
LabelResult.Caption:='=';
End;
2. Аналогичным образом создайте
события для нажатия других кнопок.
обработчик
Примечание: При описании процедуры для операции
деления (/) создайте раздел переменных Var в этой
процедуре и объявите переменную Result типа Real, а
вместо строки
EditResult.Text:=IntToStr(Result); запишите
EditResult.Text:=FloatToStr(Result),
т.е.
перевод
переменной из вещественного типа (Real) в строковый
(String).
62
3. Для кнопки Clear создайте событие OnClick и
введите
следующий
текст
во
вновь
сгенерированный обработчик события:
procedure
TForm1.ClearBtnClick(Sender:
TObject);
begin
EditOperand1.Text:='';
EditOperand2.Text:='';
EditResult.Text:='';
LabelOperator.Caption:='?';
LabelResult.Caption:='?';
end;
Дополнительные задания
1. Установите
для
функциональных
кнопок
всплывающие
подсказки
(свойства
Hint,
ShowHint:=True).
2. Измените программу таким образом, чтобы при
пустых полях ввода чисел, функциональные
кнопки калькулятора были недоступны (свойство
Enabled – False, событие OnChange).
Расчет платежной ведомости
Напишите программу для расчета платежной
ведомости. Главная форма ее должна содержать два
окна редактирования: одно – для ввода количества
отработанных часов, а другое – для ввода стоимости
одного часа. Программа должна вычислять и
показывать заработную плату. Каждый час,
отработанный сверхурочно выше нормы в 37,5 часов,
должен оплачиваться по ставке, превышающей
обычную в 1,5 раза.
После создания формы программы, выделите окно
редактирования, в которое вводится количество
отработанных часов и создайте событие OnChange.
63
Вставьте в обработчик событий Edit1Change следующий
код:
procedure TForm1.Edit1Change(Sender: TObject);
var Hours, rate, overtime, result:Real;
begin
if Edit1.Text<>’’then
Hours:=StrToInt(Edit1.Text) //получаем содержимое
строки из окна
//редактирования Edit1 и преобразуем его в
//удобную для вычислений величину типа Real
else
Hours:=0;
//вычисляем сверхурочные часы, если они есть
if Hours>37.5 then Overtime:=Hours-37.5
else
Overtime:=0;
//преобразовываем содержимое окна Edit2 в //Real
if Edit2.Text<>’’then
Rate:=StrToFloat(Edit2.Text)
else
Rate:=0;
//вычисляем результат, преобразуем его
//обратно в текстовую строку и отображаем
//его в окне редактирования Edit3. Используем
//стандартную подпрограмму FloatToStrF для
//форматирования строки результата в виде
//денежной суммы
Result:=Hours*Rate+0.5*Overtime*Rate;
Edit3.Text:=FloatToStrF(Result,ffCurrency,10,2);
end;
Теперь назначьте тот же самый обработчик
событий Edit1Change окну редактирования Edit2.
64
Этот код программы вычисляет заработную плату
интерактивно, т.е., сразу же, как вы введете какое-нибудь
значение в окна редактирования Edit1 и Edit2.
65
Глава VII. Классы в Object Pascal.
7.1. Понятие класса
В Object Pascal классы являются специальными
типами данных и используются для описания объектов.
Соответственно объект, имеющий тип какого-либо класса,
является экземпляром этого класса или переменной этого
типа.
Класс представляет собой особый тип записи,
имеющий в своем составе такие элементы, как поля,
свойства и методы. Поля класса служат для хранения
информации об объекте. Методами называются процедуры
и функции, предназначенные для обработки полей.
Свойства занимают промежуточное положение между
полями и методами.
Структура описания класса:
Type <имя класса>=class(<имя класса родителя>)
Private
<частные описания>
Protected
<защищенные описания>
Public
<общедоступные описания>
Published
<опубликованные описания>
End;
7.2. Поля класса
Поле
класса
представляет
собой
данные,
содержащиеся в классе. Поле описывается как обычная
переменная и может быть любого типа.
Пример:
Type Tnewclass=class(TObject)
Private
Fcode:integer;
Fsing:char;
66
Fnote:string;
End;
Новый класс создается на основе базового класса и
получает в дополнение три новых поля Fcode, Fsing ,Fnote.
7.3. Методы класса
Метод
представляет
собой
подпрограмму(процедуру
или
функцию),
является
элементом этого класса. Описание метода похоже на
описание обычной подпрограммы модуля. Заголовок
метода располагается в описании класса, а сам код метода
находится в разделе реализации, где имеет составное имя,
включающее указание типа класса.
Пример:
Interface
......
type
Tform1=class(TForm)
Button1:Tbutton;
Procedure Button1click(sender:TObject);
End;
......
implementation
......
procedure Tform1.Button1click(sender:TObject);
begin
close;
end;
7.4. Практическая работа
Описание нового класса и объекта
Label1
Standard)
(метка)
(п.к.
Свойство
Caption
Font.Size
Font.Style
Align
Значение
Поле ввода
18
fsBold
alTop
67
Alignment
taCenter
Button1
Standard)
(кнопка)
(п.к.
Свойство
Caption
Значение
Профессор
Button2
Standard)
(кнопка)
(п.к.
Свойство
Caption
Значение
Студент
type
…
{Описание нового класса}
TPerson = class
private
Name:string[15];
Address:string[35];
public
constructor create;
procedure print;
end;
{Объект}
var
…
student:TPerson;
professor:TPerson;
implementation
{$R *.DFM}
{Реализация конструктора}
Constructor TPerson.create;
begin
name:=' ';
address:=' ';
end;
68
{Инициализация (создание) объектов}
procedure TForm1.FormCreate(Sender: TObject);
begin
Professor:=TPerson.Create;
Student:=TPerson.Create;
end;
Procedure TPerson.print;
begin
form1.Label1.Caption:='ФИО'+name+'Адрес'+address
;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
professor.Name:=' Петров ';
professor.Address:=' Чита, Ленинградская,22';
professor.print;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
student.Name:=' Иванов ';
student.Address:='Чита, Столярова,14';
student.print;
end;
end.
69
Глава VIII. Работа с кнопками
Кнопки являются управляющими элементами и
используются для выдачи команд на выполнение
определенных функциональных действий. В Delphi
имеются следующие компоненты, представляющие
различные вариации кнопок:
 Стандартная кнопка Button.
 Кнопка с рисунком BitBtn.
 Кнопка быстрого доступа SpeedButton.
8.1. Стандартная кнопка Button.
Стандартная кнопка, или кнопка, представлена в
Delphi компонентом Button, который является оконным
элементом управления.
Кнопка Button на поверхности может содержать
надпись, поясняющую назначение и описание действий,
выполняемых при ее нажатии.
Основным событием для кнопки является событие
OnClick, возникающее при нажатии кнопки. Действия,
выполняемые в обработчике события OnClick, происходят
сразу после отпускания кнопки.
Кнопку можно нажать:
 Щелчком кнопки мыши;
 Выбором комбинации клавиш, если она задана в
свойстве Caption;
 Нажатием на <Enter>или <Пробел>;
 Нажатием клавиши <Escape>;
При применении кнопки для закрытия окна можно
использовать ее свойство ModalRezult Она определяет,
какое значение будет содержать одноименное свойство
ModalRezult формы, когда окно закрывается при нажатии
на
соответствующую
кнопку.
Обычно
свойство
ModalRezult используется для закрытия диалоговых окон и
его возможными значениями являются целые числа.
Некоторые из них объявлены как поименованные
70
константы. Для поименованных констант в скобках
приведены числовые значения:
 mrNone – ()
 mrOk – idOk(число 1)
 mrCancel – idCancel(число 2)
 mrAbort – idAbort(число 3)
 mrRetry – idRetry(число 4)
 mrIgnore – idIgnore(число 5)
 mrYes – idYes(число 6)
 mrNo – idNo(число 7)
 mrAll – idAll(число +1)
 mrNoToAll – idNoToA ll (число 9)
 mrYesToAll – idYseToAll(число 10)
Пример: Закрытие формы.
Procedure TForm2.Button1Click(Sender:TObject);
Begin
Button1.ModalRezult:=mrNone;
Form2.close;
End;
Procedure TForm2.Button2Click(Sender:TObject);
Begin
Button2.ModalRezult:=mrOk;
End;
Procedure TForm2.Button3Click(Sender:TObject);
Begin
Button3.ModalRezult:=123;
End;
При нажатии на любую из этих кнопок Button1,
Button2 или Button3 форма Form2 закрывается.
8.2. Кнопка с рисунком BitBtn.
Кнопка с рисунком представлена в Delphi
компонентом BitBtn. Отличается от стандартной кнопки
тем, что дополнительно к стандартному заголовку имеет
возможность отображать растровый рисунок(глифа).
71
Свойство Glyph типа TBitmap определяет
растровое изображение кнопки. По умолчанию свойство
Glyph имеет значение nil, то есть на кнопке нет рисунка.
Выводимый рисунок может содержать до трех отдельных
изображений. Какое именно изображение из трех
выводится зависит от текущего состояния кнопки:
 1–е изображение отображается, если кнопка не
нажата(по умолчанию)
 2-е изображение отображается тогда, когда кнопка
не активна и не может быть выбрана
 3-е изображение отображается в том случае, если
кнопка нажата(выполнен щелчок)
Используя для изображения несколько различных
рисунков, можно при нажатии на кнопку отображать на ее
поверхности простейшую анимацию. Для этого первый и
третий рисунок должны различаться не только цветом, но
и видом и расположением фигур рисунка.
Количество изображений указывается в свойстве
NumGliph. По умолчанию оно равно 1и для отображения
на кнопке всегда используется первое изображение.
Delphi
предлагает
для
кнопки
несколько
предопределенных видов, выбираемых с помощью
свойства Kind.
При
определении
вида
кнопки
могут
использоваться следующие константы:
 bkCustom – кнопка имеет выбранное изображение.
 bkOk – кнопка имеет зеленную галочку и надпись
Ок.
 bkCancel – кнопка имеет красный знак Х и надпись
Cancel.
 bkYes – кнопка имеет зеленую галочку и надпись
Yes.
 bkNo – кнопка имеет красную перечеркнутую
окружность и надписьNo.
 bkHelp – имеет изображение сине-зеленного
вопросительного знака и надпись Help.
 bkClose – изображение двери и надпись Close.
 bkAbort – красный знак Х и надпись Abort.
72

bkRetry – изображение в виде зеленой стрелки
повтора операции и надпись Retry.
 bkIgnore – отображает изображение игнорирования
а надпись Ignore.
 bkAll – изображение двойной галочки и надпись
Yes to All.
Свойство Layout управляет отображением изображения
на поверхности кнопки и имеет следующие значения:
 blGlyphLeft – изображение слева от надписи(по
умолчанию).
 blGlyphRight – изображение справа от надписи.
 blGlyphTop – изображение над надписью.
 blGlyphBottom – изображение под надписью.
8.3.
Кнопка
SpeedButton.
быстрого
доступа
Кнопка быстрого доступа представлена в Delphi
компонентом SpeedButton. Эта кнопка является неоконным
элементом управления, поэтому не может получать фокус
ввода.
SpeedButton
может
использоваться
как
переключатель. Поэтому, помимо обычного и нажатого
состояний, она имеет третье состояние – утопленное, или
выбранное (включенное). Включена быстрая кнопка или
нет, определяет свойство Down типа Boolean.
Использование быстрых кнопок как переключателей имеет
определенные особенности. Все быстрые кнопки
группируются, и каждая такая кнопка должна
принадлежать одной из групп. Принадлежность кнопки к
группе определяет свойство GroupIndex типа Integer. По
умолчанию оно равно 0, т.е. кнопка не входит в группу.
Определяя одинаковое значение этому свойству для
различных кнопок их можно объединить. При этом все
кнопки работают согласованно, т.е. если одна из них
выбрана и находится в фиксированном нажатом
состоянии, то выбор других автоматически отменяется.
Задание
1. Поставьте на форму кнопку Button;
73
2. Свойству Caption кнопки присвойте значение
«Цвет»;
3. Измените цвет формы на clred;
Опишем процедуру изменения цвета формы:
procedure
TForm1.Button1Click(Sender:
TObject);
begin
if form1.Color=clred then form1.Color:=clblue
else form1.Color:=clred;
end;
Самостоятельно измените процедуру, в которой
можно работать с 3 цветами формы.
8.4. Практическая работа
8.4.1. Решение квадратного уравнения.
Поставьте на форму компоненты и измените их
свойства в соответствии с таблицами:
Name
Label1
Label2
Autosize
true
Уравнение задается
коэффициентами
true
Top
136
8
Left
24
40
Height
Width
16
4
17
272
Caption
Name
Label3
Label4
74
Label5
Caption
При
первой
степени (а)
При второй
степени (b)
Autosize
Top
false
48
false
48
При
третьей
степени (c)
false
48
Left
24
136
248
Height
41
41
41
Width
81
81
81
Name
Button1
Button2
Button3
Caption
Top
Вычислить
208
Новое
208
Завершить
208
Left
24
130
220
Height
25
25
25
Width
81
81
81
Текст процедуры для кнопки Вычислить:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:real;
d:real;
x1,x2:real;
s1,s2:string[7];
code:integer;
begin
//ввод данных из полей редактирования
val(edit1.text,a,code);
val(edit2.text,a,code);
val(edit3.text,a,code);
if a=0 then // сообщение об ощибке
label1.caption:='Ошибка!'+chr(13)
+'коэффициент при второй степени'
+chr(13)+'неизвестного равен нулю'
else //вычисление корней
begin
d:=b*b-4*a*c;
75
x1:=(-b+sqrt(d))/2*a;
x2:=(b+sqrt(d))/2*a;
//Вывод результата
str(x1:7:3,s1);
str(x2:7:3,s2);
label1.caption:='Корни уравнения:'
+chr(13)+'x1='+s1
+chr(13)+'x2='+s2;
end;
end;
Самостоятельно напишите процедуру для кнопки
Новое, по нажатии на которую очищаются поля ввода и
для кнопки Завершить, закрывающую ваше приложение.
8.4.2. Игра «Пятнашки»
Написать аналог детской игры «Пятнашки»,
используя компонент SpeedButton.
1.
Поставим
на
форму
16
кнопок
SpeedButton(свойство Name-s1,s2,…s16).
2.
2 кнопки BitBtn(заголовки «Новая игра»,
«Закрыть»).
(Рисую
на
доске
схему
расположения
кнопок(цифрами помечен порядок их следования от S1 до
S16).
1
5
9
0
1
3
4
2
6
3
7
4
8
1
1
1
5
1
2
1
1
Событие по активизации формы(OnActivate):
Procedure TForm1.formactivate(Sender:Tobject);
Label b;
Var a:array[1..15] of integer;
i,j:integer;
76
begin
randomize;
for i:=1 to 15 do
begin
b: a[i]:=random(15)+1; //
if i>=2 then
/// если числа , задаваемые
случайным образом совпадают с
for j:=i-1 downto 1 do // предыдущими
if a[i]=a[j] then goto b;// они задаются снова
end;
s1.caption:=inttostr(a[1]);s2.caption:=inttostr(a[2]);s3.caption:
=inttostr(a[3]);
s4.caption:=inttostr(a[4]);s5.caption:=inttostr(a[5]);s6.caption:
=inttostr(a[6]);
s7.caption:=inttostr(a[7]);s8.caption:=inttostr(a[8]);s9.caption:
=inttostr(a[9]);
s10.caption:=inttostr(a[10]);s11.caption:=inttostr(a[11]);s12.ca
ption:=inttostr(a[12]);
s13.caption:=inttostr(a[13]);s14.caption:=inttostr(a[14]);s15.caption:=
inttostr(a[15]);
s16.caption:=’’;s16.down:=true;
end;
Событие по нажатию на кнопку номер 15:
Procedure TForm1.S15Click(Sender: TObject);
begin
if S16.caption=’’ then begin S16.caption:=s15.caption;
s15.down:=true; s15.caption:=’’;end;
if S11.caption=’’ then begin S11.caption:=s15.caption;
s15.down:=true; s15.caption:=’’;end;
if S14.caption=’’ then begin S14.caption:=s15.caption;
s15.down:=true; s15.caption:=’’;end;
end;
Процедуры
самостоятельно.
для
остальных
77
кнопок
опишите
Глава IX. Работа со строками
Значением переменной типа String может быть
любая последовательность символов длинной не более
255.
Рассмотрим стандартные процедуры и функции
работы со строками:
Function
AnsiLowerCase
(const S:):string
Function
AnsiUpperCase
(const S:):string
Function ConCat (s1 [,s2 ,
…sn]:string):string
Function Copy (St: string;
Index, Count :integer): string
Procedure Delete (St: string;
Index, Count: integer)
Procedure Insert ( SubSt:
string; St: string; Index:
integer)
Function
Length
(st:
string):integer
Function
Pos(SubSt,
St:
string)
Возвращает исходную строку
S, в которой все заглавные
буквы заменены на строчные
(для кириллицы)
Возвращает исходную строку
S, в которой все строчные
буквы заменены на заглавные
(для кириллицы)
Возвращает
строку,
представляющую сцепление
строк s1, s2,…sn
Копирует из строки S Count
символов, начиная с символа
с номером Index
Удаляет Count символов из
строки St, начиная с символа
с номером Index
Вставляет подстроку SubSt в
строку St, начиная с символа
Index
Возвращает текущую длину
строки
Отыскивает в строке St
первое вхождение подстроки
SubSt и возвращает номер
позиции, с которой она
начинается. Если подстрока
не найдена возвращается
нуль
78
9.1. Функции преобразования строк в
другие типы.
Подпрограммы преобразования строк в другие типы:
Function StrtoDate(St:
string):TdateTime
Function StrtoFloat(St:
string):Extended
Function StrtoInt(St:
string):Integer
Procedure
Val(St:
string; var X; code: integer)
Преобразует символы
строки St в дату.
Преобразует символы
строки St в вещественное
число
Преобразует символы
строки St в целое число
Преобразует строку St
во внутреннее представление
целой или вещественной
переменной X. Параметр code
равен 0, если преобразование
прошло успешно.
Подпрограммы обратного преобразования
Function
DatetoStr
(Value :TDateTime): string
Function
FloattoStr
(Value: Extended): string
Function
InttoStr
(Value: Integer): string
Procedure Str(X [:
Width [ Decimals]]; var St:
string)
Преобразует дату из
параметра в строку символов
Преобразует
вещественное значение Value
в строку символов
Преобразует
целое
значение Value в строку
символов
Преобразует целое или
вещественное число X в
строку St, Width: ширина
поля,
Decimals:
ширина
дробной части(если Х –
вещественное число)
9.2. Практическая работа
Поставьте на форму строку ввода Edit, 3 метки Label
и 3 кнопки Button
Задание:
1. Из введенной строки удалить последний символ;
2. Преобразовать все символы строки в заглавные;
79
3. Подсчитать количество пробелов во введенной
строке;
Результаты вывести в метки.
1. Длину строки можно найти с помощью функции
Length. Опишем процедуру удаления последнего
символа.
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
i:integer;
begin
s:=edit1.Text;//запоминаем строку в переменной S
i:=Length(s);//находим номер последнего символа
строки
delete(s,i,1);// удаляем из строки последний символ
label1.Caption:=s;//выводим полученную строку в
метку
end;
2.
procedure TForm1.Button2Click(Sender: TObject);
begin
label2.Caption:=ansiuppercase(edit1.text)
end;
3.
procedure TForm1.Button3Click(Sender: TObject);
var s:string;
i,k:integer;
begin
k:=0;// обнуляем счетчик пробелов
s:=edit1.text;// запоминаем строку в переменную
for i:=1 to length(s) do // перебираем все символы строи
if
s[i]='
'
then
k:=k+1;//увеличиваем счетчик если IСимвол пробел
label3.Caption:=inttostr(k);//
выводим результат в метку
end;
80
Задание 2:
В поле ввода вводится фамилия , имя , отчество.
Вывести в метку данные фамилию и инициалы. Например,
ввели «Иванов
Петр
Сидорович», результатом
будет строка «Иванов П.С.»
1. Поставьте на форму поле ввода, метку и кнопку.
procedure TForm1.Button1Click(Sender: TObject);
var s:string;
fam,name,otch:string;
i,i1,i2,i3:integer;
begin
s:=edit1.Text;//запоминаем строку в переменную
i1:=pos(' ' ,s);//находим первый пробел
fam:=copy(s,1,i1);// до пробела строка является
фамилией, копируем ее
delete(s,1,i1);// удаляем из исходной строки фамилию
name:=s[1];//в полученной строке первый символ
инициал имени
i2:=pos(' ',s);//в полученной строке на ходим пробел
otch:=copy(s,i2+1,1);//копируем первый символ после
пробела в отчество
edit2.Text:=fam+'
'+name+'.
'+otch+'.';//выводим
полученный результат
end;
Задание.
Программа корректна, когда фамилия имя и отчество
вводятся через один пробел.
Допишите процедуру преобразования строки с
учетом того, что пробелов между словами может
вводиться
неограниченное
количество,
то
есть
предварительно удалить из строки все лишние пробелы,
оставив по одному между словами.
81
Глава X. Работа с датами
В Delphi имеется три компонента, позволяющие
работать с датами: DateTimePicker (п.к. Win32),
MonthCalendar (п.к. Win32), Calendar (п.к Samples).
Компоненты DateTimePicker и MonthCalendar очень
похожи, только DateTimePicker позволяет редактировать
выбранную дату. Оба компонента имеют свойство Date
типа Tdate (даты), которое по умолчанию равно текущей
дате.
Рассмотрим свойства, характерные для каждого
компонента:
10.1. Объект DateTimePicker
Свойство
Date
Значение
Дата. По умолчанию текущая
DateFormat
dfShort – короткий. 31.12.02.
dfLong – длинный. 31 декабря 2002 г.
DateMode
Вид календаря.
dmComboBox – выпадающий список
dmUpDown – реверсивный счетчик
Тип календаря.
dtkDate – отображает дату
dtkTime –отображает время
Возможность
установить
максимальную дату
Возможность
установить
минимальную дату
Время
Kind
MaxDate
MinDate
Time
10.2. Объект MonthCalendar
Свойство
Значение
Date
Дата. По умолчанию текущая
FirstDateofWeek
Выбор дня с которого
начинаться неделя.
82
будет
MaxDate
MaxSelectRange
MinDate
MultiSelect
ShowToday
WeekNumbers
dowLocaleDefault – по умолчанию
dowFriday –с пятницы
dowMonday – с понедельника и т.д.
Возможность
установить
максимальную дату
Возможность
установить
максимальный диапазон для выбора
дат (если MultiSelect = true)
Возможность
установить
минимальную дату
Определяет
возможность
множественного выбора
Возможность отображения строки
«Сегодня …» внизу календаря
Возможность
недель
просмотра
номеров
10.3. Объект Calendar.
Свойство
Day
GridLineWidth
Month
StartofWeek
Year
Значение
Номер дня месяца
Ширина линии сетки
Номер месяца
Номер дня начала недели (до 0 до 6)
Номер года
10.4. Практическая работа
Задача: По выбранной дате, вывести в метку
название месяца.
Поставьте на форму компонент DateTimePicker,
метку Label.
83
Выбранная пользователем дата хранится в свойстве
Date компонента DateTimePicker. Поэтому опишем
процедуру OnChange для этого компонента.
procedure
TForm1.DateTimePicker1Change(Sender:
TObject);
var s,s1:string;
i:integer;
begin
s:=datetostr(DateTimePicker1.Date);
s1:=copy(s,4,2);
i:=strtoint(s1);
case i of
1: label1.Caption:='Январь';
2: label1.Caption:='Февраль';
3: label1.Caption:='Март';
4: label1.Caption:='Апрель';
5: label1.Caption:='Май';
6: label1.Caption:='Июнь';
7: label1.Caption:='Июль';
8: label1.Caption:='Август';
9: label1.Caption:='Сентябрь';
10: label1.Caption:='Октябрь';
11: label1.Caption:='Ноябрь';
12: label1.Caption:='Декабрь';
end;
end;
Самостоятельно: По выбранной дате, определите
сколько дней осталось студенту до стипендии, если он
получает ее 1 числа каждого месяца.
84
Глава XI. Работа со списками
Список представляет собой упорядоченную
совокупность взаимосвязанных элементов, являющихся
текстовыми строками. Списки широко применяются в
Windows, например, для отображения перечня шрифтов.
11.1. Простой список ListBox.
Простой
список
представляет
собой
прямоугольную область, в которой располагаются его
элементы. Для работы с простым списком служит
компонента ListBox страницы Standart.
Свойство
Значение
Описание
Columns
Целое число
Style
lbStandart
lbOwnerDrawFix
ed
lbOwnerDrawVa
riable
Ориентация
полос
прокрутки, а также число
колонок,
которые
одновременно видны в
списке.
Стандартный стиль
Список,
с
элементами
фиксированной высоты
Список, с элементами,
которые
могут
иметь
разную высоту
bsNone
bsSingle
Рамки нет
Рамка есть
BorderStyle
11.2.
ComboBox.
Комбинированный
список
Комбинированный
список
объединяет
поле
редактирования и список. Пользователь может выбирать
значение из списка или вводить его непосредственно. Для
работы с комбинированным списком Delphi служит
компонент ComboBox.
85
Свойство
Значение
Описание
Style
csDropDown
Раскрывающийся
список
с
полем
редактирования
Поле редактирования с
постоянно раскрытым
списком
Раскрывающийся
список, допускающий
выбор элементов из
списка
Список с элементами
фиксированной
высоты(высота – св-во
ItemHeight)
Список с элементами,
которые могут иметь
разную высоту
Количество
строк,
которые одновременно
отображаются
в
раскрывающемся
списке.
Позволяет определить,
раскрыт ли список.
csSimple
csDropDownList
csOwnerDrawFixed
csOwnerDrawVariable
DropDownCount
Целое число
DroppedDown
Логический тип
11.3. Общая характеристика списков.
Свойства.
ITEMS.
ITEMS – массив строк, определяющий количество
элементов списка и их содержимое.
Каждый элемент является строкой, к которой
можно получить доступ по ее номеру. Нумерация
начинается с нуля.
Items[0] – первая строка, Items[1] – вторая строка.
COUNT.
Задает число элементов в списке. Так как первый
элемент имеет нулевой номер, то номер последнего будет
равен Count-1.
Пример: Присваивание элементам списка Listbox1
новых значений.
86
Var n:integer;
……
for n:=0 to listbox1.itemscount-1 do
listbox1.items[n]:=’Строка номер’+InttoStr(n);
SORTED.
Тип Boolean. Определяет отсортированы ли
элементы списка в алфавитном порядке или нет. True –
список отсортирован, False – список не сортирован.
ItemIndex.
Определяет выбранный элемент в списке.
Пример: Отображение номера строки, выбранной
в списке Listbox1.
Label5.caption:=’В
списке
выбрана
’+inttostr(listbox1.itemindex)+ ‘ строка.‘
MultiSelect.
Тип Boolean. Управляет возможностью выбора
нескольких элементов из списка. True – возможен выбор
нескольких элементов, False – выбор только одного
элемента из списка.
SelCount.
Тип Integer.
элементов в списке.
Возвращает
число
выбранных
Selected[index:integer].
Определяет выбрана ли строка с номером Index.
Пример: Операции с выбранными элементами
списка.
Var i:integer;
…
for i:=0 to listbox1.items.count-1 do
if listbox1.selected[i] then listbox1.items[i]:=’Строка
выбрана’
87
Пример: Программный выбор элементов списка.
Listbox1.selected[1]:=true;
Listbox1.selected[3]:=true;
11.4. Методы
Функция ADD(const S:string) добавляет в конец
списка строку, заданную параметром S, а в качестве
результата возвращает положение нового элемента в
списке.
Пример: Добавление к комбинированному списку
Combobox1 строки Нажата кнопка Button1
Procedure TForm1.Button1Click(sender: TObject);
Begin
Combobox1.items.add(‘Нажата кнопка Button1’);
End;
Процедура INSERT(Index:integer;const S:string)
вставляет строку S в позицию с номером, определяемым
параметром Index.
Процедура Delete(index:integer) удаляет элемент с
номером, заданным параметром index.
Пример: Удаление элемента из списка.
Procedure TForm1.Button1Click(sender: TObject);
Begin
Combobox1.items.delete(4);
End;
Процедура Clear очищает список, удаляя все его
элементы.
Пример: Очистка содержимого списка.
Procedure TForm1.Button1Click(sender: TObject);
Begin
Listbox1.items.clear;
End;
Процедура Move(Curindex, Newindex: integer)
сдвигает элемент на позиции с номером Curindex в новую
позицию с номером Newindex.
88
Процедура IndexOf(const S: string):integer
определяет содержится ли в списке строка S и возвращает
номер найденной в списке строки.
Процедура
SaveToFile(const
Filename:string)
сохраняет строковые элементы списка в файл с именем
Filename.
Procedure TForm1.Button1Click(sender: TObject);
Begin
Listbox1.items.savetofile(‘c:\my\text.txt’);
End;
Процедура LoadFromFile(const Filename:string)
заполняет список содержимым указанного текстового
файла.
Listbox1.items.loadfromfile(‘c:\my\text1.txt’);
End;
Задание. Поставьте на форму список Listbox и
кнопку Button. Опишем процедуру для кнопки, при
нажатии на которую список заполняется всеми четными
цифрами от 1до 999.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
listbox1.Clear;
for i:=1 to 999 do
if i mod 2=0 then listbox1.Items.Add(inttostr(i));
end;
Самостоятельно добавьте на форму две строки
ввода Edit1 и Edit2, в которых будет устанавливаться
диапазон вывода четных чисел по усмотрению
пользователя и перепишите процедуру с учетом новых
данных.
11.5. Практическая работа
Создадим приложение, которое будет работать с
вводимой пользователем информацией в список.
89
Форма
Свойство
Caption
Position
Значение
Учебная программа
poScreenCenter
Панель 1
(компонент Panel на странице
Standard)
Свойство
Align
Height
Caption
Значение
alBottom
117
Кнопка Close на Панели 1
(компонент BitBtn на странице
Additional)
Свойство
Значение
Kind
Name
bkClose
CloseBitBtn
Свойство
Align
Caption
Width
Значение
alRight
Свойство
Name
Text
Width
Значение
InputEdit
Кнопка ОК на Панели 2
(компонент BitBtn на странице
Additional)
Свойство
Name
Kind
Значение
OKBitBtn
bkOK
Кнопка Удалить на Панели 2
(компонент BitBtn на странице
Additional)
Свойство
Kind
Caption
Name
Значение
bkCancel
Удалить
DelBitBtn
Кнопка Сортировать на Панели 2
(компонент BitBtn на странице
Additional)
Свойство
Kind
Caption
Значение
bkRetpy
Сортировать
Панель 2
(компонент Panel на странице
Standard)
Строка ввода на Панели 2
(компонент Edit на странице
Standard)
90
224
185
Name
SortBitBtn
Кнопка Очистить на Панели 2
(компонент BitBtn на странице
Additional)
Свойство
Kind
Caption
Name
Значение
bkNo
Очистить
ClearBitBtn
Список выбора
(компонент ListBox на странице
Standard)
Свойство
Align
Name
Значение
alClient
ListBox
Кнопка ОК
procedure TForm1.OKBitBtnClick(Sender: TObject);
begin
ListBox.Items.Add(InputEdit.Text);
InputEdit.Clear;
InputEdit.SetFocus;
end;
Кнопка «Удалить»
procedure TForm1.DelBitBtnClick(Sender: TObject);
begin
ListBox.Items.Delete(ListBox.ItemIndex);
InputEdit.SetFocus;
end;
Самостоятельно:
1. Опишите событие нажатия кнопок «Сортировать»
и «Очистить».
2. Добавьте на форму кнопку с заголовком
«Изменить», при нажатии, на которую содержимое
выбранной строки списка будет заменяться на
строку, введенную в поле Edit.
91
Глава XII. Использование
переключателей.
Переключатели (флажки) позволяют выбрать какоелибо значение из определенного множества. Они могут
находиться
во
включенном(установленном)
и
выключенном (сброшенном) состояниях. Для работы с
переключателями в Delphi имеются компоненты
 Checkbox (кнопка с независимой фиксацией);
 RadioButton (кнопка с зависимой фиксацией);
 RadioGroup;
Для определения состояния флажка используется
свойство Checked типа Boolean. По умолчанию оно False.
Поставьте на форму многострочный редактор
Memo и независимый переключатель Checkbox; Напишем
процедуру, которая запрещает ввод текста, если флажок в
переключателе установлен (событие по нажатию на
переключатель):
procedure
TForm1.CheckBox1Click(Sender:
TObject);
begin
if checkbox1.Checked
then memo1.Enabled:=false
else memo1.Enabled:=true;
end;
Флажок может быть в одном из трех состояний:
сброшен, установлен, недоступен.
Для анализа и установки одного из стрех
состояний флажка служит свойство State. Оно может
принимать следующие значения:

сbUnchecked – флажок сброшен;

cbChecked – флажок установлен;

cbGrayed – флажок запрещен;
Процедура для обработки выбора независимого
переключателя:
procedure
TForm1.CheckBox3Click(Sender:
TObject);
92
begin
case CheckBox3.State of
cbunchecked: CheckBox3.Caption:='Переключатель
включен';
cbchecked: CheckBox3.Caption:='Переключатель не
включен';
cbgrayed:CheckBox3.Caption:='Переключатель
запрещен';
end;
end;
Переключатели
с
зависимой
фиксацией
представлены компонентом RadioButton, их называют
кнопками выбора. Кнопки выбора обычно располагаются
по отдельным группам, выделенным на форме. Выбор
переключателя является взаимно исключающим, то есть
при выборе одного переключателя другие становятся
невыбранными. В отличие от независимого переключателя
Checkbox
состояние
зависимого
переключателя
RadioButton нельзя изменить повторным щелчком. Чтобы
не объединять кнопки RadioButton в группы Delphi
предоставляет компонент RadioGroup, представляющий
собой группу переключателей RadioButton.
Управление
количеством
и
названиями
переключателей производится с помощью свойства Items,
которое позволяет получить доступ к отдельным
переключателям в группе. Items – это строки,
отображаемые в заголовке переключателей, нумерация
строк начинается с нуля. Items[0], Items[1], Items[2] и т.д.
Свойство ItemIndex – содержит позицию (номер)
переключателя, выбранного в текущий момент. ItemIndex=
-1, не выбран не один переключатель.
12.1. Практическая работа
Создание теста.
Создадим тест, который будет обрабатывать ответы
пользователя и выводить конечный результат вида : «5»,
«4» и т.д.
93




На форму поставьте компоненты:
Метка Label1
Caption – Отчего люди не летают как птицы?
Кнопка BitBtn1
Caption – Далее…
RadioGroup1
Caption Ответ
Items
Не хотят
Нет крыльев
Запрещено
Летают
Опишите в разделе описания переменных
МОДУЛЯ переменную I целого типа, чтобы она была
доступна остальным модулям нашего проекта.
Создайте еще одну форму, поместите на нее такие
же компоненты. В разделе USES данного модуля в список
подключаемых модулей добавьте слово unit1, это будет
говорить о том, что данный модуль Unit2 использует Unit1.
unit Unit2;
interface
uses
94
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, unit1;
Теперь вернемся на первую форму и напишем
процедуру по нажатию на кнопку Далее…
Следует учесть, что пользователь может и не
ответить на вопрос. В нашем случае правильный ответ
номер 2 «нет крыльев». Для компонента RadioGroup это
строка имеет номер 1 (свойство ItemIndex), так как
нумерация начинается с нуля. В переменной I будем
накапливать количество правильных ответов.
Таким образом процедура по нажатию на кнопку
Далее… выглядит следующим образом:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if radiogroup1.ItemIndex= -1 then // если не
ответили на вопрос
showmessage('Забыли
ответить на вопрос!')
else
begin
if radiogroup1.ItemIndex=1 then i:=i+1;//счетчик
правильных ответов увеличили
form1.Visible:=false;//спрятали первую форму
form2.show;//вызвали форму со следующим
вопросом
end;
end;
Создайте еще несколько форм с вопросами.
Проделайте те же действия. Последняя форма нашего
проекта будет выводить результат. Поставьте на нее метку
Label и напишите у нее заголовок «Ваша оценка»;
Определите, сколько в вашем тесте нужно
правильных ответов, чтобы получить «5», «4», и т.д. И
затем опишем процедуру по созданию формы. Например,
case i of
0,1,2:label1.caption:= label1.caption+' 2';
95
3:label1.caption:= label1.caption+' 3';
4:label1.caption:= label1.caption+' 4';
5,6:label1.caption:= label1.caption+' 5';
end;
Не забудьте, что в раздел Uses каждого модуля
следует дописать unit1, чтобы модули могли
использовать переменную I.
!
96
Глава XIII. Процедуры и функции,
реализующие диалоги
Delphi предлагает ряд процедур
отображающие диалоги общего назначения.
и
функций
13.1. Процедура ShowMessage.
Процедура
ShowMessage(const
Msg:String)
отображает окно сообщения с кнопкой ОК. Заголовок
содержит название исполняемого файла приложения, а
строка Msg выводится как текст сообщения.
Пример:
Отображение
простейшего
окна
сообщений.
Procedure TForm1.Button1Click(Sender: TObject);
Begin
ShowMessage(‘Простейшее диалоговое окно’);
End;
13.2. Функция MessageDlg.
Функция MessageDlg(const Msg: String; AType:
TMsgDlgType; AButtons:TMcgDlgButtons; HelpCtx: Longint):
Word отображает окно сообщений в центре экрана. Она
позволяет получить ответ пользователя. Параметр Msg
содержит выводимое сообщение. Тип окна сообщения
определяется параметром AType, который принимает
следующие значения:
mtWarning
–
окно
содержит
черный
восклицательный знак в желтом треугольнике и заголовок
Warning.
mtError – окно содержит белый крест в красном
круге и заголовок Error.
mtInformation –окно содержит букву i синего цвета
в белом круге и заголовок Information.
mtConfirmation –окно содержит знак ? синего цвета
в белом круге и заголовок Confirmation.
97
mtCustom – окно не содержит картинки, в
заголовке выводится название исполняемого файла
приложения.
Параметр AButton задает набор кнопок окна и
может принимать любые комбинации следующих
значений, которые задают надпись на кнопке:
Название
Значение
mbYes
Yes
mbNo
No
mbOK
OK
mbCancel
Cancel
mbHelp
Help
mbAbort
Abort
mbRetry
Retry
mbIgnore
mbAll
Ignore
All
mbYesNoCan
[mbYes,mbNo,mbCancel]
mbOKCancel
[mbOK,mbCancel]
cel
При нажатии любой из этих кнопок, кроме Help,
закрывается диалог и возвращается функцией MessageDlg
модальный
результат(свойство
ModalResult),
проанализировав который, можно управлять выполнением
приложения.
Пример: Использование функции MessageDlg.
Procedure TForm1.Button1Click(Sender:TObject);
Var rez:TModalResult;
Begin
If length(edit1.text)<8 then begin
rez:=MessageDlg(‘Неправильная
дата’#10#13’Исправить
автоматически?’,
mtError,[mbOK,mbNo],0);
98
If rez=mrOK then edit1.text:=DateToStr(Date);
If rez=mrNo then edit1.text.setfocus;
End;
End;
13.3. Функция MessageDlgPos.
Функция MessageDlgPos(const Msg: String; AType:
TMsgDlgType; AButtons:TMcgDlgButtons; HelpCtx: Longint;
X,Y:integer): Word отличается от MessageDlg наличием
параметров X и Y, управляющих положением окна на
экране.
Функция
InputBox(const
ACaption, APrompt,
ADefault: string):string отображает диалоговое окно,
служащее для ввода строки текста. Окно выводится в
центре экрана. В окне имеется поле ввода с надписью, а
также кнопки OK и Cancel.
Пример: Использование функции InputBox.
Procedure TForm1.Button1Click(Sender: TObject);
Var soname:string;
Begin
Soname:=inputbox(‘Пользователь’,’Введите
фамилию’, ‘Иванов’);
End;
13.4. Стандартные диалоги.
В Delphi имеются 10 элементов, находящихся на
странице Dialogs палитры компонентов. Они реализуют
диалоги общего назначения.
OpenDialog – выбор открываемого файла
SaveDialog – выбор сохраняемого файла
OpenPictureDialog
–
выбор
открываемого
графического файла
SavePictureDialog
–
выбор
сохраняемого
графического файла
FontDialog – настройка параметров шрифта
ColorDialog – выбор цвета
PrintDilog – вывод на принтер
99
PrinterSetupDialog – выбор принтера и настройка
его параметров
FindDialog – ввод строки текста для поиска
ReplaceDialog – ввод строк текста для поиска и
замены.
Для вызова любого стандартного диалога
используется метод Execute – функция, возвращающая
логическое значение. При закрытии диалога кнопкой ОК
она возвращает значение True, а при отмене диалога –
значение False;
После закрытия стандартного диалога он
возвращает через свои свойства значения, выбранные или
установленные в процессе диалога. Например, при
открытии файла возвращаемым значением является имя
открываемого файла(OpenDialog1.Filename), а при выборе
цвета – новый цвет(Colordialog1.color)
13.4.1. Общие свойства OpenDialog и SaveDialog:
Свойство
Filename
Тип
string
Title
Initialdir
String
Srting
DefaultExt
String
Filter
string
FilterIndex
Integer
Описание
Указывает имя и полный
путь к
файлу
Задает заголовок окна
Определяет
каталог,
содержимое
которого
отображается при вызове
окна диалога.(по умолчанию
– текущий каталог)
Задает
расширение,
автоматически
подставляемое
к
имени
файла, если пользователь не
указал расширение имени
Задает маски имен файлов,
отображаемых
в
раскрывающемся списке под
названием Типы файлов
Указывает, какая из масок
фильтра отображается в
списке. По умолчанию- 1используется первая маска.
100
Options
ofAllowMultiSelect
boolean
Из списка можно выбрать
одновременно более одного
файла
При вводе несуществующего
имени файла выдается запрос
на создание файла
Имена файлов отображаются
как короткие
Создает
окно
в
стиле
Windows3.11
ofCreatePrompt
ofNoLongNames
ofOldStyleDialog
Фильтр содержит значения, разделенные знаком
«|». Каждое значение состоит из описания и маски, также
разделенных знаком «|». Описание – это обычный текст,
поясняющий пользователю данную маску. Маска –
является шаблоном отображаемых файлов и состоит из
имени и расширения. Если для одного описания
приводится несколько масок, то они разделяются знаком
«;».
Пример: Формирование фильтра.
Opendialog1.filter:=’Текстовые файлы|*.txt;*.doc|Все
файлы|*.*’;
13.5. Практическая работа
Создадим редактор, в котором можно просматривать
текстовые файлы, сохранять их под другими именами,
изменять шрифт и цвет символов, искать нужное слово.
Форма
Свойство
Значение
Caption
Просмотр файлов
Position
PoScreenCenter
Width
Height
600
600
BorderStyle
BsSingle
Главное меню MainMenu (п.к. Standard)
Свойство
Значение
101
Примечание
Заголовок
«Просмотр
файлов»
Размещение
формы
симметрично по центру
экрана
Ширина формы – 600
Высота формы – 600
Границы
формы
фиксированные
Примечание
Правка
Найти
Items
Заменить
О программе
Шрифт
Цвет
Редактор (компонент Memo на странице Standart)
Свойство
Значение
Примечание
Lines
Пустой текст
Файл
Открыть
Сохранить
Выход
Код:
procedure TForm1.Open1Click(Sender: TObject);
//процедура по выбору пункта меню Открыть
begin
OpenDialog1.Filter:='Текстовые файлы|*.txt';
If OpenDialog1.Execute then
Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
StatusBar1.SimpleText:=OpenDialog1.FileName;
end;
procedure TForm1.Save1Click(Sender: TObject);
// процедура по выбору пункта Сохранить
begin
if SaveDialog1.FileName<>'' then
Memo1.Lines.SaveToFile(SaveDialog1.FileName)
else Saveas1Click(Sender);
end;
procedure TForm1.Saveas1Click(Sender: TObject);
// процедура по выбору пункта Сохранить как
begin
SaveDialog1.DefaultExt:='txt';
SaveDialog1.Filter:='Текстовые файлы|*.txt';
if SaveDialog1.Execute then
Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
procedure TForm1.Exit1Click(Sender: TObject);
// по выбору пункта Выход
begin
102
If CloseQuery then Form1.Close;
end;
procedure TForm1.Font1Click(Sender: TObject);
// по выбору пункта Шрифт
begin
If fontDialog1.Execute then
Memo1.Font:=Fontdialog1.Font;
end;
procedure TForm1.Color1Click(Sender: TObject);
// по выбору пункта Цвет
begin
if ColorDialog1.Execute then
Memo1.Color:=colorDialog1.Color;
end;
procedure TForm1.Find1Click(Sender: TObject);
// по выбору пункта Найти
begin
FindDialog1.Execute;
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
// событие Finddialog'а Onfind
begin
If Pos(FindDialog1.FindText, Memo1.Text)<>0 then
Begin
Memo1.HideSelection:=False;
Memo1.SelStart:=Pos(FindDialog1.FindText,
Memo1.Text)-1;
Memo1.SelLength:=Length(FindDialog1.FindText);
End
else
MessageDlg('Строка '+FindDialog1.FindText+' не
найдена',mtConfirmation,[mbYes],0);
end;
103
procedure TForm1.Replace1Click(Sender: TObject);
// по выбору пункта Заменить
begin
ReplaceDialog1.Execute;
end;
procedure
TForm1.ReplaceDialog1Replace(Sender:
TObject);
// событие Replacedialog'а OnReplace
Label 10;
begin
Memo1.HideSelection:=True;
10:
If Pos(ReplaceDialog1.FindText, Memo1.Text)<>0
then
Begin
Memo1.Selstart:=Pos(Replacedialog1.FindText,
Memo1.Text);
Memo1.SelLength:=Length(Replacedialog1.FindText);
Memo1.Seltext:=Replacedialog1.ReplaceText;
Goto 10;
end;
Memo1.HideSelection:=false;
end;
end.
104
Глава XIV. Компонент Timer
Компонент Timer предоставляет возможность
выполнения действий через определенные интервалы
времени. Для кодирования действий используется событие
OnTimer, генерируемое по истечении заданного периода
времени, который задается (в миллисекундах) свойством
Interval (по умолчанию 1000 – тиканье через 1 с)
14.1. Практическая работа
Создадим секундомер, который будет отсчитывать
время.
Форма
Свойство
Caption
Width
Height
BorderStyle
Position
Значение
Секундомер
350
295
bsSingle
poScreenCenter
Label1 (п.к. Standard)
(метка)
Свойство
Caption
Font.Size
Font.Style
Значение
Общее время
14
fsBold
Edit1 (п.к. Standard)
(окно редактирования)
Свойство
Text
Значение
0.0
BitBtn1 (п.к. Additional)
(управляющая кнопка с
изображением)
Свойство
Kind
Caption
Значение
bkYes
Старт
BitBtn2
(п.к.
Additional)
(управляющая кнопка с
изображением)
Свойство
Kind
Caption
Значение
bkAbort
Сброс
Свойство
Caption
Font.Size
Значение
Бегущая строка
14
Label2 (п.к. Standard)
(метка)
105
Bevel (п.к. Additional)
(кромка)
BitBtn (п.к. Additional)
(управляющая кнопка с
изображением)
Timer (п.к. System)
(таймер)
Font.Style
Font.Color
fsBold
clMaroon
Свойство
Height
Width
Top
Значение
9
345
200
Свойство
Kind
Значение
bkClose
Свойство
Enabled
Interval
Значение
False
10
var
Form1: TForm1;
TickCounter: LongInt;
procedure TForm1.FormCreate(Sender: TObject);
begin
TickCounter:=0;
Edit1.Text:='0.0';
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Timer1.Enabled then
begin
Timer1.Enabled:=False;
BitBtn1.Caption:='&Старт';
Timer1.Enabled:=False;
BitBtn1.Caption:='&Старт';
end
else
begin
timer1.Enabled:=true;
BitBtn1.Caption:='&Стоп';
end;
end;
106
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
TickCounter:=0;
Edit1.Text:='0.0';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var seconds:Real;
s:string;
begin
TickCounter:=TickCounter+1;
Seconds:=TickCounter/10;
Str(Seconds: 10:1, S);
Edit1.Text:=S;
// бегущая строка
if Label2.Left=0 then
Label2.Left:=ClientWidth-100
else
Label2.Left:=Label2.Left-1;
end;
Игра «УГАДАЙ ЧИСЛО»
Свойство
Caption
Name
Width
Height
BorderStyle
AutoSize
Position
Форма
MainMenu
(п.к. Standard)
(главное
меню)
Memo
(п.к.
Свойство
Items
Свойство
Значение
Угадай число
MainForm
315
375
bsSingle
True
poScreenCenter
Значение
Игра
Новая
Выход
Значение
107
О программе..
Standard)
(окно ввода)
Lines
Font style
size
color
Bold
14
Maroon
MaskEdit (п.к.
Additional)
(поле ввода)
Свойство
EditMask
Значение
999;1;
Text
BitBtn
(п.к.
Additional)
(управляющая
кнопка
с
изображением)
Свойство
Kind
StatusBar
(п.к.Win32)
(полоса
состояния)
Animate
Win32)
(п.к.
Label1
(п.к.
Standard)
Значение
bkOK
Свойство
AutoHint
Значение
True
Свойство
FileName
Visible
Значение
COOL.AVI
False
Свойство
Align
Alignment
Font style
size
color
Visible
Значение
alTop
atCenter
Bold
18
Red
False
//создаем событие
OnShow procedure TMainForm.FormShow(Sender:
TObject);
begin
Randomize; //загадываем случайное число и
a:=Random(100); //помещаем его в переменную а
end;
procedure TMainForm.BitBtn1Click(Sender: TObject);
108
begin
//Если нет входного текста, выводим
//на экран сообщение.
If Length(Trim(MaskEdit1.Text))=0 then
ShowMessage('Вы забыли ввести число!') else
//Сравниваем загаданное
//компьютером число с введенным с
//клавиатуры
If a=StrToInt(Trim(MaskEdit1.Text)) then
Begin
Label1.Caption:='Угадал!';
Label1.Visible:=True;
Animate.Visible:=True;
Animate.Active:=True;
end
else
If a>StrToInt(Trim(MaskEdit1.Text)) then
Memo.Lines.Add(Trim(MaskEdit1.Text)+'
Больше!')
else
Memo.Lines.Add(Trim(MaskEdit1.Text)+Меньше!');
MaskEdit1.Clear;
MaskEdit1.SetFocus;
end;
//выбор команды «Новая» в главном
//меню
procedure TMainForm.N2Click(Sender: TObject);
begin
Memo.Visible:=True;
Animate.Visible:=False;
Randomize;
a:=Random(100);
Memo.Clear;
end;
109
Дополнительное задание:
Добавьте к программе диалоговое окно «О
программе…»:
1. File > New > Forms > About Box
2. Создайте событие OnClick для пункта «О
программе…» главного меню
3. Вызываем диалоговое окно «О программе…»:
AboutBox.ShowModal.
110
Глава XV. Работа с таблицами
Таблицы
представляют
собой
элементы,
позволяющие отображать данные в виде строк и столбцов.
Для работы с таблицами в Delphi имеются компоненты
StringGrid и DrawGrid.
Таблица DrawGrid позволяет отображать в ячейках
текстовую и графическую информацию. Автоматически
выводится только сетка, а прорисовка содержимого ячеек –
это обязанность программиста.
Более простым и удобным для использования
является
компонент
StringGrid
(Таблица
строк),
применяемый для обработки текстовых данных.
Рассмотрим свойства, характерные для этих
компонентов:
Свойство
Значение
ColCount
Количество столбцов
FixedColor
Цвет фиксированных ячеек
FixedCols
FixedRows
Количество фиксированных столбцов
Количество фиксированных строк
GridLineWidth
RowCount
ScrollBars
Ширина разделительных линий
Количество строк
Возможность
отображения
полос
прокрутки
ssNone – полосы не допускаются
ssHorizontal
–
допускается
горизонтальная полоса
ssVertical –допускается вертикальная
полоса
ssBoth – допускаются обе полосы
Cells
Двумерные массив строк таблицы.
Например,
StringGrid1.Cells[0,0]
–
обращение к первой ячейке таблицы
Одномерный массив столбцов таблицы.
Например,
строка
Cols
111
Col
StringGrid1.Cols[1].Add('123'); добавляет
во вторую колонку строку '123'
Одномерный массив строк таблицы.
Например,
строка
StringGrid1.Rows[3].Clear; очищает 4
строку таблицы.
Текущий столбец
Row
Текущая строка
Rows
15.1. Практическая работа
Создадим форму для магазина. В таблицу можно
добавлять товар со склада , удалять и покупать товар.
Поставьте на форму следующие компоненты: StringGrid1,
5 меток Label с заголовками «Код товара», «Название»,
«Цена», «Количество», «Введите количество покупаемого
товара», 5 строк ввода Edit, 3 кнопки : «Купить»,
«Добавить товар», «Удалить товар», «Выход».
В таблице понадобится фиксированная строка, куда
вы разместите названия колонок. Поэтому свойству
FixedCols в Инспекторе Объектов присвоим значение 0.
Свойству RowCount зададим значение 2, так как
сначала товаров не будет.
112
Опишем процедуру заполнения фиксированных
ячеек (процедура по созданию формы):
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0]:='Код товара';
StringGrid1.Cells[1,0]:='Название';
StringGrid1.Cells[2,0]:='Цена';
StringGrid1.Cells[3,0]:='Количество';
end;
Вторая процедура на кнопку «Добавить товар» будет
заключаться в том, что из полей ввода в таблицу
переносятся в соответствующие ячейки код, название, цена
и количество товара, причем в выбранную пользователей
строку.
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
StringGrid1.Cells[0,StringGrid1.row]:=edit1.Text;
StringGrid1.Cells[1,StringGrid1.row]:=edit2.Text;
StringGrid1.Cells[2,StringGrid1.row]:=edit3.Text;
StringGrid1.Cells[3,StringGrid1.row]:=edit4.Text;
StringGrid1.RowCount:=
StringGrid1.RowCount+1;//
увеличиваем количество //строк в таблице
113
end;
StringGrid1.row – текущая строка, StringGrid1.col –
текущий столбец.
Самостоятельно напишите процедуру для кнопки
«Купить» - учитывая количество товара, и для кнопки
«Удалить товар»
114
Глава XVI. Элементы с закладками
Элементы с закладками – это элементы, содержащие
несколько страниц (листов), которые пользователь может
выбирать, щелкая на закладках страницы. Закладки также
называются ярлычками или корешками. Для работы с
элементами, содержащими закладки, предназначены
компоненты TabControl и PageControl, размещенные на
палитре компонентов Win32.
16.1.
TabControl.
Одностраничный
блокнот
Одностраничный блокнот TabControl представляет
собой прямоугольную область с набором закладок.
Свойство
Значение
Style
Вид закладок.
tsTabs – стандартные, объемного вида
tsButtons – в виде кнопок
tsFlatButtons – в виде плоских кнопок
TabPosition
Расположение закладок
tpTop - сверху
tpBottom - снизу
tpLeft - слева
tpRight - справа
Массив строк с названиями закладок
Возможность выстраивания закладок
в несколько линий
Tabs
MultiLine
TabWidth
Ширина закладки
TabHeight
Высота закладки
ScrollOpposite
Если MultiLine=True, строка с
выбранной закладной перемещается в
первый ряд.
115
TabIndex
Текущая (выбранная) закладка
HotTrack
Определяет подсвечивание закладки
16.2.
Многостраничный
PageControl.
блокнот
Многостраничный блокнот PageControl, в отличие
от предыдущего компонента имеет несколько страниц,
расположенных одна под другой. Каждая страница имеет
свою закладку.
Свойство
Значение
ActivePage
Имя активной страницы
Pages
Список страниц блокнота, к которым
можно обращаться по номеру
Вид закладок.
tsTabs – стандартные, объемного
вида
tsButtons – в виде кнопок
tsFlatButtons – в виде плоских кнопок
Style
HotTrack
Если MultiLine=True, строка с
выбранной закладной перемещается
в первый ряд.
Определяет подсвечивание закладки
TabWidth
Ширина закладки
TabHeight
Высота закладки
TabPosition
Расположение закладок
tpTop - сверху
tpBottom - снизу
tpLeft - слева
tpRight – справа
ScrollOpposite
116
ActivePageIndex
Номер активной страницы блокнота
Каждая страница называется TabSheet, ее свойства
также можно изменить через Инспектор объектов, выделив
её.
Добавление новой страницы к блокноту при
разработке осуществляется при помощи правой кнопки
мыши, выбрав пункт контекстного меню New Page (новая
страница). Удаление страниц через это же меню по кнопке
Delete Page (удалить страницу).
16.3. Практическая работа
Создадим записную книжку на каждый день недели
от ПОНЕДЕЛЬНИКА до ВОСКРЕСЕНЬЯ
Форма
Свойство
Caption
Position
Height
Значение
Блокнот
poScreenCenter
400
Width
400
Многострани
чный
блокнот
(компонент
PageControl
на странице
Win32d)
Свойство
Align
Width
TabSheet1..
TabSheet7
HotTrack
Значение
alLeft
230
Понедельник..Воскресенье
True
Кнопки
Close,
Добавить,
Удалить,
Изменить,
Загрузить,
Сохранить
Свойство
Значение
117
(компонент
BitBtn
на
странице
Additional)
Поле
Edit
ввода
Список
(компонент
Listbox
на
странице
Standart)
ставится на
каждую
страницу
компонента
PageControl
Диалоги
OpenDialog и
SaveDialog1
Height
Width
40
105
Свойство
Значение
Height
Width
16
28
Text
Свойство
Значение
Align
Свойство
alClient
Значение
DefaultExt
txt
Filter
Текстовые файлы *.txt
Все файлы *.*
118
Опишем процедуру загрузки файла по кнопке
«Загрузить»:
procedure
TForm1.BitBtn6Click(Sender:
TObject);
begin
if opendialog1.Execute then
case pagecontrol1.ActivePageIndex of
0: listbox1.Items.LoadFromFile(opendialog1.FileName);
1: listbox2.Items.LoadFromFile(opendialog1.FileName);
2: listbox3.Items.LoadFromFile(opendialog1.FileName);
3: listbox4.Items.LoadFromFile(opendialog1.FileName);
4: listbox5.Items.LoadFromFile(opendialog1.FileName);
5: listbox6.Items.LoadFromFile(opendialog1.FileName);
6: listbox7.Items.LoadFromFile(opendialog1.FileName);
end;
end;
Процедура на кнопку «Добавить»:
Содержимое строки ввода добавляется в список ListBox
выше выбранной в списке строки.
procedure
TForm1.BitBtn2Click(Sender:
TObject);
119
begin
case pagecontrol1.ActivePageIndex of
0: listbox1.Items.Insert(listbox1.ItemIndex,edit1.text);
1: listbox2.Items.Insert(listbox2.ItemIndex,edit1.text);
2: listbox3.Items.Insert(listbox3.ItemIndex,edit1.text);
3: listbox4.Items.Insert(listbox4.ItemIndex,edit1.text);
4: listbox5.Items.Insert(listbox5.ItemIndex,edit1.text);
5: listbox6.Items.Insert(listbox6.ItemIndex,edit1.text);
6: listbox7.Items.Insert(listbox7.ItemIndex,edit1.text);
end;
edit1.Clear;// очистка поля ввода
edit1.SetFocus;// возвращение фокуса в
поле ввода
end;
Самостоятельно напишите процедуры на кнопки
«Сохранить», «Удалить», «Изменить».
120
Глава XVII. Панели инструментов
Панели
инструментов
представляют
собой
управляющий элемент, предназначенный для выбора часто
используемых команд. Обычно выбираемые с помощью
панели инструментов команды дублируют часто
используемые команды главного или локального меню.
Панели инструментов содержат такие управляющие
компоненты, как кнопки и списки. Многие Windowsприложения имеют одну или более панелей инструментов
(например,
MsWord
предоставляет
8
панелей
инструментов, облегчающих работу пользователей).
Для создания панелей инструментов Delphi
предоставляет
компоненты
ToolBar
и
CoolBar,
находящиеся на странице Win32 Палитры компонентов.
17.1. Компонент ToolBar.
Компонент ToolBar содержит специальные кнопки
ToolButton и позволяет манипулировать ими. Кроме
кнопок ToolButton, на панель инструментов можно
помещать и другие компоненты, например, редактируемый
список Combobox или редактор Edit.
При разработке приложения для добавления к
панели инструментов новой кнопки нужно щелкнуть как
компоненте ToolBar правой кнопкой мыши и выбрать
пункт контекстного меню New Button (новая кнопка) или
New Separator (новый разделитель), для вставки
промежутка между кнопками.
На кнопки ToolButton можно вывести изображение.
Рисунок для кнопки определяется свойством ImageIndex.
Перечень рисунков содержится с компоненте ImageList
(п.к Win32).
ToolBar
Свойство
AutoSize
Значение
Если
содержит
True,
высота
компонента
будет
автоматически согласовываться
121
с высотой кнопок
ButtonCount
ButtonHeight
DisableImages
Flat
HotImages
Images
Indent
List
RowCount
ShowCaptions
Wrapable
Содержит
количество
вставленных
в
инструментальную
панель
дочерних
компонентов
(не
только кнопок TollButton)
Определяет
высоту
кнопок
Определяет контейнер для
изображений
запрещенных
кнопок
Если true, панель и
кнопки на ней прозрачны для
фона
и
вокруг
кнопки
появляется граница только когда
над ней располагается указатель
мыши
Определяет
контейнер
изображений для кнопок в
момент, когда над кнопкой
расположен указатель мыши
Определяет контейнер для
изображений кнопок в обычном
состоянии
Определяет
отступ
в
пикселях
от
левого
края
компонента
для
дочернего
элемента
Если true, изображение
прижимается к левой границе
кнопки, а текст к правой
Содержит
количество
рядов кнопок
Разрешает/Запрещает
показ на кнопках текста
Разрешает/Запрещает
располагать
122
17.2. ToolButton
Свойство
AllowAllUp
Grouped
Style
Down
ImageIndex
Значение
Если True, синхронизирует
свое состояние с состоянием
других кнопок в той же группе: в
любой момент может быть
нажата только одна кнопка
группы
Разрешает/запрещает
учитывать свойство AllowAllUp
Вид кнопки.
tbsButton – кнопка ведет
себя как обычная быстрая
кнопка;
tbsCheck – кнопка работает
как переключатель;
tbsDropDown – кнопка
отображает
стрелку,
указывающую вниз,
Определяет
состояние
утопленности кнопки
Определяет
индекс
связанного
с
кнопкой
изображения
17.3. Практическая работа
Создадим приложение, в котором все пункты меню
будут дублироваться в панели инструментов.
Форма
Свойство
Caption
Position
Height
Значение
Пример с панелью
инструментов
poScreenCenter
320
Width
360
Многострочный редактор
(компонент
Memo
на
странице Standart)
Свойство
Align
Width
123
Значение
alLeft
230
Меню
(MainMenu
Standart)
п.к
TabSheet1..
TabSheet7
HotTrack
Понедельник..Воскресенье
True
Свойство
Значение
Файл(новая,
открыть,
сохранить ,
- , выход)
Цвет (фона,
фигур)
Items
Свойство
Значение
DefaultExt
Filter
txt
Текстовые
файлы
*.txt
Все файлы *.*
ColorDialog(п.к Dialogs)
Свойство
Значение
3 Геометрические фигуры
Shape (п.к. Additional)
Свойство
Shape
Shape
Shape
Значение
stEllipse
stRoundRect
stRectangle
ImageList ( п.к Win32)
Свойство
Значение
OpenDialog,
(п.к Dialogs)
SaveDialog
Загрузите
изображения
через
ImageList, дважды щелкнув по
компоненте
Панель
инструментов
ToolBar( п.к Win32)
Свойство
Images
EdgeInner
EdgeOuter
124
Значение
ImageList1
esLowered
esNone
Напишем процедуру для загрузки файла в редактор
на пункт меню «Открыть…»:
procedure TForm1.N2Click(Sender: TObject);
begin
if opendialog1.Execute then
memo1.Lines.LoadFromFile(opendialog1.filename);
end;
Процедура на изменение цвета формы (Меню
«Цвет»->«фона»):
procedure TForm1.N7Click(Sender: TObject);
begin
if colordialog1.Execute then
form1.Color:= colordialog1.Color;
end;
Для того, чтобы кнопка на панели инструментов
выполняла тоже действие что и пункт меню нужно
выделить кнопку, перейти на вкладку Events Инспектора
Объектов, и в раскрывающемся списке события OnClick
найти и указать название пункта меню данного пункта
меню. Такие действия избавят нас от необходимости
писать одну процедуру дважды.
Самостоятельно опишите процедуры для остальных
пунктов меню.
125
Глава XVIII. Графика в Delphi
Программирование графики в Windows является
сложным и трудным процессом, но в Delphi имеются
классы,
существенно
упрощающие
использование
графических средств Windows:
 Tcanvas – для дисплейного контекста
 Tfont – для шрифта
 Tpen – для пера
 Tbrush – для кисти
18.1. Класс Tfont.
С помощью класса TFont создается объект шрифт
для любого графического устройства (экрана, плоттера,
принтера и т.д.).
Свойства класса:
CharSet
Color
FontAdapter
Height
Name
Pitch
Набор
символов.
Для
русскоязычных программ это
свойство обычно имеет значение
Default_CharSet.
Цвет шрифта
Поставляет
информацию
о
шрифте в компоненты ActiveX
Высота шрифта в пикселях
экрана
Имя шрифта. По умолчанию
имеет значение MS Sans Serif
Определяет способ расположения
букв в тексте: значение fpFixed
задает моноширинный текст, при
котором каждая буква имеет
одинаковую ширину; значение
fpVariable
определяет
пропорциональный текст, при
котором ширина буквы зависит
от ее начертания; fpDedault
определяет ширину, принятую
для текущего текста
126
Определяет количество пикселей
экрана
Высота шрифта в пунктах
Стиль шрифта.
fsBold - жирный
fsItalic - курсив
fsUnderline - подчеркнутый
fsStrikeOut -перечеркнутый
PixelPerInch
Size
Style
18.2. Класс Tren.
С помощью класса TPen создается объект-перо,
служащий для вычерчивания линий.
Свойства класса:
Цвет шрифта
Color
Mode
Style
Width
Определяет
способ
взаимодействия линий с фоном.
Определяет стиль линий.
Учитывается только толщина линий 1
пиксель.
Для
толстых
всегда
psSolid(сплошная)
Толщина линий в пикселях
экрана
Свойство Mode
следующих значений:
может
принимать
pmBlack
Линии всегда черные
pmWhite
PmNop
Линии всегда белые
Цвет фона меняется
PmNot
Инверсия цвета фона
PmCopy
Цвет линий определяется
Color пера
Инверсия цвета пера
PmNotCopy
PmMergePenNot
одно
свойством
Комбинация цвета пера и инверсионного
цвета фона
127
из
PmMerge
Комбинация общих цветов для пера и
инверсионного цвета фона
Комбинация цветов пера и фона
PmNotMerge
PmMask
Инверсия цветов пера и фона
Общие цвета пера и фона
PmNotMask
Инверсия общих цветов пера и фона
PmMaskPenNot
18.3. Класс TBrush
BitMap
Color
Style
Содержит растровое изображение,
которое будет использоваться кистью для
заполнения.
Если
это
свойство
определено, свойства Color и Style
игнорируются.
Цвет кисти.
Стиль кисти.
18.4. Класс TCanvas
Этот класс создаёт “канву” – поверхность, на
которой можно рисовать чертёжными инструментами –
пером, кистью и шрифтом. Объекты класса Tcanvas
автоматически создаются для всех видимых компонентов,
которые должны уметь нарисовать себя.
Свойства класса:
Brush
Объект – кисть.
ClipRect
Определяет текущие размеры
области,
нуждающиеся
в
прорисовке.
CopyMode
Устанавливает
способ
взаимодействия
растрового
изображения с цветом фона.
Font
Объект – шрифт.
LockCount
Счётчик
блокировок
канвы.
Увеличивается на единицу при
128
Pen
PenPos
Pixels(X,Y:Integer)
каждом обращении к методу Lock
и уменьшается при обращении к
Unlosk.
Объект – перо.
Определяет текущее положение
пера в пикселях относительно
левого верхнего угла канвы.
Массив пикселей канвы.
Методы класса:
Procedure
Arc(x1,y1,x2,y2,x3,y3,x4,y4)
Procedure
Chord(x1,y1,x2,y2,x3,y3,x4,y4)
Procedure Ellipse(x1,y1,x2,y2)
Procedure FillRect(const Rect)
Procedure LineTo(x,y)
Procedure MoveTo(x,y)
129
Чертит дугу эллипса в
охватывающем
прямоугольнике
(х1,у1)-(х2,у2). Начало дуги
лежит
на
пересечении
эллипса
и
луча,
проведенного из его центра
в точку (х3,у3), а конец – на
пересечении с лучом из
центра в точку (х3,у4)
Чертит сегмент эллипса в
охватывающем
прямоугольнике
(х1,у1)-(х2,у2)
Чертит
эллипс
в
охватывающем
прямоугольнике
(х1,у1)-(х2,у2). Заполняет
все
внутреннее
пространство
эллипса
текущей кистью
Заполняет текущей кистью
прямоугольную
область
Rect, включая ее левую и
верхнюю границы, но не
затрагивая
правую
и
нижнюю
Чертит линию от текущего
положения пера до точки
(х,у)
Перемещает
перо
в
Procedure
PolyGon(points:
array of points)
Procedure
PolyLine(points:
array of points)
Procedure
Rectangle(x1,y1,x2,y2)
Procedure Refresh
Function
TextHeight(const
Text:string):integer
Procedure
TextOut(x,y:integer;const
Text:string)
Function
TextWidth(const
Text:string):integer
Procedure TextRect(rect:Trect;
x,y:integer; Text:string);
130
положение
(х,у)
без
вычерчивания линий
Вычерчивает
пером
многоугольник по точкам,
заданным в массиве points.
Конечная соединяется с
начальной,
и
многоугольник заполняется
кистью
Вычерчивает
пером
ломаную
прямую
по
точкам,
заданным
в
массиве points
Вычерчивает и заполняет
прямоугольник
(х1,у1)-(х2,у2)
Устанавливает перо, кисть
и шрифт по умолчанию
Возвращает
высоту
прямоугольника,
охватывающего текстовую
строку Text
Выводит текстовую строку
Text так, чтобы левый
верхний
угол
прямоугольника,
охватывающего
текст,
располагался в точке (x,y)
Возвращает
ширину
прямоугольника,
охватывающего текстовую
строку Text
Выводит текстовую строку
Text так, чтобы левый
верхний
угол
прямоугольника,
охватывающего
текст,
располагался в точке (x,y)
18.5. Практическая работа
1. Рассмотрим пример рисования на поверхности
формы с использованием свойства Canvas.
Выполним вывод на поверхность формы
изображения домика.
Код,
выполняющий
отображение
рисунка,
расположен в обработчике события OnResize формы,
поэтому при
изменении ее
размеров рисунок
перерисовывается заново, учитывая новые размеры
формы.
procedure TForm1.FormResize(Sender: TObject);
var w,h,wm,hm:integer;
begin
form1.Refresh;
wm:=form1.ClientWidth; w:=wm div 8;
hm:=form1.ClientHeight; h:=hm div 10;
//небо
with form1.Canvas do begin
brush.Color:=clBlue;
brush.Style:=bsDiagCross;
pen.color:=clblue;
rectangle(0,0,wm,h);
//трава
brush.Color:=clGreen;
brush.Style:=bsHorizontal;
pen.color:=clGreen;
rectangle(0,hm-h,wm,hm);
//солнце
brush.Color:=clYellow;
brush.Style:=bsSolid;
pen.color:=clYellow;
ellipse(w,2*h,2*w,2*h+w);
//домик
brush.Color:=clGray;
brush.Style:=bsSolid;
131
pen.color:=clMaroon;
rectangle(2*w,hm-5*h,6*w,hm-h);
polygon([point(2*w,hm-5*h),point(4*w,hm-7*h),
point(6*w,hm-5*h),point(2*w,hm-5*h)]);
brush.Color:=clwhite;
brush.Style:=bsSolid;
pen.color:=clMaroon;
rectangle(3*w,hm-4*h,5*w,hm-2*h);
end;
end;
2. Нарисуем мигающий светофор.
Поставьте на форму кнопку BitBtn и компонент
PaintBox (п.к System).
Опишем процедуру на событие OnPaint компоненты
PaintBox:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
with canvas do begin
pen.Color:=clBlack;
brush.color:=clblack;
rectangle(50,30,150,250);
pen.color:=clgray;
brush.color:=clgray;
rectangle(90,250,110,330);
pen.color:=clmaroon;
brush.color:=clmaroon;
ellipse(70,40,130,100);
pen.Color:=clolive;
brush.color:=clolive;
ellipse(70,110,130,170);
pen.Color:=clbackground;
brush.color:=clbackground;
ellipse(70,180,130,240);
end;
end;
Процедура по нажатию на кнопку «Включить»:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
132
with canvas do begin
pen.Color:=clred;
brush.Color:=clred;
ellipse(70,40,130,100);
sleep(500);
pen.Color:=clmaroon;
brush.Color:=clmaroon;
ellipse(70,40,130,100);
pen.Color:=clYellow;
brush.Color:=clYellow;
ellipse(70,110,130,170);
sleep(500);
pen.Color:=clolive;
brush.Color:=clolive;
ellipse(70,110,130,170);
pen.Color:=cllime;
brush.Color:=cllime;
ellipse(70,180,130,240);
sleep(500);
pen.Color:=clbackground;
brush.Color:=clbackground;
ellipse(70,180,130,240);
pen.Color:=clYellow;
brush.Color:=clYellow;
ellipse(70,110,130,170);
sleep(500);
pen.Color:=clolive;
brush.Color:=clolive;
ellipse(70,110,130,170);
pen.Color:=clred;
brush.Color:=clred;
ellipse(70,40,130,100);
sleep(500);
pen.Color:=clmaroon;
133
brush.Color:=clmaroon;
ellipse(70,40,130,100);
end;
end;
3. Поставьте на форму компонент PaintBox.
Опишем процедуру на событие OnPaint этого компонента.
procedure TForm1.PaintBox1Paint(Sender: TObject);
var x,y:integer;
begin
with PaintBox1.Canvas do
begin
brush.Color:=clRed;
ellipse(0,0, PaintBox1.width, PaintBox1.height);
font.Name:='arial';
font.Size:=height div 5;
font.Style:=[fsBold,fsItalic];
font.Color:=clwhite;
x:=( PaintBox1.width-textwidth('Delphi')) div 2;
y:=( PaintBox1.height-textheight('D'))div 2;
textout(x,y,'Delphi');
end;
end;
134
Download