Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методички по информатике / Программирование в среде Delphi (Часть 2).pdf
Скачиваний:
60
Добавлен:
27.05.2015
Размер:
1.41 Mб
Скачать

Рисунок 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