
- •1 Компоненты Delphi
- •1.1 Компонент класса TGroupBox
- •1.2 Компонент класса TRadioButton
- •1.3 Компонент класса TRadioGroup
- •1.4 Компонент класса TCheckBox
- •1.5 Компонент класса TListBox
- •1.6 Компонент класса TForm
- •1.7 Компонент класса TImage
- •1.8 Компонент класса TTimer
- •1.9 Компонент класса TImageList
- •1.10 Компоненты классов TActionList и TAction
- •1.11 Компонент класса TMainMenu
- •1.12 Компоненты классов TToolBar и TToolButton
- •1.13 Компоненты класса TStatusBar и TStatusPanel
- •1.14 Компоненты классов TOpenDialog и TSaveDialog
- •1.15 Компонент класса TTreeView
- •2 Примеры выполнения практических заданий
- •2.1 Стандартные алгоритмы
- •2.2 Элементы выбора
- •2.3 Простейшие классы
- •2.4 Графика
- •2.5 Диалоговые окна
- •2.6 Комплексное задание
- •2.7 Наследование
- •2.8 Древовидные структуры

Рисунок 6 – Внешний вид и пример работы программы (основная форма и диалоговое окно), реализующей работу с диалоговыми окнами
2.6 Комплексное задание
Задание: Доработать программу раздела 2.5 обеспечив использование меню, панели инструментов, строки состояния, механизма действий, стандартных диалоговых окон. Организовать сохранение и чтение списка людей с использованием текстовых файлов. Обеспечить запрет недопустимых действий. Вывести данные о людях в порядке возрастания ФИО в виде списка строк формата «<ФИО> <серия паспорта> <номер паспорта>».
Добавим на основную форму компоненты:
Main_AL класса TActionList для формирования списка действий;
Main_IL класса TImageList для создания списка рисунков, используе-
мых в основном меню и на панели инструментов;
Main_MM класса TMainMenu для формирования основного меню программы;
Main_TB класса TToolBar для создания панели инструментов;
Main_SB класса TStatusBar для создания строки состояния;
Load_B класса TButton для активизации загрузки ранее сохраненного
списка людей;
Save_B класса TButton для активизации сохранения списка людей;
33

Calc_B класса TButton для активизации вывода списка людей в заданном формате;
FormatSpisok_LB класса TListBox для вывода списка людей в заданном формате;
FormatSpisok_L класса TLabel для подписи компонента For-
matSpisok_LB;
Open_D класса TOpenDialog для обеспечения выбора файла для загруз-
ки списка людей;
Save_D класса TSaveDialog для обеспечения выбора файла для сохранения списка людей.
Добавим в Main_IL шесть рисунков для операций «Добавить», «Изменить», «Удалить», «Загрузить», «Сохранить» и «Расчет» (номера рисунков будут 0…5 соответственно).
На панели инструментов Main_TB создадим шесть кнопок панели ин-
струментов: Add_TBt, Change_TBt, Del_TBt, Load_TBt, Save_TBt, Calc_TBt.
Для операций «Добавить», «Изменить», «Удалить» создадим акции на основе подпрограмм обработки нажатия на соответствующие кнопки: Add_A, Change_A, Del_A. Значения свойств и событий акций приведены в таблице 7.
Таблица 7 – Значения свойств акции Add_A, Change_A, Del_A
Акция.Свойство(событие) |
Значение |
Add_A.Caption |
Доб&авить |
Add_A.ImageIndex |
0 |
|
|
Add_A.OnExecute |
Add_BClick |
|
|
Change_A.Caption |
И&зменить |
Change_A.ImageIndex |
1 |
|
|
Change_A.OnExecute |
Change_BClick |
Change_A.Enabled |
False |
Del_A.Caption |
Уда&лить |
Del_A.ImageIndex |
2 |
Del_A.OnExecute |
Del_BClick |
|
|
Del_A.Enabled |
False |
|
|
Для операций «Загрузить», «Сохранить», «Расчет» создадим акции Load_A, Save_A, Calc_A. Для этих акций события OnExecute описываются, а не задаются. Значения свойств и событий акций приведены в таблице 8.
Таблица 8 – Значения свойств акции Load_A, Save_A, Calc_A
Акция.Свойство Значение
Load_A.Caption За&грузить
Load_A.ImageIndex 3
Save_A.Caption Со&хранить
Save_A.ImageIndex 4
34

Продолжение таблицы 8
Акция.Свойство Значение
Save_A.Enabled False
Calc_A.Caption Рас&чет
Calc_A.ImageIndex 5
Calc_A.Enabled False
В основном меню Main_MM создадим раздел меню «Дейс&твие», в котором создадим шесть пунктов на основе акций Add_A, Change_A, Del_A, Load_A,
Save_A, Calc_A.
В строке состояния создадим три панели и установим у них необходимую для отображения информации ширину.
Установим следующие значения свойств компонентов (таблица 9):
Таблица 9 – Значения свойств компонентов для примера программы, реализующей комплексное задание
Компонент.Свойство |
Значение |
Main_AL.Images |
Main_IL |
|
|
Main_MM.Images |
Main_IL |
|
|
Main_TB.Images |
Main_IL |
Main_TB.Flat |
True |
Main_TB.AutoSize |
True |
FormatSpisok_L.Caption |
Список людей в заданном &формате |
FormatSpisok_L.FocusControl |
FormatSpisok_LB |
Add_B.Action |
Add_A |
|
|
Change_B.Action |
Change_A |
Del_B.Action |
Del_A |
Load_B.Action |
Load_A |
Save_B.Action |
Save_A |
|
|
Calc_B.Action |
Calc_A |
|
|
Add_TBt.Action |
Add_A |
Change_TBt.Action |
Change_A |
Del_TBt.Action |
Del_A |
Load_TBt.Action |
Load_A |
|
|
Save_TBt.Action |
Save_A |
|
|
Calc_TBt.Action |
Calc_A |
|
|
Open_D.DefaultExt |
txt |
Open_D.InitialDir |
. |
Open_D.Options.ofPathMustExist |
True |
|
|
Open_D.Options.ofFileMustExist |
True |
|
|
Open_D.Title |
Загрузка списка людей |
Save_D.DefaultExt |
txt |
|
|
Save_D.InitialDir |
. |
Save_D.Options.ofOverwritePromt |
True |
Save_D.Title |
Сохранение списка людей |
35

