Создать приложение с использованием многостраничного блокнота.
Форма должна содержать две страницы (рис. 5.17, 5.18): 1) TabSheet1 –
«Список всех записей»; 2) TabSheet2 – «Редактирование и поиск записей».
Рис. 5.17. Вкладка Список всех записей
Рис. 5.18. Вкладка Редактирование и поиск записей
Расположите на 1-й странице компонент StringGrid, ширину и высоту
ячеек установите самостоятельно (не допускайте появления горизонталь-
ной полосы прокрутки). Фиксированный столбец в таблице удалите. Стра-
ницу «Редактирование и поиск записей» оформите с помощью компонен-
тов Label, Edit, ComboBox, Button, GroupBox в соответствии с рис. 5.18.
Добавьте на форму главное меню с командами в соответствии с рис. 5.17
(позже определим пункты Правка и О программе).
Рассмотрим пример базы данных для телефонного справочника. Опи-
шем глобальные переменные и типы данных программы: тип записи теле-
фонного справочника (info), файл записей (F), переменную типа info (r) и
целую переменную количества записей (n):
type
info=record {тип записей}
fam,im: string[20];
adr: string[100];
tel: string[15];
end;
var
PagesDlg: TPagesDlg; {Строка есть в заголовке модуля}
f: file of info; {Файл записей}
r: info; {Одна запись}
N: integer; {Количество записей}
Добавьте на форму два объекта: стандартные диалоги Windows для от-
крытия и сохранения файлов. Запрограммируйте процедуры открытия и
сохранения файлов базы данных (команды главного меню Прочитать из
файла и Записать в файл).
{процедура чтения из файла}
procedure TPagesDlg.N4Click(Sender: TObject);
var i: integer;
begin
if OpenDialog1.Execute then
begin
AssignFile(F,OpenDialog1.FileName);
Reset(F);
N:=0;
while not eof(f) do
begin
read(F,r);
stringGrid1.Cells[0,N+1]:=r.fam;
stringGrid1.Cells[1,N+1]:=r.im;
stringGrid1.Cells[2,N+1]:=r.adr;
stringGrid1.Cells[3,N+1]:=r.tel;
N:=N+1 {увеличение числа записей на 1}
end;
closeFile(F);
NewEdit(ComboBox1);{процедура заполняет поля редак-
тирования второй страницы формы}
NewCombobox {процедура заполняет комбиниро-
ванный список второй страницы}
end
end;
{процедура сохранения информации в файл}
procedure TPagesDlg.N5Click(Sender: TObject);
var i:integer;
begin
if SaveDialog1.Execute then
begin
AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
i:=1;
while stringGrid1.Cells[3,i]<>'' do
begin
r.fam:=stringGrid1.Cells[0,i];
r.im:=stringGrid1.Cells[1,i];
r.adr:=stringGrid1.Cells[2,i];
r.tel:=stringGrid1.Cells[3,i];
write(F,r);
i:=i+1
end;
closeFile(F)
end
end;
Напишите процедуру, задающую заголовки в таблице (шапку) при соз-
дании формы. В окне инспектора объектов активизируйте объект PagesDlg
(Окно формы с многостраничным блокнотом) и сгенерируйте событие
OnCreate (момент создания).
procedure TPagesDlg.FormCreate(Sender: TObject);
begin
stringGrid1.Cells[0,0]:='Фамилия';
stringGrid1.Cells[1,0]:='Имя';
stringGrid1.Cells[2,0]:='Адрес';
stringGrid1.Cells[3,0]:='Телефон';
ComboBox1.Items.Add('<'); {Создаем пустую строку в
комбинированном списке}
ComboBox1.ItemIndex:=0 {Активизируем эту строку на
случай создания нового справочника}
end;
Напишите процедуру заполнения полей редактирования NewEdit. Вы-
зов этой процедуры осуществляется в момент выбора фамилии для поиска,
то есть в момент смены активной строки в комбинированном списке. По-
этому для инициализации заготовки этой процедуры активизируйте собы-
тие OnChange (Момент замены) в инспекторе объектов для компонента
ComboBox и укажите название процедуры реакции на событие NewEdit.
Дважды щелкните мышью на введенном названии и заполните заготовку
этой процедуры следующим образом:
procedure TPagesDlg.NewEdit(Sender: TObject);
var i:integer; {номер строки данных в таблице}
begin
i:=ComboBox1.ItemIndex+1;
if i>0 then
begin {Для значащих позиций комбинированного списка
копируем данные i-записи с первой страницы фор-
мы в соответствующие поля на второй странице}
Edit1.Text:=StringGrid1.Cells[0,i];
Edit2.Text:=StringGrid1.Cells[1,i];
Edit3.Text:=StringGrid1.Cells[2,i];
Edit4.Text:=StringGrid1.Cells[3,i]
еnd
end;
Напишите процедуру заполнения комбинированного списка
NewComboBox. При описании типа класса (объекта) в разделе interface
добавьте декларацию procedure NewComboBox. В разделе implementation
добавьте описание этой процедуры:
procedure TPagesDlg.NewComboBox;
var i,j: integer;
begin
{Запоминаем активную позицию комбинированного списка}
j:=ComboBox1.ItemIndex;
ComboBox1.Clear; {очищаем список}
for i:=1 to n do
{Добавляем фамилии из первого столбца в обновленный список}
ComboBox1.Items.Add(StringGrid1.Cells[0,i]);
ComboBox1.ItemIndex:=j {Переходим на позицию j}
end;
Запрограммируйте команду меню «Сохранить изменения в списке за-
писей»:
procedure TPagesDlg.N11Click(Sender: TObject);
var i:integer;
begin
i:=ComboBox1.ItemIndex+1; {Номер активной записи}
if PageControl1.ActivePage=TabSheet2 then
begin {если активная вторая страница}
StringGrid1.Cells[0,i]:=Edit1.Text;
StringGrid1.Cells[1,i]:=Edit2.Text;
StringGrid1.Cells[2,i]:=Edit3.Text;
StringGrid1.Cells[3,i]:=Edit4.Text
end
else NewEdit(ComboBox1); {иначе вносим изменения во 2-ю
страницу}
NewComboBox {Обновляем список}
end;
Запрограммируйте переход на предыдущую запись:
procedure TPagesDlg.Button5Click(Sender: TObject);
begin
if ComboBox1.ItemIndex=0
then ComboBox1.ItemIndex:=N-1
else ComboBox1.ItemIndex:=ComboBox1.ItemIndex-1;
NewEdit(ComboBox1) {Обновляем панель «Найдена запись»}
end;
Аналогично запрограммируйте кнопку Следующий. Запрограммируем
кнопку Удалить так, чтобы после нажатия на нее удалялись данные из
панели Найдена запись и из комбинированного списка.
Запрограммируйте кнопку Найти так, чтобы на панели Найдена запись
отображалась вся информация о выбранном элементе списка (для данного
примера о лице, фамилия которого указана в поле редактирования Edit5
Введите фамилию). Если по данному запросу ничего не обнаружено, то
выведите сообщение об этом.
Программа полностью [БД междугородних разговоров]:
Скриншот:
Unit1.Pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ComCtrls, Grids, StdCtrls;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
MainMenu1: TMainMenu;
N1: TMenuItem;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
N2: TMenuItem;
N3: TMenuItem;
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
GroupBox1: TGroupBox;
Edit5: TEdit;
Button1: TButton;
Button2: TButton;
StringGrid2: TStringGrid;
Button3: TButton;
N6: TMenuItem;
N7: TMenuItem;
Button4: TButton;
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure Create_(Sender: TObject);
procedure NewEdit(Sender: TObject);
procedure NewComboBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
info=record {тип записей}
num:string[3];
data,tel,city,time: string[20];
end;
var
//PagesDlg: TPagesDlg; {Строка есть в заголовке модуля}
f: file of info; {Файл записей}
r: info; {Одна запись}
N: integer; {Количество записей}
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.N2Click(Sender: TObject);
{процедура чтения из файла}
var i: integer;
begin
if OpenDialog1.Execute then
begin
AssignFile(F,OpenDialog1.FileName);
Reset(F);
N:=0;
while not eof(f) do
begin
read(F,r);
stringGrid1.Cells[0,N+1]:=r.data;
stringGrid1.Cells[1,N+1]:=r.num;
stringGrid1.Cells[2,N+1]:=r.tel;
stringGrid1.Cells[3,N+1]:=r.city;
stringGrid1.Cells[4,N+1]:=r.time;
N:=N+1 {увеличение числа записей на 1}
end;
closeFile(F);
NewCombobox {процедура заполняет комбинированный список второй страницы}
end
end;
procedure TForm1.N3Click(Sender: TObject);
var i:integer;
begin
if SaveDialog1.Execute then
begin
AssignFile(F,SaveDialog1.FileName);
Rewrite(F);
i:=1;
while stringGrid1.Cells[3,i]<>'' do
begin
r.data:=stringGrid1.Cells[0,i];
r.num:=stringGrid1.Cells[1,i];
r.tel:=stringGrid1.Cells[2,i];
r.city:=stringGrid1.Cells[3,i];
r.time:=stringGrid1.Cells[4,i];
write(F,r);
i:=i+1
end;
closeFile(F)
end
end;
procedure TForm1.Create_(Sender: TObject);
begin
stringGrid1.Cells[0,0]:='Дата';
stringGrid1.Cells[1,0]:='Номер';
stringGrid1.Cells[2,0]:='Телефон';
stringGrid1.Cells[3,0]:='Город';
stringGrid1.Cells[4,0]:='Время';
stringGrid2.Cells[0,0]:='Дата';
stringGrid2.Cells[1,0]:='Номер';
stringGrid2.Cells[2,0]:='Телефон';
stringGrid2.Cells[3,0]:='Город';
stringGrid2.Cells[4,0]:='Время';
ComboBox1.Items.Add('<'); {Создаем пустую строку в комбинированном списке}
ComboBox1.ItemIndex:=0 {Активизируем эту строку на случай создания нового справочника}
end;
procedure TForm1.NewEdit(Sender: TObject);
var i,j,k:integer; {номер строки данных в таблице}
begin
k:=0;
for i:=0 to stringgrid2.RowCount-1 do
for j:=1 to stringgrid2.ColCount-1 do
stringgrid2.Cells[i,j]:='';
for i:=1 to N do
begin
if StringGrid1.Cells[3,i]=ComboBox1.Items[ComboBox1.ItemIndex]
then
begin
k:=k+1;
stringgrid2.Cells[0,k]:=stringgrid1.Cells[0,i];
stringgrid2.Cells[1,k]:=stringgrid1.Cells[1,i];
stringgrid2.Cells[2,k]:=stringgrid1.Cells[2,i];
stringgrid2.Cells[3,k]:=stringgrid1.Cells[3,i];
stringgrid2.Cells[4,k]:=stringgrid1.Cells[4,i];
end;
end;
end;
procedure Tform1.NewComboBox;
var i,j,k: integer; key:boolean;
begin
{Запоминаем активную позицию комбинированного списка}
j:=ComboBox1.ItemIndex;
ComboBox1.Clear; {очищаем список}
key:=true;
for i:=1 to n do
begin
for k:=0 to combobox1.Items.Count-1 do
if ComboBox1.Items[k]=StringGrid1.Cells[3,i] then
key:=false;
if key=true then ComboBox1.Items.Add(StringGrid1.Cells[3,i]);
key:=true;
end;
ComboBox1.ItemIndex:=j {Переходим на позицию j}
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if ComboBox1.ItemIndex=0
then ComboBox1.ItemIndex:=N-1
else ComboBox1.ItemIndex:=ComboBox1.ItemIndex-1;
NewEdit(ComboBox1) {Обновляем панель «Найдена запись»}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if ComboBox1.ItemIndex=N-1
then ComboBox1.ItemIndex:=0
else ComboBox1.ItemIndex:=ComboBox1.ItemIndex+1;
NewEdit(ComboBox1) {Обновляем панель «Найдена запись»}
end;
procedure TForm1.Button3Click(Sender: TObject);
var i,j,k:integer; {номер строки данных в таблице}
begin
if Edit5.Text='' then begin showmessage('Введите строку для поиска');exit;end;
k:=0;
for i:=0 to stringgrid2.RowCount-1 do
for j:=1 to stringgrid2.ColCount-1 do
stringgrid2.Cells[i,j]:='';
for i:=1 to N do
begin
if StringGrid1.Cells[3,i]=Edit5.Text
then
begin
k:=k+1;
stringgrid2.Cells[0,k]:=stringgrid1.Cells[0,i];
stringgrid2.Cells[1,k]:=stringgrid1.Cells[1,i];
stringgrid2.Cells[2,k]:=stringgrid1.Cells[2,i];
stringgrid2.Cells[3,k]:=stringgrid1.Cells[3,i];
stringgrid2.Cells[4,k]:=stringgrid1.Cells[4,i];
end;
end;
if stringgrid2.Cells[0,1]='' then Showmessage('Ничего не найдено');
end;
procedure TForm1.N7Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Button4Click(Sender: TObject);
var i,j:integer; s:string;
begin
s:=combobox1.Text;
for i:=0 to stringgrid2.RowCount-1 do
for j:=1 to stringgrid2.ColCount-1 do
stringgrid2.Cells[i,j]:='';
for i:=0 to Combobox1.Items.Count do
begin
if Combobox1.Items[i]=s then Combobox1.DeleteSelected;
end;
end;
end.
unit1.dfm
object Form1: TForm1
Left = 203
Top = 122
Width = 545
Height = 336
Caption = #1041#1044' '#1084#1077#1078#1076#1091#1075#1086#1088#1086#1076#1085#1080#1093' '#1088#1072#1079#1075#1086#1074#1086#1074
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = False
OnCreate = Create_
PixelsPerInch = 96
TextHeight = 13
object PageControl1: TPageControl
Left = 0
Top = 0
Width = 537
Height = 282
ActivePage = TabSheet1
Align = alClient
TabOrder = 0
object TabSheet1: TTabSheet
Caption = #1057#1087#1080#1089#1086#1082' '#1074#1089#1077#1093' '#1079#1072#1087#1080#1089#1077#1081
object StringGrid1: TStringGrid
Left = 0
Top = 0
Width = 529
Height = 254
Align = alClient
FixedCols = 0
RowCount = 20
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]
TabOrder = 0
end
end
object TabSheet2: TTabSheet
Caption = #1055#1088#1086#1089#1084#1086#1090#1088' '#1087#1086' '#1075#1086#1088#1086#1076#1072#1084
ImageIndex = 1
OnShow = NewEdit
object ComboBox1: TComboBox
Left = 48
Top = 8
Width = 145
Height = 21
ItemHeight = 13
TabOrder = 0
Text = 'ComboBox1'
OnChange = NewEdit
end
object GroupBox1: TGroupBox
Left = 0
Top = 40
Width = 521
Height = 177
Caption = ' '#1053#1072#1081#1076#1077#1085#1085#1099#1077' '#1079#1072#1087#1080#1089#1080' '
TabOrder = 1
object StringGrid2: TStringGrid
Left = 2
Top = 15
Width = 517
Height = 160
Align = alClient
FixedCols = 0
TabOrder = 0
end
end
object Edit5: TEdit
Left = 232
Top = 8
Width = 121
Height = 21
TabOrder = 2
end
object Button1: TButton
Left = 0
Top = 224
Width = 75
Height = 25
Caption = #1055#1088#1077#1076#1099#1076#1091#1097#1080#1081
TabOrder = 3
OnClick = Button1Click
end
object Button2: TButton
Left = 80
Top = 224
Width = 75
Height = 25
Caption = #1057#1083#1077#1076#1091#1102#1097#1080#1081
TabOrder = 4
OnClick = Button2Click
end
object Button3: TButton
Left = 160
Top = 224
Width = 75
Height = 25
Caption = #1085#1072#1081#1090#1080
TabOrder = 5
OnClick = Button3Click
end
object Button4: TButton
Left = 248
Top = 224
Width = 75
Height = 25
Caption = #1059#1076#1072#1083#1080#1090#1100
TabOrder = 6
OnClick = Button4Click
end
end
end
object MainMenu1: TMainMenu
Left = 472
Top = 32
object N1: TMenuItem
Caption = #1060#1072#1081#1083
object N2: TMenuItem
Caption = #1055#1088#1086#1095#1080#1090#1072#1090#1100' '#1080#1079' '#1092#1072#1081#1083#1072
OnClick = N2Click
end
object N3: TMenuItem
Caption = #1047#1072#1087#1080#1089#1072#1090#1100' '#1074' '#1092#1072#1081#1083
OnClick = N3Click
end
object N6: TMenuItem
Caption = '-'
end
object N7: TMenuItem
Caption = #1042#1099#1093#1086#1076
OnClick = N7Click
end
end
end
object OpenDialog1: TOpenDialog
Left = 468
Top = 64
end
object SaveDialog1: TSaveDialog
Left = 476
Top = 104
end
end
|