|
Информационная система начальника жилищно-эксплуатационной службы |
rocedure 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;varInputForm: TInputForm;Implementation{$R *.DFM}procedure TInputForm. FormCreate (Sender: TObject);beginKPod:=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);varx, i, j: integer;St: String;beginReadln (Ft, x); Vec. Cols:= x;for i:=1 to Vec. Cols dobegin Readln (Ft, St); Vec. Names[i]:= St; end;Readln (Ft, x); Vec. Size:= x;for i:=1 to Vec. Size dobeginfor j:=1 to Vec. Cols dobegin 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;beginWriteln (Ft, Vec. Cols);for i:=1 to Vec. Cols doWriteln (Ft, Vec. Names[i]);Writeln (Ft, Vec. Size);for i:=1 to Vec. Size dobeginfor j:=1 to Vec. Cols doWriteln (Ft, Vec.X [i, j]);end;end; // Чтение данных из файлаprocedure TInputForm. LoadButtonClick (Sender: TObject);beginOpenDialog1. 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); // Сохраниение данных в файлеbeginif not SaveDialog1. Execute then exit; // Выполнение стандартного диалога выбора имени файлаbeginFileNameT:= SaveDialog1. FileName; // Возвращение имени дискового файлаAssignFile (Ft, FileNameT); // Связывание файловой переменной Fz с именем файла{$I-}Rewrite(Ft); // Открытие нового файла{$I+}if not((IOResult = 0) and (FileNameT <> «)) thenbeginApplication. MessageBox ('Не возможно открыть файл!', 'Ошибка', MB_OK);exit;end;end;WriteVec(Kvart); // Запись в файлWriteVec(Scheme);WriteVec(GK);WriteVec(People);WriteVec(FlatAtr);CloseFile(Ft); // Закрытие файлаend; // Процедура заполнения объекта StringGrid данными из Вектора Vecprocedure TInputForm. FillStringGrid (SG: TStringGrid; Vec: TVector);var i, j: integer;beginSg. ColCount:= Vec. Cols+1;if Vec. Size=0then Sg. RowCount:=2else Sg. RowCount:=Vec. Size+1;for i:=1 to Vec. Cols doSg. Cells [i, 0]:= Vec. Names[i];for i:=1 to Vec. Size dobeginSg. Cells [0, i]:= IntToStr(i);for j:=1 to Vec. Cols doSg. Cells [j, i]:= Vec.X [i, j];end;Sg. ColWidths[0]:= 25;end;procedure TInputForm. PageControl1Change (Sender: TObject);begincase PageControl1. ActivePageIndex of0: 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);varSG: TStringGrid;Vec: TVector;beginSg:= FSGVector [PageControl1. ActivePageIndex+1];Vec:= GetVec;Vec. Add;FillStringGrid (SG, Vec);end;procedure TInputForm.SGDblClick (Sender: TObject);varNRooms, NKv, NKvart, NPod, NFloor: integer;porch: array [0..MaxN] of integer;SG: TStringGrid;Vec: TVector;i, j, x, k, l: integer;InputString: String;beginSg:= TStringGrid(Sender);i:= Sg. Selection. Left;j:= Sg. Selection. Top;Vec:= GetVec;if (i<1) then exit; // За пределами редактирования // Установим особые параметры для таблицы КВАРТ - StringGrid1if (Sg. Name = 'StringGrid1') and (i in [2,3,4,5]) thenbeginApplication. 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; // Заполним при необходимости остальные поля для таблицы КВАРТ - StringGrid1if (Sg. Name = 'StringGrid1') and (i = 1) thenbeginNKvart:= Vec.X [j, i];porch[0]:= 0; x:= 0;for i:=1 to Scheme. Size dobeginporch[i]:= 2;if Scheme.X [i, 3]=''then porch[i]:= 2else if Scheme.X [i, 4]=''then porch[i]:= 3 else porch[i]:=4;if NKvart <= x + (porch[i]*M) thenbeginNPod:= i; // Определили номер подъездаNFloor:= (NKvart-x) div M +1; // Определили номер этажаNKv:= (NKvart-x) mod M; // Определили номер кв. на этажеif NKv=0then 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 dobeginif FlatAtr.X [i, 1]= NRooms then // совпадает количество комнатbegin //x - атр. 4 = сумма площадей всех комнат, взятых из таблицы С,x:= 0;for l:=1 to NRooms dotryx:= x + StrToInt (FlatAtr.X [k, 2+l]);exceptend; // Запишем жилую площадь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 // Кликнули за пределами области данныхbeginVec. Add; FillStringGrid (SG, Vec);end;end;function TInputForm. GetVec: TVector;begincase PageControl1. ActivePageIndex of0: result:= Kvart;1: result:= Scheme;2: result:= GK;3: result:= People;4: result:= FlatAtr;else result:= Kvart;end;end;procedure TInputForm. DelBtnClick (Sender: TObject);varSG: TStringGrid;Vec: TVector;i: integer;beginSg:= FSGVector [PageControl1. ActivePageIndex+1];i:= Sg. Selection. Top; // удаляемая строкаVec:= GetVec;Vec. Delete(i);FillStringGrid (SG, Vec);end;procedure TInputForm. SortBtnClick (Sender: TObject);varSG: TStringGrid;Vec: TVector;i: integer;beginSg:= FSGVector [PageControl1. ActivePageIndex+1];i:= Sg. Selection. Left; // Будем сортировать этот столбецVec:= GetVec;if (i<1) then exit; // За пределами редактированияVec. SortId:= i; // установим сортируемый столбецVec. Sort;FillStringGrid (SG, Vec);end;procedure TInputForm.KSpinEditChange (Sender: TObject);beginKPod:= KSpinEdit. Value;end;procedure TInputForm.MSpinEditChange (Sender: TObject);beginM:= MSpinEdit. Value;end;procedure TInputForm.SGKeyPress (Sender: TObject; var Key: Char);beginif Key =#13 then // Если нажата клавиша Enter то…SGDblClick(Sender);end;procedure TInputForm. FormDestroy (Sender: TObject);beginPeople. Destroy;GK. Destroy;Scheme. Destroy;FlatAtr. Destroy;Kvart. Destroy;end;procedure TInputForm. CopyBtnClick (Sender: TObject);varSG: TStringGrid;Vec: TVector;i: integer;beginSg:= FSGVector [PageControl1. ActivePageIndex+1];i:= Sg. Selection.top; // Будем копировать эту строкуVec:= GetVec;Vec. AddCopy(i);FillStringGrid (SG, Vec);end;procedure TInputForm. FindBtnClick (Sender: TObject);varSG: TStringGrid;Vec: TVector;res,Row, Col: integer;InputString: String;beginSg:= FSGVector [PageControl1. ActivePageIndex+1];Col:= Sg. Selection. Left;Row:= Sg. Selection. Top;Vec:= GetVec;if (Col<1) then exit; // За пределами редактированияInputString:= InputBox ('', 'Введите значение для поиска', «);if InputString=''then exit;res:= Vec. Find (Col, Row, InputString);if res=0 thenbeginApplication. MessageBox ('Указанное значение не найдено!', 'Ошибка', MB_OK);exit;end;Sg. Row:= res;end;procedure TInputForm.FButtonClick (Sender: TObject);varNKvart, 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 dobeginNKvart:= People.x [k, 3]; // Номер квартирыfl:= 0;for i:=1 to GK. Size dobeginif Gk.X [i, 1]=NKvart thenbegin 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 dobeginif Scheme.X [i, 3]=''then p:= 2else if Scheme.X [i, 4]=''then p:= 3 else p:=4;if NKvart <= x + (p*M) thenbegin NPod:= i; break; end;end;for i:=1 to Kvart. Size doif Kvart.X [i, 1]= NKvart thenbegin // получили искомую строку квартирыSt:= FIO+' кв. №'+IntToStr(NKvart)+' подъезд №'+IntToStr(NPod)+' - '+IntToStr (Kvart.X [i, 2])+' комн. ';if Kvart.X [i, 7]='да'then St:= St + ' - кв-ра приватизирована 'else St:= St + ' - кв-ра не приватизирована '; // списка: Фамилия жильца, номер квартиры, подъезд, число комнат, признак // приватизации.ReportForm. ListBox1. Items. Add(St);end;end;ReportForm. ShowModal;end;end.unit Unit2;interfaceuses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,Buttons, ComCtrls, ExtCtrls;typeTReportForm = class(TForm)Panel1: TPanel;Panel2: TPanel;OKBtn: TButton;CancelBtn: TButton;ListBox1: TListBox;private{Private declarations}public{Public declarations}end;varReportForm: TReportForm;implementation{$R *.DFM}end.unit MyTypes;interfaceuses Sysutils, Contnrs;const MaxN = 100;typeTVarType = Variant; //TVarRec;TVarMas = array [1..MaxN] of TVarType;TVector = class (TInterfacedObject)private{Private declarations}FArr: array [1..MaxN] of TVarMas; //source dataFNum: integer; //number of itemsFCols: integer; //number of columnsFNames: array [1..MaxN] of String[MaxN]; //names of columnsfunction GetSize: Integer;procedure SetSize (value: Integer);function GetCols: Integer;procedure SetCols (value: Integer);procedure SetX (Index1, Index2: integer; value: TVarType);function GetX (Index1, Index2: integer): TVarType;procedure SetName (Index: integer; value: String);function GetName (Index: integer): String;publicSortId: integer; // Текущий сортируемый столбецSortMode: integer; // Текущий режим сортировкиconstructor Create;property X [Index1, Index2: Integer]: TVarType read GetX write SetX;property Names [Index: Integer]: String read GetName write SetName;property Size: Integer read GetSize write SetSize;property Cols: Integer read GetCols write SetCols;procedure Sort (xMode: integer = 0);procedure Add();procedure AddCopy (Index: integer);procedure Delete (Index: integer);function Find (Col, Row: integer; Value: Variant): integer;end;implementationconstructor TVector. Create;beginFNum:= 0; SortId:= 0; SortMode:= 1;end;function TVector. GetSize: Integer;begin result:= FNum; end;procedure TVector. SetSize (value: Integer);begin FNum:= value; end;function TVector. GetCols: Integer;begin result:= FCols; end;procedure TVector. SetCols (value: Integer);begin FCols:= value; end;procedure TVector. SetX (Index1, Index2: integer; value: TVarType);beginFArr[Index1] [Index2]:= value;end;function TVector. GetX (Index1, Index2: integer): TVarType;beginresult:= FArr[Index1] [Index2];end;function TVector. GetName (Index: integer): String;beginresult:= FNames[Index];end;procedure TVector. SetName (Index: integer; value: String);beginFNames[Index]:= Value;end;procedure TVector. Add();beginFNum:= FNum + 1;end;procedure TVector. AddCopy (Index: integer);beginFNum:= FNum + 1;FArr[FNum]:= FArr[Index];end;procedure TVector. Delete (Index: integer);var i: integer;beginif FNum=0 then exit; // Вроде как нечего удалятьfor i:=Index+1 to FNum do // Перенесем строкиFArr [I-1]:= FArr[I];FNum:= FNum -1; // уменьшаем количествоend; // Процедура сортировки вектора данных по индексу SortId с режимом xMode // xMode = 1 - по возрастанию // xMode = 2 - по убыванию // xMode = 0 - использовать текущий режим SortMode и затем поменять егоprocedure TVector. Sort (xMode: integer = 0);procedure QSort (l, r: Integer);function Less (var x, y: Variant): boolean;beginif (X < Y) and (SortMode=1) // по возрастаниюthen Less:=trueelse Less:=false;end;vari, j, x: integer;y: TVarMas; //Variant;begini:= l; j:= r; x:= (l+r) DIV 2;repeatwhile Less (FArr[i] [SortId], FArr[x] [SortId]) do i:= i + 1;while Less (FArr[x] [SortId], FArr[j] [SortId]) do j:= j - 1;if i <= j thenbeginy:= FArr[i];FArr[i]:= FArr[j];FArr[j]:= y;i:= i + 1; j:= j - 1;end;until i > j;if l < j then QSort (l, j);if i < r then QSort (i, r);end;begin {QuickSort};if xMode<>0then SortMode:= xMode;QSort (1, Size);if xMode=0 then // Поменяем режим сортировкиbeginif SortMode = 1then SortMode:=2 else SortMode:=1;end;end; // Процедура поиска значения Value в столбце Col с позиции Row // возвращает индекс найденой строки или 0 если ничего не найденоfunction TVector. Find (Col, Row: integer; Value: Variant): integer;var i: integer;beginresult:= 0;for i:=Row to FNum doif FArr[I] [Col] = Value thenbegin result:= i; exit; end;end;end.
Страницы: 1, 2, 3
|
|
|
© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент. |
|
|