четверг, 8 августа 2019 г.

Turbo Delphi 11

1. Реализовать телефонный справочник с возможностью сохранения данных в типизированный файл (<имя программы>.dat), расположенного в папке с программой, и чтения из него. Реализовать сохранение данных о размере и положении окна программы в файл инициализации (<имя программы>.ini) при выходе и загрузки данных настроек при запуске.
1) Создайте папку под новый проект.
2) Создайте новый проект и сохраните его в созданную папку.
3) Оформите внешний вид окна: задайте заголовок «Телефонный справочник» (Caption), размеры (Width, Height), позицию / положение (Position / Top, Left) формы.
4) Разместите на форме следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Список изображенийImageList (Win32) Name = ilMain
Height = 24
Width = 24
Менеджер действийActionManager (Additional)Name = amMain
Images = ilMain
Главное меню для действийActionMainMenuBarName = ammMain
ActionManager = amMain
Панель инструментов для действий ActionToolBar (Additional)Name = atbMain
ActionManager = amMain
ShowHint = True
Контекстное меню для действийPopupActionBar (Additional)Name = pabMain
Таблицу строкStringGrid (Additional)Name = sgrMain
Align = alClient
ColCount = 3
DefaultColWidth = 170
DefaultRowHeight = 20
FixedCols = 0
RowCount = 2
Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]
PopupMenu = pabMain

5) Заполните хранилище изображений ImageList изображениями для действий, указанных ниже.
6) Для работы с файлами инициализации подключите модуль IniFiles в разделе подключения библиотек uses.
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ActnCtrls, Menus, ActnPopup, ToolWin, ActnMan, ActnMenus,
XPStyleActnCtrls, ActnList, ImgList, IniFiles;
7) В разделе описания типов, опишите тип-запись для компонент типизированного файла, включающий поля для хранения ФИО, адреса и телефона.
type
TAbonent = record
FIO: string[30];
Address: string[30];
Phone: string[20];
end;
TfrmMain = class(TForm)
...
8) Откройте окно менеджера действий ActionManager и добавьте следующие пользовательские действия (Ins):
ДействиеЗначения свойствОбработчик
ВыходName = acClose
Category = 'Файл'
Caption = 'Выход'
Hint = 'Выход'
ImageIndex = иконка
ShortCut = Ctrl+Q
procedure TfrmMain.acCloseExecute(Sender: TObject);
begin
Close
end;
ДобавитьName = acAdd
Category = 'Данные'
Caption = 'Добавить'
Hint = 'Добавить'
ImageIndex = иконка
ShortCut = Ctrl+N
procedure TfrmMain.acAddExecute(Sender: TObject);
begin
sgrMain.RowCount := sgrMain.RowCount+1;
end;
УдалитьName = acDel
Category = 'Данные'
Caption = 'Удалить'
Hint = 'Удалить'
ImageIndex = иконка
ShortCut = Ctrl+Y
procedure TfrmMain.acDelExecute(Sender: TObject);
begin
if sgrMain.RowCount>2 then
sgrMain.RowCount := sgrMain.RowCount-1;
end;
ЗагрузитьName = acLoad
Category = 'Файл'
Caption = 'Загрузить'
Hint = 'Загрузить'
ImageIndex = иконка
ShortCut = Ctrl+O




procedure TfrmMain.acLoadExecute(Sender: TObject);
var
f: File of TAbonent;
tmp: TAbonent;
s: string;
i: integer;
begin
if Application.MessageBox('Загрузить данные?', 'Загрузка',MB_YESNO+MB_ICONWARNING)=ID_NO then
exit;
s := ChangeFileExt(Application.ExeName, '.dat');
if not FileExists(s) then
begin
Application.MessageBox('Файл с данными не найден!', 'Открытие', MB_OK+MB_ICONERROR);
exit;
end;
AssignFile(f, s);
Reset(f);
i := 0;
while not eof(f) do
begin
read(f, tmp);
inc(i);
sgrMain.Cells[0,i] := tmp.FIO;
sgrMain.Cells[1,i] := tmp.Address;
sgrMain.Cells[2,i] := tmp.Phone;
end;
sgrMain.RowCount := i;
CloseFile(f);
Application.MessageBox(PChar('Считано '+IntToStr(i-1)+' записей.'), 'Открытие', MB_OK+MB_ICONINFORMATION);
end;
СохранитьName = acSave
Category = 'Файл'
Caption = 'Сохранить'
Hint = 'Сохранить'
ImageIndex = иконка
ShortCut = Ctrl+S




