procedure FormCreate (Sender: TObject);
procedure LoadButtonClick (Sender: TObject);
procedure SaveButtonClick (Sender: TObject);
procedure PageControl1Change (Sender: TObject);
procedure AddBtnClick (Sender: TObject);
procedure SGDblClick (Sender: TObject);
procedure DelBtnClick (Sender: TObject);
procedure SortBtnClick (Sender: TObject);
procedure KSpinEditChange (Sender: TObject);
procedure MSpinEditChange (Sender: TObject);
procedure SGKeyPress (Sender: TObject; var Key: Char);
procedure FormDestroy (Sender: TObject);
procedure CopyBtnClick (Sender: TObject);
procedure FindBtnClick (Sender: TObject);
procedure FButtonClick (Sender: TObject);
private
{Private declarations}
public
{Public declarations}
//Fz: file of TVector; // Файл типа запись
KPod, M: integer; // Количество подъездов и этажей
People: TVector; // Вектор – члены семей ГК
GK: TVector; // Вектор – главные квартиросъемщики
Scheme: TVector; // Вектор – СХЕМА
FlatAtr: TVector; // Вектор – Атрибуты квартир
KVART: TVector; // Вектор – КВАРТ
Ft: TextFile; // Текстовой файл
FileNameT: string[200]; // Имя файла
FSGVector: array [1..10] of TStringGrid;
procedure FillStringGrid (SG: TStringGrid; Vec: TVector);
function GetVec: TVector;
procedure ReadVec (var Vec: TVector);
procedure WriteVec (Vec: TVector); // Запись вектора в файл
end;
var
InputForm: TInputForm;
Implementation
{$R *.DFM}
procedure TInputForm. FormCreate (Sender: TObject);
begin
KPod:=2; M:= 3;
// –
Kvart:= TVector. Create;
Kvart. Cols:= 7;
Kvart. Names[1]:= 'Номер квартиры';
Kvart. Names[2]:= 'число комнат';
Kvart. Names[3]:= 'номер этажа';
Kvart. Names[4]:= 'жилая площадь (кв. м.)';
Kvart. Names[5]:= 'общая площадь (кв. м.)';
Kvart. Names[6]:= 'стоимость квартиры';
Kvart. Names[7]:= 'Приват.';
// –
Scheme:= TVector. Create;
Scheme. Cols:= 4;
Scheme. Names[1]:= 'Кв. 1';
Scheme. Names[2]:= 'Кв. 2';
Scheme. Names[3]:= 'Кв. 3';
Scheme. Names[4]:= 'Кв. 4';
// –
GK:= TVector. Create;
GK. Cols:= 8;
GK. Names[1]:= 'Номер Квартиры';
GK. Names[2]:= 'Фамилия';
GK. Names[3]:= 'Имя';
GK. Names[4]:= 'Отчество';
GK. Names[5]:= 'Год рождения';
GK. Names[6]:= 'Место работы';
GK. Names[7]:= 'Льготы';
GK. Names[8]:= 'Долг (тыс. руб.)';
// –
// 1.5. Таблица А содержит список жильцов – членов семей главных квартиросъемщиков:
// 1) фамилия,
// 2) родственное отношение к ГК (мать / отец/муж/жена / дочь/сын),
// 3) номер квартиры,
// 4) признак «пенсионер / учащийся / работает / дошкольник».
People:= TVector. Create;
People. Cols:= 4;
People. Names[1]:= 'Фамилия';
People. Names[2]:= 'Родств.отн-ние';
People. Names[3]:= 'Номер квартиры';
People. Names[4]:= 'Признак';
People. Names[5]:= 'Место работы';
People. Names[6]:= 'Льготы';
People. Names[7]:= 'Долг (тыс. руб.)';
// 1.6. Таблица С содержит следующие атрибуты квартир (в соответствии с числом комнат):
// 1) число комнат,
// 2) месячная квартплата,
// 3) площадь первой комнаты (кв. м.),
// 4) площадь второй комнаты (если она есть),
// 5) площадь третьей комнаты,
// 6) площадь четвертой комнаты,
// 7) площадь коридора,
// 8) площадь кухни,
// 9) общая площадь туалета и ванной комнаты.
FlatAtr:= TVector. Create;
FlatAtr. Cols:= 9;
FlatAtr. Names[1]:= 'Числокомн.';
FlatAtr. Names[2]:= 'Квартплата';
FlatAtr. Names[3]:= 'Пл.ком. №1';
FlatAtr. Names[4]:= 'Пл.ком. №2';
FlatAtr. Names[5]:= 'Пл.ком. №3';
FlatAtr. Names[6]:= 'Пл.ком. №4';
FlatAtr. Names[7]:= 'Пл.коридора';
FlatAtr. Names[8]:= 'Пл.кухни';
FlatAtr. Names[9]:= 'Пл.туалета';
// –
PageControl1Change(Sender);
FSGVector[1]:= StringGrid1;
FSGVector[2]:= StringGrid2;
FSGVector[3]:= StringGrid3;
FSGVector[4]:= StringGrid4;
FSGVector[5]:= StringGrid5;
end;
procedure TInputForm. ReadVec (var Vec: TVector);
var
x, i, j: integer;
St: String;
begin
Readln (Ft, x); Vec. Cols:= x;
for i:=1 to Vec. Cols do
begin Readln (Ft, St); Vec. Names[i]:= St; end;
Readln (Ft, x); Vec. Size:= x;
for i:=1 to Vec. Size do
begin
for j:=1 to Vec. Cols do
begin Readln (Ft, St); Vec.X [i, j]:= St; end;
end;
Vec. SortId:= 1;
Vec. SortMode:= 1;
end;
procedure TInputForm. WriteVec (Vec: TVector);
var i, j: integer;
begin
Writeln (Ft, Vec. Cols);
for i:=1 to Vec. Cols do
Writeln (Ft, Vec. Names[i]);
Writeln (Ft, Vec. Size);
for i:=1 to Vec. Size do
begin
for j:=1 to Vec. Cols do
Writeln (Ft, Vec.X [i, j]);
end;
end;
// Чтение данных из файла
procedure TInputForm. LoadButtonClick (Sender: TObject);
begin
OpenDialog1. Title:= 'Открыть из файла'; // Изменение заголовка окна диалога
if not OpenDialog1. Execute then exit;
FileNameT:= OpenDialog1. FileName; // Возвращение имени дискового файла
AssignFile(Ft, FileNameT); // Связывание файловой переменной Fz с именем файла
Reset(Ft); // Открытие существующего файла
ReadVec(Kvart); // Чтение вектора из файла
ReadVec(Scheme);
ReadVec(GK);
ReadVec(People);
ReadVec(FlatAtr);
PageControl1Change(Sender);
CloseFile(Ft);
end;
procedure TInputForm. SaveButtonClick (Sender: TObject);
begin
ifnotSaveDialog1. Executethenexit;
begin
FileNameT:= SaveDialog1. FileName; // Возвращение имени дискового файла
AssignFile(Ft, FileNameT); // Связывание файловой переменной Fz с именем файла
{$I-}
Rewrite(Ft); // Открытие нового файла
{$I+}
if not((IOResult = 0) and (FileNameT <> «)) then
begin
Application. MessageBox ('Не возможно открыть файл!', 'Ошибка', MB_OK);
exit;
end;
end;
WriteVec(Kvart); // Запись в файл
WriteVec(Scheme);
WriteVec(GK);
WriteVec(People);
WriteVec(FlatAtr);
CloseFile(Ft); // Закрытие файла
end;
// Процедура заполнения объекта StringGrid данными из Вектора Vec
procedure TInputForm. FillStringGrid (SG: TStringGrid; Vec: TVector);
var i, j: integer;
begin
Sg. ColCount:= Vec. Cols+1;
if Vec. Size=0
then Sg. RowCount:=2
else Sg. RowCount:=Vec. Size+1;
for i:=1 to Vec. Cols do
Sg. Cells [i, 0]:= Vec. Names[i];
for i:=1 to Vec. Size do
begin
Sg. Cells [0, i]:= IntToStr(i);
for j:=1 to Vec. Cols do
Sg. Cells [j, i]:= Vec.X [i, j];
end;
Sg. ColWidths[0]:= 25;
end;
procedure TInputForm. PageControl1Change (Sender: TObject);
begin
case PageControl1. ActivePageIndex of
0: FillStringGrid (StringGrid1, Kvart);
1: FillStringGrid (StringGrid2, Scheme);
2: FillStringGrid (StringGrid3, GK);
3: FillStringGrid (StringGrid4, People);
4: FillStringGrid (StringGrid5, FlatAtr);
end;
end;
procedure TInputForm. AddBtnClick (Sender: TObject);
var
SG: TStringGrid;
Vec: TVector;
begin
Sg:= FSGVector [PageControl1. ActivePageIndex+1];
Vec:= GetVec;
Vec. Add;
FillStringGrid (SG, Vec);
end;
procedure TInputForm.SGDblClick (Sender: TObject);
var
NRooms, NKv, NKvart, NPod, NFloor: integer;
porch: array [0..MaxN] of integer;
SG: TStringGrid;
Vec: TVector;
i, j, x, k, l: integer;
InputString: String;
begin
Sg:= TStringGrid(Sender);
i:= Sg. Selection. Left;
j:= Sg. Selection. Top;
Vec:= GetVec;
if (i<1) then exit; // Запределамиредактирования
if (Sg. Name = 'StringGrid1') and (i in [2,3,4,5]) then
begin
Application. MessageBox(
'Это поле заполняется автоматически по номеру квартиры и не редактируется!'
'Ошибка', MB_OK);
exit;
end;
InputString:= InputBox ('', 'Введите значение', Vec.X [j, i]);
if InputString=''
then exit;
SG. Cells [i, j]:= InputString;
Vec.X [j, i]:= InputString;
if (Sg. Name = 'StringGrid1') and (i = 1) then
begin
NKvart:= Vec.X [j, i];
porch[0]:= 0; x:= 0;
for i:=1 to Scheme. Size do
begin
porch[i]:= 2;
if Scheme.X [i, 3]=''
then porch[i]:= 2
else if Scheme.X [i, 4]=''
then porch[i]:= 3 else porch[i]:=4;
if NKvart <= x + (porch[i]*M) then
begin
NPod:= i; // Определили номер подъезда
NFloor:= (NKvart-x) divM +1; // Определили номер этажа
NKv:= (NKvart-x) modM; // Определили номер кв. на этаже
if NKv=0
then NKv:= M;
NRooms:= Scheme.X[i, NKv]; // Определили кол-во комнат
// Запишем количество комнат в квартире
SG. Cells[2, j]:= IntToStr(NRooms); Vec.X[j, 2]:= NRooms;
// Запишем номер этажа
SG. Cells[3, j]:= IntToStr(NFloor); Vec.X[j, 3]:= NFloor;
for k:=1 to FlatAtr. Size do
begin
if FlatAtr.X [i, 1]= NRooms then // совпадает количество комнат
begin
x:= 0;
for l:=1 to NRooms do
try
x:= x + StrToInt (FlatAtr.X [k, 2+l]);
except
end;
// Запишем жилую площадь
Vec.X [j, 4]:= x; SG. Cells [4, j]:= Vec.X [j, 4];
x:= x + StrToInt (FlatAtr.X [i, 7])+StrToInt (FlatAtr.X [i, 8])+
StrToInt (FlatAtr.X [i, 9]);
// Запишем общую площадь
SG. Cells [5, j]:= IntToStr(x); Vec.X [j, 5]:= x;
break;
end;
end;
InputString:= 'Квартира №'+IntToStr(NKvart)+
' находится в подъезде №'+IntToStr(NPod)+
' на этаже №'+IntToStr(NFloor)+
' ('+IntToStr(NRooms)+' комната(ы)).';
Application. MessageBox (PChar(InputString), '', MB_OK);
exit;
end;
x:= x + porch[i]*M;
end;
Application. MessageBox('Указанная квартира не найдена по схеме дома',
'Ошибка', MB_OK);
SG. Cells[2, j]:= «; Vec.X[j, 2]:= «;
SG. Cells [3, j]:= «; Vec.X [j, 3]:= «;
end;
if (j>Vec. Size) then // Кликнули за пределами области данных
begin
Vec. Add; FillStringGrid (SG, Vec);
end;
end;
function TInputForm. GetVec: TVector;
begin
case PageControl1. ActivePageIndex of
0: result:= Kvart;
1: result:= Scheme;
2: result:= GK;
3: result:= People;
4: result:= FlatAtr;
else result:= Kvart;
end;
end;
procedure TInputForm. DelBtnClick (Sender: TObject);
var
SG: TStringGrid;
Vec: TVector;
i: integer;
begin
Sg:= FSGVector [PageControl1. ActivePageIndex+1];
i:= Sg. Selection. Top; // удаляемая строка
Vec:= GetVec;
Vec. Delete(i);
FillStringGrid (SG, Vec);
end;
procedure TInputForm. SortBtnClick (Sender: TObject);
var
SG: TStringGrid;
Vec: TVector;
i: integer;
begin
Sg:= FSGVector [PageControl1. ActivePageIndex+1];
i:= Sg. Selection. Left; // Будемсортироватьэтотстолбец
Vec:= GetVec;
if (i<1) thenexit; // За пределами редактирования
Vec. SortId:= i; // установим сортируемый столбец
Vec. Sort;
FillStringGrid (SG, Vec);
end;
procedure TInputForm.KSpinEditChange (Sender: TObject);
begin
KPod:= KSpinEdit. Value;
end;
procedure TInputForm.MSpinEditChange (Sender: TObject);
begin
M:= MSpinEdit. Value;
end;
procedure TInputForm.SGKeyPress (Sender: TObject; var Key: Char);
begin
if Key =#13 then // Если нажата клавиша Enter то…
SGDblClick(Sender);
end;
procedure TInputForm. FormDestroy (Sender: TObject);
begin
People. Destroy;
GK. Destroy;
Scheme. Destroy;
FlatAtr. Destroy;
Kvart. Destroy;
end;
procedure TInputForm. CopyBtnClick (Sender: TObject);
var
SG: TStringGrid;
Vec: TVector;
i: integer;
begin
Sg:= FSGVector [PageControl1. ActivePageIndex+1];
i:= Sg. Selection.top; // Будемкопироватьэтустроку
Vec:= GetVec;
Vec. AddCopy(i);
FillStringGrid (SG, Vec);
end;
procedure TInputForm. FindBtnClick (Sender: TObject);
var
SG: TStringGrid;
Vec: TVector;
res,
Row, Col: integer;
InputString: String;
begin
Sg:= FSGVector [PageControl1. ActivePageIndex+1];
Col:= Sg. Selection. Left;
Row:= Sg. Selection. Top;
Vec:= GetVec;
if (Col<1) thenexit; // За пределами редактирования
InputString:= InputBox('', 'Введите значение для поиска', «);
if InputString=''
then exit;
res:= Vec. Find (Col, Row, InputString);
if res=0 then
begin
Application. MessageBox ('Указанное значение не найдено!', 'Ошибка', MB_OK);
exit;
end;
Sg. Row:= res;
end;
procedure TInputForm.FButtonClick (Sender: TObject);
var
NKvart, NPod: integer;
fl, i, k, x, p: integer;
St, FIO: String;
begin
//
ReportForm. ListBox1. Items. Clear;
ReportForm. ListBox1. Items. Add(
' Cписок всех жильцов дома, проживающих в квартирах, '+
'в которых ГК имеет льготы по квартплате');
for k:=1 to People. Size do
begin
NKvart:= People.x [k, 3]; // Номер квартиры
fl:= 0;
for i:=1 to GK. Size do
begin
if Gk.X [i, 1]=NKvart then
begin fl:= 1; break; end;
end;
if (fl=0) or ((fl=1) and (Gk.X [i, 7]<>'да'))
then continue; // У ГК нет льгот;
FIO:= People.X [k, 1];
x:= 0; NPod:= 0;
for i:=1 to Scheme. Size do
begin
if Scheme.X [i, 3]=''
then p:= 2
else if Scheme.X [i, 4]=''
then p:= 3 else p:=4;
if NKvart <= x + (p*M) then
begin NPod:= i; break; end;
end;
for i:=1 to Kvart. Size do
if Kvart.X [i, 1]= NKvart then
begin // получили искомую строку квартиры
St:= FIO+' кв. №'+IntToStr(NKvart)+' подъезд №'+IntToStr(NPod)+' – '+
IntToStr (Kvart.X [i, 2])+' комн. ';
if Kvart.X [i, 7]='да'
thenSt:= St + ' – кв-ра приватизирована '
elseSt:= St + ' – кв-ра не приватизирована ';
// списка: Фамилия жильца, номер квартиры, подъезд, число комнат, признак