
Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, ExtCtrls, THardwareDef, TStoreDef, FileWork, StdCtrls,
Globals, DiagramForm, PlotForm, EditForm;
type
TfrmMain = class(TForm)
paView: TPanel;
sgrView: TStringGrid;
paControls: TPanel;
btnAdd: TButton;
btnEdit: TButton;
btnDelete: TButton;
btnSave: TButton;
paMaxPrice: TPanel;
laedMaxPrice: TLabeledEdit;
btnSelectByPrice: TButton;
btnRefresh: TButton;
paMemory: TPanel;
laedMinMem: TLabeledEdit;
btnSelectByMem: TButton;
laedMinHard: TLabeledEdit;
btnGraph: TButton;
btnExit: TButton;
procedure FormCreate(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure btnDeleteClick(Sender: TObject);
procedure btnAddClick(Sender: TObject);
procedure btnEditClick(Sender: TObject);
procedure btnSelectByPriceClick(Sender: TObject);
procedure btnRefreshClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnSelectByMemClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure btnGraphClick(Sender: TObject);
private
procedure InitDatabase;
procedure Save;
procedure InitGrid;
procedure FillGrid(base: TStore);
function SelectByPrice(base: TStore; maxprice:real): TStore;
function SelectByMem(base: TStore; minmem:integer): TStore;
function SelectByHard(base: TStore; minhard:integer): TStore;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.InitDatabase;
begin
try
ReadFile('Store.dat', dbase);
except
dbase := TStore.Create;
end;
end;
procedure TfrmMain.Save;
begin
WriteFile('Store.dat', dbase);
end;
procedure TfrmMain.InitGrid;
var
i: integer;
begin
with sgrView do
begin
RowCount := 2;
for i:= 0 to ColCount - 1 do
cells[i,1] := '';
end;
end;
procedure TfrmMain.FillGrid(base: TStore);
var
i: integer;
begin
if not (dbase.GetElement(0) = nil) then
begin
with sgrView do
begin
InitGrid;
for i := 0 to base.GetMaxIndex do
begin
cells[0,i+1] := IntToStr(i+1);
cells[1,i+1] := base.GetElement(i).CPU;
cells[2,i+1] := IntToStr(base.GetElement(i).Memory);
cells[3,i+1] := IntToStr(base.GetElement(i).HDD);
cells[4,i+1] := FloatToStr(base.GetElement(i).Price);
RowCount := RowCount + 1;
end;
if (RowCount>2) then RowCount := RowCount - 1;
end;
end;
end;
function TfrmMain.SelectByPrice(base: TStore; maxprice: real): TStore;
var
i: integer;
hw: THardware;
begin
result := TStore.Create;
hw := THardware.Create;
for i := 0 to base.GetMaxIndex do
begin
hw := base.GetElement(i);
if (maxprice >= hw.Price) then
result.Add(hw);
end;
end;
function TfrmMain.SelectByMem(base: TStore; minmem: integer): TStore;
var
i: integer;
hw: THardware;
begin
result := TStore.Create;
hw := THardware.Create;
for i := 0 to base.GetMaxIndex do
begin
hw := base.GetElement(i);
if (minmem <= hw.Memory) then
result.Add(hw);
end;
end;
function TfrmMain.SelectByHard(base: TStore; minhard: integer): TStore;
var
i: integer;
hw: THardware;
begin
result := TStore.Create;
hw := THardware.Create;
for i := 0 to base.GetMaxIndex do
begin
hw := base.GetElement(i);
if (minhard <= hw.HDD) then
result.Add(hw);
end;
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
InitDatabase;
with sgrView do
begin
cells[0,0] := '№п/п';
cells[1,0] := 'Тип процессора';
cells[2,0] := 'Память (Мб)';
cells[3,0] := 'Жёсткий диск (Гб)';
cells[4,0] := 'Цена (руб)';
end;
FillGrid(dbase);
end;
procedure TfrmMain.btnSaveClick(Sender: TObject);
begin
Save;
end;
procedure TfrmMain.btnDeleteClick(Sender: TObject);
var
btn: integer;
begin
btn := MessageDlg('Удалить выделенную запись?', mtConfirmation,
[mbYes, mbNo], 0);
if btn = mrYes then
begin
dbase.Delete(StrToInt(sgrView.cells[0,sgrView.Row])-1);
FillGrid(dbase);
end;
end;
procedure TfrmMain.btnAddClick(Sender: TObject);
var
mr: integer;
hw: THardware;
begin
hw := THardware.Create('',0,0,0);
frmEdit := TfrmEdit.Create(frmMain, -1, hw);
mr := frmEdit.ShowModal;
FillGrid(dbase);
end;
procedure TfrmMain.btnEditClick(Sender: TObject);
var
mr: integer;
hw: THardware;
err: boolean;
begin
with sgrView do
hw := THardware.Create(dbase.GetElement(Row-1));
frmEdit := TfrmEdit.Create(frmMain, sgrView.Row-1, hw);
mr := frmEdit.ShowModal;
Save;
dbase.Destroy(err);
InitDatabase;
FillGrid(dbase);
end;
procedure TfrmMain.btnSelectByPriceClick(Sender: TObject);
var
mprice: real;
selection: TStore;
begin
try
mprice := StrToFloat(laedMaxPrice.Text);
selection := TStore.Create();
selection := SelectByPrice(dbase, mprice);
FillGrid(selection);
except
ShowMessage('Введены некорректные данные!');
end;
end;
procedure TfrmMain.btnRefreshClick(Sender: TObject);
begin
FillGrid(dbase);
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
try
Save;
except
end;
end;
procedure TfrmMain.btnSelectByMemClick(Sender: TObject);
var
mmem, mhard: integer;
selection: TStore;
begin
try
mmem := StrToInt(laedMinMem.Text);
selection := TStore.Create();
selection := SelectByMem(dbase, mmem);
if not (laedMinHard.Text = '') then
begin
mhard := StrToInt(laedMinHard.Text);
selection := SelectByHard(selection, mhard);
end;
FillGrid(selection);
except
ShowMessage('Введены некорректные данные!');
end;
end;
procedure TfrmMain.btnExitClick(Sender: TObject);
begin
frmMain.Close;
end;
procedure TfrmMain.btnGraphClick(Sender: TObject);
begin
frmDiagram.Show;
frmPlot.Show;
end;
end.
Результаты тестирования:
Вывод:
Для приведённого выше набора данных программа выполняется корректно на всех этапах.