procedure TfrmMain.acSaveExecute(Sender: TObject);
var
f: File of TAbonent;
tmp: TAbonent;
s: string;
i,n: integer;
begin
if Application.MessageBox('Сохранить данные?', 'Сохранение',MB_YESNO+MB_ICONWARNING)=ID_NO then
exit;
s := ChangeFileExt(Application.ExeName, '.dat');
AssignFile(f, s);
ReWrite(f);
n := sgrMain.RowCount;
for i := 1 to n do
begin
tmp.FIO := sgrMain.Cells[0,i];
tmp.Address := sgrMain.Cells[1,i];
tmp.Phone := sgrMain.Cells[2,i];
write(f, tmp);
end;
CloseFile(f);
Application.MessageBox('Запись данных окончена', 'Открытие', MB_OK+MB_ICONINFORMATION);
end;
О программе…Name = acAbout
Category = 'Справка'
Caption = 'О программе...'
Hint = 'О программе...'
ImageIndex = иконка
procedure TfrmMain.acAboutExecute(Sender: TObject);
begin
Application.MessageBox('Автор: Баночкин Ф.Б.', 'Телефонный справочник', MB_OK+MB_ICONINFORMATION);
end;

9) Оформите форму следующим образом:
10) Для организации ввода по шаблону в колонку с телефоном создайте обработчик получения маски ввода (onGetEditMask):
procedure TfrmMain.sgrMainGetEditMask(Sender: TObject; ACol, ARow: Integer;
var Value: string);
begin
if ACol=2 then
Value := '9-99-99';
end;
11) Для реализации сохранения/загрузки настроек окна программы создайте обработчики на создания (onCreate) и уничтожения (onDestroy) главной формы:
procedure TfrmMain.FormCreate(Sender: TObject);
var
ini: TIniFile;
s: string;
begin
sgrMain.Cells[0,0] := 'ФИО';
sgrMain.Cells[1,0] := 'Адрес';
sgrMain.Cells[2,0] := 'Телефон';
s := ChangeFileExt(Application.ExeName, '.ini');
ini := TIniFile.Create(s);
try
frmMain.Left := ini.ReadInteger('POSITION','LEFT',100);
frmMain.Top := ini.ReadInteger('POSITION','TOP',100);
frmMain.Width := ini.ReadInteger('SIZE','WIDTH',400);
frmMain.Height := ini.ReadInteger('SIZE','HEIGHT',300);
finally
ini.Free;
end;
end;
procedure TfrmMain.FormDestroy(Sender: TObject);
var
ini: TIniFile;
s: string;
begin
s := ChangeFileExt(Application.ExeName, '.ini');
s := ChangeFileExt(Application.ExeName, '.ini');
ini := TIniFile.Create(s);
try
ini.WriteInteger('POSITION','LEFT',frmMain.Left);
ini.WriteInteger('POSITION','TOP',frmMain.Top);
ini.WriteInteger('SIZE','WIDTH',frmMain.Width);
ini.WriteInteger('SIZE','HEIGHT',frmMain.Height);
finally
ini.Free;
end;
end;
12) Откройте двойным щелчком контекстное меню PopupActionBar (или через пункт контекстного меню «Menu Designer…») и настройте контекстное меню путем выбора для пунктов соответствующих действий в свойстве Action.
13) Сохраните проект и запустите программу на исполнение.
2. Сформировать типизированный файл целых чисел с произвольным количеством. Считать данные из файла и определить: количество чисел в файле, минимальное и максимальное значения, сумму, произведение и среднее арифметическое всех чисел.
1) Создайте папку под новый проект.
2) Создайте новый проект и сохраните его в созданную папку.
3) Оформите внешний вид окна: задайте заголовок «Числа» (Caption), размеры (Width, Height), позицию / положение (Position / Top, Left) формы.
4) Разместите на форме следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
ФормаГлавная форма Name = frmMain
Caption = 'Числа'
Constraints.MinHeight = 350
Constraints.MinWidth = 440
Position = poScreenCenter

ПанельPanel (Standard)Name = pnlMain
Align = alRight
Панель со страницами (вкладкам)PageControl (Win32)Name = pgcMain
Align = alClient
Диалог сохранения файлаSaveDialog (Dialogs)Name = sdMain
DefaultExt = 'dat'
Filter = 'Файлы с данными (*.dat)|*.dat|Все файлы (*.*)|*.*'

Диалог открытия файлаOpenDialog (Dialogs)Name = odMain
DefaultExt = 'dat'
Filter = 'Файлы с данными (*.dat)|*.dat|Все файлы (*.*)|*.*'

