Практическая работа № 5
Тема: Разработка проекта «Телефонный справочник» средствами Delphi 7.0.
Новые объекты: многостраничный блокнот, комбинированный список. Создание новых окон и стандартных диалогов. Работа с Файлами записей в Object Pascal.
Цель работы: Создать программу для работы с базой данных телефонным справочником, сформированным в виде файла записей. В каждой записи определены поля: фамилия и имя (строки длиной по 20 символов каждая), адрес и номер телефона (строки длиной 100 и 15 символов соответственно). Необходимо реализовать следующие операции: создание и удаление записи, сохранение и считывание файла записей с диска, редактирование, поиск и сортировку данных в алфавитном порядке, просмотр записей и навигацию по базе.
Ознакомиться с новыми объектами: многостраничным блокнотом (PageControl), страницей блокнота (TabSheet), комбинированным списком (ComboBox), диалоговым окном (AboutBox), стандартными диалогами открытия и сохранение файлов (OpenDialog и SaveDialog).
Теоретические сведения. Многостраничный блокнот (PageControl) находится на особом виде формы Tabbed Pages (объект PagesDlg, заголовок "Tabbed Notebook Dialog"). Форму создают командами File => New...=> Закладка Forms => Tabbed Pages => Ok. После её создания ненужную форму "Forml" в случае необходимости можно удалить с помощью кнопки is (Remove unit) окна менеджера проекта (Project Manager). Вызов окна менеджера проекта осуществляется командами View => Project Manager. В данной работе активизацию объектов PageControl и PagesDlg можно осуществлять с помощью инспектора объектов. Свойства объекта PagesDlg совпадают со свойствами обычной формы Form. Рассмотрим новые свойства блокнота PageControl:
Свойство |
Описание свойства |
Примеры значений |
ActivePage |
Имя активной страницы |
TabSheet |
MultiLine |
Возможность размещать закладки страниц в несколько строк |
True (закладки в несколько строк), False (закладки в одну строку) |
Свойства отдельной страницы блокнота (объекта TabSheet) аналогичны описанным в предыдущих разделах.
Объект ComboBox предназначен для создания выпадающего списка. Его новые свойства такие:
Свойство |
Описание свойства |
Примеры значений |
DropDownCount |
Количество строк в выпадающем списке, которые видимы без использования полос прокручивания |
7; 3 |
Sorted |
Сортировка списка по алфавиту |
True (список сортируется), False (не сортируется) |
Style |
Стиль оформления и использование списка |
csOwnerDrawVariable (заданный программистом), csDropDown (стандартный) |
Стандартные диалоги открытия (объект OpenDialog) и сохранение файлов (объект SaveDialog), - это невидимые на форме объекты, ^предназначенные для создания стандартных в Windows 9х окон: "Open file" и "Save File as" - в момент вызова их из программного кода проекта командой OpenDialogl. Execute или SaveDialogl.Execute. Имя выбранного файла возвращается в программу свойством FileName этих объектов.
Ход работы
1. Загрузите среду визуального программирования Delphi.
2. Откройте новую форму с многостраничным блокнотом.
File => New-..^Закладка Forms => Tabbed Pages => Ok.
3. Выделите и удалите клавишей Delete панель (Panel) с кнопками Ok, Cancel и Help в нижней части открытой формы.
4. Поменяйте заголовок формы с «Tabbed Notebook Dialog» на «Телефонный справочник» и поменяйте стиль границы окна (BorderStyle) на Sizeable (способный менять размер).
Для этого сначала в окне Object Inspector в списке компонентов текущей формы выберите объект PagesDlg (окно формы с многостраничным блокнотом). Только теперь можно поменять его заголовок и стиль.
5. Выделите (щелкнув внутри страницы мышью) и удалите (Delete) третью страницу блокнота TabSheetS.
Будьте внимательны и не удалите весь многостраничный блок-пот - объект PageControll. В случае необходимости Вы можете отказаться от неправильного действия командой Edit => Undelete. Добавить новую страницу в блокнот можно командой New Page контекстного меню объекта PageControl (блокнот) или TabSheet (страница блокнота).
6. Замените заголовки (свойство Caption) первой и второй страниц блокнота (объектов TabSheetl и TabSheet2) на «Список всех записей» и «Редактирование и поиск записей» соответственно.
7. Заполните обе страницы формы визуальными объектами так, как это показано на рис. 16 и рис. 17.
Для создания объекта Комбинированный Список воспользуйтесь кнопкой И (ComboBox) на закладке Standard палитры компонентов. Кнопки «Предыдущий» «Следующий» называются Buttoml — Buttom4 соответственно. Очистите поля свойства Text объектов Editl - EditS и ComboBoxl. Установите свойство Style объекта ComboBoxl в csDropDownList (выпадающий список). Задайте такие значения свойств объекта StringGridl:
Свойство |
Значения |
ColCount |
4 |
FixedCols |
0 |
RowCotmt |
100 |
FixedRows |
1 |
Options = goEditing |
True |
8. Сохраните выполненную на данный момент форму в своей папке.
9. С помощью мыши задайте ширину столбцов таблицы, на пример так, как показано на рис. 16.
Для этого мышью передвиньте границу между двумя столбцами в первой (серой) строке таблицы StringGridl. He допускайте появления горизонтальной полосы прокручивания в таблице.
10. Добавьте на форму главное меню и введите названия его команд, как показано на рис. 16 и рис. 17.
Для того, чтобы провести линию-разделитель, между командами меню «Записать в файл» и «Конец» создайте дополнительный пункт с заголовком «-» (символ «минус»).
Замечание. Подменю «А->Я» и «Я->А» команды «Упорядочить по алфавиту» создают с помощью комбинации клавиш Ctrl-Кстрелка вправо или используют контекстное меню Create Submenu этой команды. Удаление ненужной команды выполняют клавишей Delete.
11. Создайте окно формы «О программе» (см. рис. 18).
Прибавьте к проекту новое окно формы типа About box (File
=> New... => Закладка Forms
=> About box => Ok). Поменяйте тексты и заголовок формы, указав свою фамилию, например,
так, как показано на рис. 18. Поменяйте
изображения в окне по своему усмотрению,
сменив свойство Picture объекта Programlcon (см. п. 13 практической работы № 1).
Рис. 17 |
Рис. 18 |
12. Запрограммируйте команду «О программе» главного меню окна «Телефонный справочник» так, чтобы в момент ее выполнения на экране появлялось только что спроектированное окно.
В заготовку процедуры обработки этой команды введите строку для вызова метода Show (показать) объекта AboutBox:
AboutBox. Show
13. Запрограммируйте кнопку Ok окна «О программе».
Для этого возвратитесь к форме «О программе» и в процедуре OKButtonClick кнопки Ok введите команду закрытия активной формы:
Close
Замечание. Окно формы «О программе» находится под други ми окнами Delphi.
14. Удалите ненужную пустую форму Forml из проекта.
Для этого вызовите менеджер проекта командой View Project Manager (см. рис. 19). Выделите строку со значением Forml в поле Form и нажмите клавишу Delete. He сохраняйте эту форму (No). Закройте окно менеджера проекта.
Рис. 19
15. Запрограммируйте команду Файл => Выход главной формы.
16. Сохраните работу и запустите проект на выполнение.
Убедитесь в правильности работы закладок, комбинированного списка, наличия возможности редактировать поля таблицы и перемещаться по ним с помощью полосы прокручивания. Вызовите окно «О программе» и закройте его клавишей Ok. Закончите работу командой Файл => Выход.
17. Опишите глобальные переменные и типы данных программы: тип записи телефонного справочника (info), файл записей (F), переменную типа info (r) и целую переменную количества записей (N).
Для этого перед разделом реализации implementation добавьте такие команды:
info = record {Тип записи}
familia, imja : string[20];
adres : string[100];
tel : string[15];
end;
{Эта строка уже есть в заготовке модуля}
var PagesDIg : TPagesDlg;
К : file of info; {Файл
записей}
г : info; {Одна запись}
N : integer; |
{Количество записей}
18. Добавьте на форму два объекта - стандартные диалоги Windows для открытия и сохранения файлов.
Кнопки (OpenDialog) и
(SaveDialog)
находятся на закладке Dialogs панели компонентов Delphi. На рис. 16 и 17 эти объекты расположены в правом верхнем углу формы.
19. Запрограммируйте процедуры открытия и сохранения файлов телефонного справочника (команды главного меню «Прочитать из файла» и «Записать в файл»).
procedure TPagesDlg.N3Click(Sender: Tobject); {Здесь N3 - номер команды «Прочитать из файла», у Вас может быть другой номер}
var i : integer;
begin
{Выполнение стандартного диалога «Open file»}
if OpenDialogl.Execute then begin
{F — название выбранного диалогом файла
(свойство FileName объекта OpenDialogl)}
AssignFile(F, OpenDialogl .FileName);
Reset(F);
N := 0; {Читаем с начала файла}
{Считываем все записи из файла}
while not eof(F) do
begin
{В переменную r считываем текущую запись}
Read(F, r);
{Фамилия - в первый столбец таблицы}
StringGridl.Cells, N+l] := r.familia; {Имя - во второй столбец таблицы} StringGridl.Cellsfl, N+l] := r.imja; {Адрес - в третий столбец таблицы] StringGridl.Cells[2, N+l] := r.adres; (Телефон — в четвертый столбец таблицы} StringGridl.Cells[3, N+l] := r. tel; N := N + 1; {Увеличиваем общее число записей N} end;
CloseFile(F); {Закрываем файл}
{Описанная ниже процедура заполняет поля редактирования второй страницы формы}
NewEdit(ComboBox1);
{Описанная ниже процедура заполняет комбинированный список второй страницы формы}
NewComboBox;
end
end;
procedure TpagesDlg.N4Click(Sender: TObject); {Здесь N4 - номер команды «Записать в файл», у Вас может быть другой номер}
var i : integer;
begin
if SaveDialogl.Execute then
begin
AssignFile(F, SaveDialogl.FileName);
Rewrite(F);
i:=l;
while StringGridl.Cells[3, i] <> " do
begin
r.familia := StringGridl.Cells[0, i];
r.imja := StringGridl.Cells[l, i];
r.adres := StringGridl.Cells[2, i];
r.tel := StringGridl.Cells[3, i];
Write(F, r);
i := i + 1;
end;
CloseFile(F); end
end;
20. Напишите процедуру создания формы.
В окне инспектора объектов активизируйте объект PagesDlg (окно формы с многостраничным блокнотом) и дважды щелкните в строке OnCreate (МоментСоздания) закладки Events этого объекта. Сформируйте процедуру создания главной формы программы:
procedure TpagesDlg.FormCreate(Sender: TObject);
begin
{Заполняем заголовок таблицы}
StringGridl.cells[0, 0] := 'Фамилия';
StringGridl.Cellsfl, 0] := 'Имя';
StringGridl.cells[2, 0] := 'Адрес';
StringGridl.cells[3, 0] := 'Телефон';
{Создаем пустую строку в комбинированном списке}
ComboBox1. Items. Add(«);
{Активизируем эту строку на случай создания нового справочника}
ComboBoxl.Itemlndex:=0;
end;
21. Напишите процедуру заполнения полей
редактирования
NewEdit.
Вызов этой процедуры осуществляется, в частности, в момент выбора фамилии для поиска, то есть в момент смены активной строки в комбинированном списке. Поэтому для инициализации заготовки этой процедуры активизируйте на закладке Events окна Object Inspector объекта ComboBoxl строку OnChange (МоментЗа-мены) и в правом столбце укажите название процедуры реакции на это событие: NewEdit. Дважды щелкните мышью на введенном названии и заполните заготовку этой процедуры следующим образом:
procedure TPagesDlg.NewEdit(Sender: Tobject);
var i : integer;
begin
{i - номер строки данных в таблице}
i := ComboBoxl.Itemlndex + 1;
if i > 0 then
begin
{Для значащих позиций комбинированного списка}
Editl.Text := StringGridl.Cells[O, i];
{копируем данные i-го записи с}
Edit2.Text := StringGridl.Cells[l, i];
{первой страницы форты в}
Edit3.Text := StringGridl.Cells[2, i];
{соответствующие поля на второй странице}
Edit4.Text := StringGridl.Cells[3, i];
end
end;
22. Напишите процедуру заполнения комбинированного
списка
NewComboBox.
Сначала к описанию типа класса (объекта) TPagesDlg (много страничной формы) в разделе interface добавьте декларацию:
type
{Эта запись уже есть в заготовке модуля}
TPagesDlg = class(TForm)
{Необходимо вставить}
procedure NewComboBox;
В раздел implementation добавьте описание этой процедуры:
procedure TPagesDlg.NewComboBox;
var i, j : integer;
begin
{Запоминаем активную позицию комбинированного списка }
j := ComboBoxl.Itemlndex;
{Очищаем комбинированный список}
ComboBox1. Clear;
for i := 1 to N do {Для всех N записей...}
{В обновленный комбинированный список добавляем
все фамилии из первого столбца таблицы}
ComboBoxl...Items.Add(StringGridl.Cells[0, I]);
{Переходим на позицию j}
ComboBoxl.Itemlndex := j;
end;
23. Сохраните работу, запустите программу, заполните таблицу данными и убедитесь в том, что программа правильно записывает на диск и считывает с диска файлы телефонных справочников.
24. Запрограммируйте команду главного меню «Сохранить изменения в списке записей».
procedure TPagesDlg.N6Click(Sender: Tobject); {Здесь N6 - номер • ганды «Записать в файл», у Вас может быть другой}
var i : integer;
begin
{Определяем номер активной записи}
i := ComboBoxl.Itemlndex + 1;
if PageControll.ActivePage=TabSheet2 then
begin {Если активная вторая страница}
StringGridl.Cells[0, i ] := Editl.Text;
{то вносим изменения в первую }
StringGridl.Cells[l, i] = Edit2.Text;
StringGridl.Cells[2, i] = EditS.Text;
StringGridl.Cells[3, i] = Edit4.Text;
end
{Иначе — вносим изменения во вторую страницу]
else NewEdit(ComboBoxl);
(В обоих случаях обновляем комбинированный список)
NewComboBox;
end;
25. Запрограммируйте кнопку перехода на предыдущую
запись
«Предыдущий».
procedure TpagesDlg.ButtonlClick(Sender: Tobject);
begin
if ComboBoxl.Itemlndex = 0 then
(Зацикливаем список)
ComboBoxl.Itemlndex := N-l
else
{В середине списка показатель уменьшается на единицу} ComboBoxl.Itemlndex := ComboBoxl.Itemlndex - 1;
{Обновляем панель «Найдена запись»}
NewEdit(ComboBox1);
end;
26. Аналогично запрограммируйте кнопку «Следующий».
Программный код созданной процедуры запишите в отчет.
27. Сохраните программу и убедитесь в правильности ее работы.
Запустите программу, считайте с диска файл телефонного справочника, выберите какую-то фамилию в комбинированном списке и поменяйте ее в поле редактирования «Фамилия». Убедитесь в том, что синхронные изменения происходят и в комбинированном списке. Сохраните изменения и используйте кнопки «Предыдущий» и «Следующий» для навигации по записям, убедитесь в зацикливании списка. Удалите одну запись кнопкой «Стереть», сохраните изменения и перейдите на первую страницу. Отредактируйте данные в таблице, сохраните справочник в файле на диске, просмотрите окно «О программе», закончите работу с программой.
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.