Также у компонентов Open_D и Save_D необходимо настроить свойство Filter. Настройка осуществляется во встроенном для свойства редакторе, в котором необходимо заполнить две строки в таблице из двух колонок (табли-
ца 10).
Таблица 10 – Заполнение свойства Filter
Первая колонка |
Вторая колонка |
Текстовые файлы (*.txt) |
*.txt |
Все файлы (*.*) |
*.* |
Опишем событие OnExecute акции Save_A1:
procedure TMain_F.Save_AExecute(Sender: TObject); var
f : TextFile; i : integer;
People : TPeople; begin
Save_D.FileName := ''; // Имя файла "по умолчанию" не задано {Вызов диалогового окна выбора файла для сохранения и
проверка результата завершения его работы. Если окно закрыто с подтверждением сохранения, то выполнение действий по сохранению списка людей}
if Save_D.Execute then begin
AssignFile(f,Save_D.FileName); Rewrite(f);
for i := 0 to Spisok_LB.Count-1 do begin
{Получение i-го человека из списка} People := ...;
{Сохранение каждого параметра отдельной строкой} writeln(f,People.FIO);
...; end;
CloseFile(f);
end;
end;
Опишем событие OnExecute акции Load_A:
procedure TMain_F.Load_AExecute(Sender: TObject); var
f : TextFile; i : integer;
People : TPeople;
1 Здесь и далее программная реализация приведена не полностью, чтобы обеспечить самостоятельную доработку программы на основе изученного ранее материала.
36

begin
Open_D.FileName := ''; // Имя файла "по умолчанию" не задано {Вызов диалогового окна выбора файла для загрузки и
проверка результата завершения его работы. Если окно закрыто с подтверждением загрузки, то выполнение действий по чтению списка людей}
if Open_D.Execute then begin
{Перед чтением данных требуется разрушение всех введенных ранее элементов и очистка компонента Spisok_LB}
...; {Очистка строки состояния}
for i := 0 to Main_SB.Panels.Count-1 do Main_SB.Panels[i].Text := '';
{Чтение данных из файла} AssignFile(f,Open_D.FileName); Reset(f);
while not Eof(f) do begin
{Создание экземпляра класса} People := ...;
{Чтение каждого параметра отдельной командой} readln(f,People.FIO);
...;
{Добавление считанных данных в компонент Spisok_LB}
...; end;
CloseFile(f);
{Установка доступности действий}
Change_A.Enabled := False; // Запрещено, т.к. в Spisok_LB
Del_A.Enabled := False; |
// |
ничего не выбрано |
|
Calc_A.Enabled |
:= True; |
// Разрешено, т.к. из файла |
|
Save_A.Enabled |
:= True; |
// |
считаны данные1 |
end;
end;
Опишем событие OnExecute акции Calc_A:
procedure TMain_F.Calc_AExecute(Sender: TObject); var
Peoples : array of TPeople; i : integer;
...; begin
{Выделение памяти для динамического массива людей} SetLength(Peoples,Spisok_LB.Count);
{Заполнение динамического массива людей} for i := 0 to Spisok_LB.Count-1 do
Peoples[i] := Spisok_LB.Items.Objects[i] as TPeople;
1 Будем считать, что запись разрешена только в случае наличия данных в Spisok_LB. Поэтому после чтения из файла имеются данные хотя бы одного человека.
37
{Сортировка массива}
...; {Очистка старых результатов и вывод отсортированного списка
людей в заданном формате} FormatSpisok_LB.Clear;
for i := 0 to Spisok_LB.Count-1 do FormatSpisok_LB.Items.Add(Peoples[i].FIO+
' '+Peoples[i].Series+' '+IntToStr(Peoples[i].Number)); {Освобождение памяти, занимаемой динамическим массивом} SetLength(Peoples,0);
end;
Опишем событие OnClick компонента Spisok_LB для вывода информации в строку состояния и разрешения акций по редактированию и удалению человека:
procedure TMain_F.Spisok_LBClick(Sender: TObject); var
People : TPeople; begin
{Получение выбранного человека} People := ...;
{Вывод данных человека в панели строки состояния} Main_SB.Panels[0].Text := People.FIO;
...; {Разрешение действий по редактированию и удалению человека}
...; end;
Для завершения работы над программой необходимо внести изменения в процедуры:
procedure TMain_F.Add_BClick(Sender: TObject);
procedure TMain_F.Change_BClick(Sender: TObject);
procedure TMain_F.Del_BClick(Sender: TObject);
для обеспечения запрета или разрешения тех или иных действий и работы со строкой состояния (реализация этих операций не приводится и должна быть выполнена самостоятельно).
Также возможной доработкой программы может быть очистка списка FormatSpisok_LB после выполнения операций добавления, изменения, удаления, загрузки, т.к. после этих операций текущий список людей и упорядоченный список людей могут не совпадать.
Внешний вид и пример работы программы показаны на рисунке 7.
38