5) В панели со страницами (PageControl) создайте две страницы: щелкните правой кнопкой мыши на компоненте PageControl и выполните команду контекстного меню «New Page». Задайте страницам свойства:
НазваниеКомпонентЗначения свойств
Страница панели TabSheet Name = tsh1
Caption = 'Числа'
Страница панели TabSheet Name = tsh2: TTabSheet
Caption = 'Итоги'

6) На панели (Panel) разместите следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Кнопка с изображениемBitBtn (Additional)Name = bbtSave
Caption = 'сгенерировать'
Glyph = иконка
Layout = blGlyphTop
Кнопка с изображениемBitBtn (Additional)Name = bbtLoad
Caption = 'считать'
Glyph = иконка
Layout = blGlyphTop
Кнопка с изображениемBitBtn (Additional)Name = bbtClose
Anchors = [akLeft, akBottom]
Caption = 'выход'
Glyph = иконка
Layout = blGlyphTop

Кнопка с изображениемBitBtn (Additional)Name = bbtAbout
Anchors = [akLeft, akBottom]
Caption = 'о программе...'
Glyph = иконка
Layout = blGlyphTop

7) На первой странице панели со страницами (PageControl) разместите следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Список ListBox (Standard)Name = lbNumbers
Align = alClient
Columns = 10

8) На второй странице панели со страницами (PageControl) разместите следующие компоненты и задайте им свойства:
НазваниеКомпонентЗначения свойств
Список редактируемых значений ValueListEditor (Additional)Name = vleResult
Align = alClient
TitleCaptions.Strings = 'Параметр', 'Значение'

9) Оформите форму следующим образом:
10) Создайте обработчики нажатий (onClick) соответствующих кнопок:
procedure TfrmMain.bbtCloseClick(Sender: TObject);
begin
Close
end;
procedure TfrmMain.bbtLoadClick(Sender: TObject);
var
f: File of Integer;
n,i,min,max: integer;
s,p: longint;
begin
if not odMain.Execute then
exit
else
if not FileExists(odMain.FileName) then
exit;
AssignFile(f, odMain.FileName);
Reset(f);
lbNumbers.Clear;
i := 0;
if eof(f) then
begin
Application.MessageBox(PChar('Файл "'+odMain.FileName+'" пуст.'), 'Чтение из файла',MB_OK+MB_ICONINFORMATION);
exit;
end;
vleResult.Values['Файл'] := odMain.FileName;
vleResult.Values['Количество'] := IntToStr(FileSize(f));
read(f, n);
min := n;
max := n;
s := n;
p := n;
while not eof(f) do
begin
read(f, n);
inc(i);
s := s+n;
p := p*n;
if n<min then
min := n
else
if n>max then
max := n;
lbNumbers.Items.Add(IntToStr(n));
end;
CloseFile(f);
vleResult.Values['Минимальное'] := IntToStr(min);
vleResult.Values['Максимальное'] := IntToStr(max);
vleResult.Values['Сумма'] := IntToStr(s);
vleResult.Values['Произведение'] := IntToStr(p);
vleResult.Values['Среднее арифметическое'] := FloatToStr(s/i);
pgcMain.TabIndex := 1;
Application.MessageBox(PChar('Из файла "'+odMain.FileName+'" считано '+IntToStr(i)+' записей.'), 'Чтение из файла',MB_OK+MB_ICONINFORMATION)
end;
procedure TfrmMain.bbtSaveClick(Sender: TObject);
var
f: File of Integer;
n,i: integer;
begin
if not sdMain.Execute then
exit;
randomize;
AssignFile(f, sdMain.FileName);
ReWrite(f);
n := random(1000);
while n>0 do
begin
i := random(101)-50;
write(f, i);
dec(n);
end;
CloseFile(f);
Application.MessageBox(PChar('Запись чисел в файл "'+sdMain.FileName+'" окончена.'), 'Запись в файл',MB_OK+MB_ICONINFORMATION)
end;
procedure TfrmMain.bbtAboutClick(Sender: TObject);
begin
Application.MessageBox('Автор: Баночкин Ф.Б.', 'Числа',MB_OK+MB_ICONINFORMATION)
end;
11) Создайте обработчик создания формы (onCreate) и пропишите в нем добавление параметров списка редактируемых значений.
procedure TfrmMain.FormCreate(Sender: TObject);
begin
vleResult.InsertRow('Файл','-',True);
vleResult.InsertRow('Количество','-',True);
vleResult.InsertRow('Минимальное','-',True);
vleResult.InsertRow('Максимальное','-',True);
vleResult.InsertRow('Сумма','-',True);
vleResult.InsertRow('Произведение','-',True);
vleResult.InsertRow('Среднее арифметическое','-',True);
end;
12) Сохраните проект и запустите программу на исполнение.

Комментариев нет:

Отправить комментарий