Фрагмент для ознакомления
Text.Length == 0 ){ MessageBox.Show("Данные паспорта (или иного документа) не могут быть пустыми!"); return; } // Проверяем дублирование паспорта String curPassport = edPassport.Text.ToLower();foreach (var human in Base.Humans)if (human.Value != H && human.Value.Passport.ToLower().Equals(curPassport)){ MessageBox.Show("Персона с такими паспортными данными уже есть в базе!"); return; } // Проверяем дату рождения if (edBirthday.SelectionRange.Start > DateTime.Now) { MessageBox.Show("Дата из будущего недопустима!"); return; } // Данные в порядке, заносим в базуH.FIO = edFIO.Text; H.Passport = edPassport.Text; H.BirthDate = edBirthday.SelectionRange.Start;e.Cancel = false; // Разрешаем закрыть форму } /// /// Вызывается при нажатии кнопки OK/// /// Источникдействия /// Параметрыдействияprivate void btOK_Click(object sender, EventArgs e){Close(); } }}ФайлForm6.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespacehouse{ /// /// Форма вывода списка жильцов/// public partial class ViewAllForm : Form{/// /// Ссылка на базу данных /// DB Base; /// /// Конструктор /// public ViewAllForm(DB Base) {InitializeComponent(); this.Base = Base; List list = Base.GetAllLivingsSortedByFIO();int counter = 1;foreach (Human human in list) { rtfList.Text += String.Format("{2}. {0} [Квартира={1}]\n", human.FIO, Base.GetFloorByHumanID(human.Id).Number, counter);counter++; } } /// /// Вызывается при нажатии кнопки OK/// /// Источникдействия /// Параметрыдействияprivate void btOK_Click(object sender, EventArgs e){ Close(); } /// /// Вызывается при нажатии кнопки Сохранить/// /// Источникдействия /// Параметрыдействияprivate void btSave_Click(object sender, EventArgs e) {if (saveFileDialog.ShowDialog() == DialogResult.OK){ // ЕслиуказанфайлдлясохраненияrtfList.SaveFile(saveFileDialog.FileName);} } }}ФайлForm7.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace house{ /// /// Главноеокнодлябухгалтера /// public partial class AuditorForm : Form{/// /// Ссылка на базу данных /// private DB Base; /// /// Отсортированный по названиям список статей дохода/// private List DebetGrads;/// /// Отсортированный по названиям список статей расхода/// private List CreditGrads;/// /// Отсортированный по номерам списко квартир/// private List _Floors;/// /// Массив доходов с квартиры /// private List Debets; /// /// Массив расходов с квартиры /// private List Credits; /// /// Конструктор /// /// Ссылка на базу данныхpublic AuditorForm(DB Base) {InitializeComponent(); this.Base = Base;SyncFloors(-1);SyncDebetGrads(-1);SyncCreditGrads(-1); } /// /// Синхронизирует статистику доходов/расходов по квартире/// public void SyncFloorStat() { lbFloorCredit.Text = "Расходсквартиры: ";lbFloorDebet.Text = "Доход с квартиры: ";if (lbFloors.SelectedIndex >= 0) { List debets = Base.GetDebetIDsByFloorID(_Floors[lbFloors.SelectedIndex].Id);double debet = 0.0;foreach (int debetID in debets) {if (Base.Debets[debetID].Date.Month == DateTime.Now.Month)debet += Base.Debets[debetID].Sum; } lbFloorDebet.Text += debet.ToString("F4") + " руб."; List credits = Base.GetCreditIDsByFloorID(_Floors[lbFloors.SelectedIndex].Id);double credit = 0.0;foreach (int creditID in credits) {if (Base.Credits[creditID].Date.Month == DateTime.Now.Month)credit += Base.Credits[creditID].Sum; } lbFloorCredit.Text += credit.ToString("F4") + " руб.";} } /// /// Синхронизирует список статей дохода /// /// Идентификатор статьи дохода для выбораprivate void SyncDebetGrads(int selectID){ lbDebetGrads.Items.Clear(); // Собираем массив статей доходаDebetGrads = new List(Base.DebetGrads.Values);// Сортируем по названиямDebetGrads.Sort((A, B) => {return A.Name.CompareTo(B.Name); } ); // Переносимсписокнаформуforeach (DebetGrad f in DebetGrads) {lbDebetGrads.Items.Add(Base.DebetGrads[f.Id].GetRepresentation());if (f.Id == selectID) lbDebetGrads.SelectedIndex = lbDebetGrads.Items.Count - 1;} SyncFloorDebets(); } /// /// Синхронизация записей в поле "квартира-доходы"/// private void SyncFloorDebets() {lbFloorDebets.Items.Clear();if (lbDebetGrads.SelectedIndex >= 0 && lbFloors.SelectedIndex >= 0) { // Собираеммассивдоходов Debets = Base.GetDebetsByFloorAndGrad(_Floors[lbFloors.SelectedIndex].Id, DebetGrads[lbDebetGrads.SelectedIndex].Id);// Сортируем по датамDebets.Sort((A, B) => {return A.Date.CompareTo(B.Date); } ); // Переносимсписокнаформуforeach (Debet f in Debets) {lbFloorDebets.Items.Add(f.GetRepresentation());} SyncFloorStat(); } } /// /// Синхронизирует список статей расхода /// /// Идентификатор статьи расхода для выбораprivate void SyncCreditGrads(int selectID){ lbCreditGrads.Items.Clear(); // Собираем массив статей расходаCreditGrads = new List(Base.CreditGrads.Values);// Сортируем по названиямCreditGrads.Sort((A, B) => {return A.Name.CompareTo(B.Name); } ); // Переносимсписокнаформуforeach (CreditGrad f in CreditGrads) {lbCreditGrads.Items.Add(Base.CreditGrads[f.Id].GetRepresentation());if (f.Id == selectID) lbCreditGrads.SelectedIndex = lbCreditGrads.Items.Count - 1;} SyncFloorCredits(); } /// /// Синхронизация записей в поле "квартира-расходы"/// private void SyncFloorCredits() {lbFloorCredits.Items.Clear();if (lbCreditGrads.SelectedIndex >= 0 && lbFloors.SelectedIndex >= 0) { // Собираеммассивдоходов Credits = Base.GetCreditsByFloorAndGrad(_Floors[lbFloors.SelectedIndex].Id, CreditGrads[lbCreditGrads.SelectedIndex].Id);// Сортируем по датамCredits.Sort((A, B) => {return A.Date.CompareTo(B.Date); } ); // Переносимсписокнаформуforeach (Credit f in Credits) {lbFloorCredits.Items.Add(f.GetRepresentation());} SyncFloorStat(); } } /// /// Вызывается при удалении статьи дохода/// /// Источникдействия /// Параметрыдействияprivate void btDelDebetGrad_Click(object sender, EventArgs e){ if (lbDebetGrads.SelectedIndex >= 0){ // Если статья выделена в списке if (MessageBox.Show("Удалить статью, Вы уверены?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes){ // Если действие подтверждено int nextID = lbDebetGrads.SelectedIndex < lbDebetGrads.Items.Count - 1 ?DebetGrads[lbDebetGrads.SelectedIndex + 1].Id : -1;DebetGrads[lbDebetGrads.SelectedIndex].Delete();DebetGrads.RemoveAt(lbDebetGrads.SelectedIndex);SyncDebetGrads(nextID);} } } /// /// Вызывается при удалении статьи расхода/// /// Источникдействия /// Параметрыдействияprivate void btDelCreditGrad_Click(object sender, EventArgs e){ if (lbCreditGrads.SelectedIndex >= 0){ // Если статья выделена в списке if (MessageBox.Show("Удалить статью, Вы уверены?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes){ // Если действие подтверждено int nextID = lbCreditGrads.SelectedIndex < lbCreditGrads.Items.Count - 1 ?CreditGrads[lbCreditGrads.SelectedIndex + 1].Id : -1;CreditGrads[lbCreditGrads.SelectedIndex].Delete();CreditGrads.RemoveAt(lbCreditGrads.SelectedIndex);SyncCreditGrads(nextID);} } } /// /// Вызывается при добавлении статьи дохода/// /// Источникдействия /// Параметрыдействияprivate void btAddDebetGrad_Click(object sender, EventArgs e) {int NewDebetGradID = Base.GetMaxDebetGradId() + 1; DebetGrad NewDebetGrad = new DebetGrad(Base, NewDebetGradID, "Статьядохода", GradType.gtByFloor, 0.0);Base.DebetGrads.Add(NewDebetGradID, NewDebetGrad); EditGradation ef = new EditGradation(NewDebetGrad);ef.ShowDialog();SyncDebetGrads(NewDebetGradID); } /// /// Вызывается при добавлении статьи расхода /// /// Источникдействия /// Параметрыдействияprivate void btAddCreditGrad_Click(object sender, EventArgs e) {int NewCreditGradID = Base.GetMaxCreditGradId() + 1; CreditGrad NewCreditGrad = new CreditGrad(Base, NewCreditGradID, "Статьярасхода", GradType.gtByFloor, 0.0);Base.CreditGrads.Add(NewCreditGradID, NewCreditGrad); EditGradation ef = new EditGradation(NewCreditGrad);ef.ShowDialog();SyncCreditGrads(NewCreditGradID); } /// /// Синхронизирует список квартир на форме с базой данных /// /// Идентификатор квартиры, которая выбранаprivate void SyncFloors(int selectID){ lbFloors.Items.Clear(); // Собираем массив квартир _Floors = Base.GetFloorsSortedByNumber(); // Переносим список на формуforeach (Floor f in _Floors) {lbFloors.Items.Add(f.GetRepresentation());if (f.Id == selectID) lbFloors.SelectedIndex = lbFloors.Items.Count - 1;} SyncFloorStat(); } /// /// Вызывается при изменении выбранного элемента в списке квартир/// /// Источникдействия /// Параметрыдействияprivate void lbFloors_SelectedIndexChanged(object sender, EventArgs e){ SyncFloorDebets(); SyncFloorCredits(); } /// /// Вызывается при изменении выбранного элемента в списке статей дохода/// /// Источникдействия /// Параметрыдействияprivate void lbDebetGrads_SelectedIndexChanged(object sender, EventArgs e){ SyncFloorDebets(); } /// /// Вызывается при изменении выбранного элемента в списке статей расхода/// /// Источникдействия /// Параметрыдействияprivate void lbCreditGrads_SelectedIndexChanged(object sender, EventArgs e){ SyncFloorCredits(); } /// /// Вызывается при добавлении дохода/// /// Источникдействия /// Параметрыдействияprivate void btAddDebet_Click(object sender, EventArgs e) {if (lbDebetGrads.SelectedIndex >= 0 && lbFloors.SelectedIndex >= 0) { Floor floor = _Floors[lbFloors.SelectedIndex]; DebetGrad dg = DebetGrads[lbDebetGrads.SelectedIndex];double cost = 0.0;switch (dg.Type) {case GradType.gtByFloor:cost = dg.Stavka;break;case GradType.gtByLivingMeter:cost = dg.Stavka * floor.LivingArea;break;case GradType.gtByTotalMeter:cost = dg.Stavka * floor.TotalArea;break; }if (MessageBox.Show("Добавитьдоходнасумму " + cost.ToString("F4") + " рублей?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes) {int NewDebetID = Base.GetMaxDebetId() + 1;Base.Debets.Add(NewDebetID, new Debet(Base, NewDebetID, floor.Id, dg.Id, DateTime.Now, cost));SyncFloorDebets(); } } } /// /// Вызывается при добавлении расхода/// /// Источникдействия /// Параметрыдействияprivate void btAddCredit_Click(object sender, EventArgs e) {if (lbCreditGrads.SelectedIndex >= 0 && lbFloors.SelectedIndex >= 0) { Floor floor = _Floors[lbFloors.SelectedIndex]; CreditGrad cg = CreditGrads[lbCreditGrads.SelectedIndex];double cost = 0.0;switch (cg.Type) {case GradType.gtByFloor:cost = cg.Stavka;break;case GradType.gtByLivingMeter:cost = cg.Stavka * floor.LivingArea;break;case GradType.gtByTotalMeter:cost = cg.Stavka * floor.TotalArea;break; }if (MessageBox.Show("Добавитьрасходнасумму " + cost.ToString("F4") + " рублей?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes) {int NewCreditID = Base.GetMaxCreditId() + 1;Base.Credits.Add(NewCreditID, new Credit(Base, NewCreditID, floor.Id, cg.Id, DateTime.Now, cost));SyncFloorCredits(); } } } /// /// Вызывается при нажатии на кнопку удаления дохода/// /// Источникдействия /// Параметрыдействияprivate void btDelDebet_Click(object sender, EventArgs e) {if (lbFloorDebets.SelectedIndex >= 0 &&MessageBox.Show("Удалитьдоход?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes) {Debets[lbFloorDebets.SelectedIndex].Delete();SyncFloorDebets();} } /// /// Вызывается при нажатии на кнопку удаления расхода/// /// Источникдействия /// Параметрыдействияprivate void btDelCredit_Click(object sender, EventArgs e) {if (lbFloorCredits.SelectedIndex >= 0 &&MessageBox.Show("Удалитьрасход?", "Подтверждение", MessageBoxButtons.YesNo) == DialogResult.Yes) {Credits[lbFloorCredits.SelectedIndex].Delete();SyncFloorCredits();} } }}ФайлForm8.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespacehouse{ /// /// Форма создания статьи расходов/доходов/// public partial class EditGradation : Form{ /// /// Добавлямая статья доходов или расходов/// private Grad G; /// /// Конструктор /// /// Ссылка на объект-статью расходов или доходовpublic EditGradation(Grad g) {InitializeComponent(); this.G = g; edName.Text = g.Name; edStavka.Text = g.Stavka.ToString("F4");switch (G.Type) {case GradType.gtByFloor: rbByFloor.Checked = true;break;case GradType.gtByTotalMeter: rbByTotalMeter.Checked = true;break;case GradType.gtByLivingMeter: rbByLivingMeter.Checked = true;break; } } /// /// Вызывается при изменении состояния одного из контролов типа/// /// Источникдействия /// Параметрыдействияprivate void rbByFloor_CheckedChanged(object sender, EventArgs e) { G.Type = (GradType)int.Parse((String)((RadioButton)sender).Tag); // Заносимвполетипазначениесвойства Tag вызвавшегоконтрола} /// /// Вызывается при нажатии кнопки OK/// /// Источникдействия /// Параметрыдействияprivate void btOK_Click(object sender, EventArgs e){ Close(); } /// /// Вызывается при закрытии формы/// /// Источникдействия /// Параметрыдействияprivate void EditGradation_FormClosing(object sender, FormClosingEventArgs e){ e.Cancel = true; // Сначала считаем, что форму закрывать не надо if (edName.Text.Length == 0 ) { MessageBox.Show("Название статьи не может быть пустым!");return; }double stavka = 0.0;if (!double.TryParse(edStavka.Text, out stavka)){ MessageBox.Show("Величина ставки должна быть корректным вещественным числом!");return; } G.Name = edName.Text;G.Stavka = stavka; e.Cancel = false; // А после всех успешных проверок разрешим закрыть форму} }}ФайлForm9.csusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespacehouse{ /// /// Форма с информацией о программе/// public partial class InfoForm : Form { /// /// Конструктор формы /// public InfoForm() {InitializeComponent(); } }}ФайлGrad.csusing System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace house{ /// /// Статья дохода или расхода/// public abstract class Grad : DbObj { /// /// Название /// public String Name { get; set; } /// /// Тип /// public GradType Type { get; set; }/// /// Ставка за единицу в соответствии с типом/// public Double Stavka { get; set; } /// /// Конструкторстатьи /// /// Ссылканабазуданных /// Идентификаторзаписи /// Название /// Тип /// Ставказаединицуpublic Grad(DB owner, int id, String name, GradType type, double stavka) : base(owner, id) { Name = name; Type = type; Stavka = stavka;} /// /// Конструктор с чтением из файла/// /// Ссылканабазуданных/// Объект для чтения из файлаpublic Grad(DB owner, BinaryReader br) : base(owner, br){ Name = br.ReadString(); Type = (GradType)br.ReadInt32(); Stavka = br.ReadDouble();} /// /// Методсохранениявфайл /// /// Объектдлязаписивфайлpublic override void Save(BinaryWriter bw) {base.Save(bw);bw.Write(Name);bw.Write((int)Type);bw.Write(Stavka);} /// /// Возвращает строковое представление /// /// Строковоепредставлениеpublic virtual String GetRepresentation(){ String[] types = new string[] { "с квартиры", "с жилого метра", "с общего метра" };return String.Format("{0} [{1} руб {2}]", Name, Stavka, types[(int)Type]);} }}ФайлHuman.csusing System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace house{ /// /// Класс = человек /// public class Human : DbObj{ /// /// Фамилия, имя, отчество /// public String FIO { get; set; } /// /// Данныепаспорта /// public String Passport { get; set; } /// /// Датарождения /// public DateTime BirthDate { get; set; }/// /// Конструктор объекта класса "Человек"/// /// Ссылканабазуданных/// Уникальный идентификатор/// Фамилия, имя, отчество /// Данныепаспорта /// Датарожденияpublic Human(DB owner, int id, String fio, String passport, DateTime birth_date) : base(owner, id) { FIO = fio; Passport = passport; BirthDate = birth_date;} /// /// Конструктор с чтением из файла/// /// Ссылканабазуданных/// Объект для чтения из файлаpublic Human(DB owner, BinaryReader br) : base(owner, br) { FIO = br.ReadString(); Passport = br.ReadString(); BirthDate = DateTime.FromBinary(br.ReadInt64());} /// /// Метод сохранения в файл /// /// Объект для записи в файлpublic override void Save(BinaryWriter bw) {base.Save(bw);bw.Write(FIO);bw.Write(Passport);bw.Write(BirthDate.ToBinary());} /// /// Удаление объекта из базы данных/// public override void Delete() { List rel_ids = Owner.GetLinkIDsByHumanID(Id);foreach (int lid in rel_ids)Owner.Links[lid].Delete();Owner.Humans.Remove(Id);} /// /// Возвращает строковое представление человека для списка/// /// Долясобственности. Отрицательно число, если не задана/// Строковоепредставлениеpublic String GetRepresentation(double Part = -1.0) {if (Part >= 0.0)return String.Format("{0} [{2}] [{1}]", FIO, Passport, Part);elsereturn String.Format("{0} [{1}]", FIO, Passport);} }}ФайлLink.csusing System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Security.Cryptography.X509Certificates;using System.Text;using System.Threading.Tasks;namespace house{ /// /// Класс = связь между человеком и квартирой/// public class Link : DbObj { /// /// Идентификаторчеловека /// public int HumanID { get; set; } /// /// Идентификаторквартиры /// public int FloorID { get; } /// /// Долясобственности /// public double Part { get; set; }/// /// Зарегистрирован ли по этому адресу/// public bool IsRegistered { get; set; }/// /// Конструктор связи между человеком и квартирой/// /// Ссылканабзауданных /// Идентификаторзаписи /// Идентификаторчеловека /// Идентификаторквартиры /// Долясобственности /// Зарегистрированлипоэтомуадресуpublic Link(DB owner, int id, int human_id, int floor_id, double part, bool registration) : base(owner, id) { HumanID = human_id; FloorID = floor_id; Part = part; IsRegistered = registration; } /// /// Конструктор с чтением из файла /// /// Ссылка на базу данных /// Объект для чтения из файлаpublic Link(DB owner, BinaryReader br) : base(owner, br) { HumanID = br.ReadInt32(); FloorID = br.ReadInt32(); Part = br.ReadDouble(); IsRegistered = br.ReadBoolean();} /// /// Метод сохранения в файл /// /// Объект для записи в файлpublic override void Save(BinaryWriter bw) {base.Save(bw);bw.Write(HumanID);bw.Write(FloorID);bw.Write(Part);bw.Write(IsRegistered); } /// /// Удаление объекта из базы данных/// public override void Delete() {Owner.Links.Remove(Id); } /// /// Обновляет данные связи /// /// Новый идентификатор человека /// Новая доля собственностиpublic void Update(int HumanID, double Part) { this.HumanID = HumanID; this.Part = Part;} }}ФайлProgram.csusing System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace house{internal static class Program{ /// /// Главная точка входа для приложения./// [STAThread]static void Main() {Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false); InfoForm sf = new InfoForm();sf.ShowDialog();Application.Run(new RoleForm()); } }}Приложение B – РуководствопользователяПосле старта на экране появляется приветственное окно, показанное на рисунке 17.Рисунок 17 – Стартовое окно программыПосле нажатия кнопки OKоткрывается окно выбора роли и работы с данными, показанное на рисунке 18.Рисунок 18 – Окно выбора роли и работы с даннымиВ верхней левой части находятся кнопки, позволяющие загрузить базу из файла, сохранить базу в файл и очистить базу. При загрузке/выгрузке программа запрашивает путь и имя файла в стандартном окне.В центре окна находятся две кнопки, позволяющие выбрать роль текущего пользователя, соответственно, при нажатии на одну из них загружается интерфейс управляющего или бухгалтера.На рисунке 19 показано основное окно интерфейса управляющего.Рисунок 19 – Основное окно интерфейса управляющегоОсновную часть окна занимает список квартир, отсортированный по номерам, для каждой квартиры отображается номер, общая и жилая площадь в квадратных метрах. В нижней части находятся кнопки добавления, редактирования и удаления квартиры, а также кнопка генерации списка жильцов.Для редактирования или удаления квартиры необходимо выбрать ее в списке и нажать соответствующую кнопку. Добавление квартиры происходит при нажатии на соответствующую кнопку независимо от состояния списка квартир. Удаление происходит с запросом подтверждения.При нажатии на кнопку генерации списка жильцов создается полный список жильцов, отсортированный по алфавиту, и отображается в окне, показанном на рисунке 20.Рисунок 20 – Окно со списком жильцовВ этом окне можно сохранить полученный список в RTF-формате (при нажатии на кнопку сохранения (в нижней части) запрашивается имя выходного файла, в который и будет сохранен список).Добавление и редактирование квартиры производится в окне, показанном на рисунке 21.Рисунок 21 – Окно добавления/редактирования квартирыВ верхней части окна находятся поля для ввода номера квартиры (введенное значение проверяется на дублирование при закрытии окна), поля для ввода общей и жилой площадей (проверяются на допустимость при закрытии окна).В середине окна находится список жильцов (с паспортными данными), а под ним кнопки, с помощью которых можно добавить или удалить жильца. Кнопка удаления работает только при выделенном в списке жильце, запрашивается подтверждение.В нижней части окна находится список собственников (для каждого в квадратных скобках указана доля собственности и паспортные данные), под ним также есть кнопки для добавления или удаления собственника.Кнопка удаления работает только при выделенном в списке собственнике, запрашивается подтверждение.При добавлении жильца или собственника открывается окно, показанное на рисунке 22.Рисунок 22 – Окно добавления/выбора персоныВ этом окне можно выбрать в списке уже существующую персону и нажать кнопку ОК. При необходимости можно добавить новую персону или редактировать данные существующей (кнопки «Добавить» и «Редактировать»). Также можно удалить персону (выбрать в списке и нажать соответствующую кнопку), однако при этом программа запретит удалять персону, которая числится в какой-либо квартире жильцом или собственником. Если удаление возможно, программа все равно запросит подтверждение.На рисунке 23 показано окно редактирования существующей персоны или добавления новой персоны.Рисунок 23 – Окно редактирования/добавления персоныВ полях сверху можно указать фамилию/имя/отчество и паспортные данные (при этом программа проверит существование другой персоны с такими паспортными данными при закрытии окна, эти данные не должны дублироваться!). В поле календаря можно указать дату рождения (при закрытии программа проверит эту дату на допустимость – она не должна быть «»из будущего»). По окончании ввода/редактирования нажимается кнопка ОК.На этом описание интерфейса «Управляющий» заканчивается, переходим к описанию интерфейса «Бухгалтер».На рисунке 24 показано основное окно интерфейса «Бухгалтер», вызываемое из окна выбора роли (рисунок 18).Рисунок 24 – Основное окно интерфейса «Бухгалтер»В левой части окна находятся списки статей доходов и расходов (отображаются название, ставка и объект ее применения), под которыми расположены кнопки добавления и редактирования статей. Для удаления статьи необходимо сначала выбрать ее в списке и затем нажать соответствующую кнопку, при этом программа все равно запросит подтверждение. При добавлении статьи открывается окно редактирования статьи, которое будет описано далее.В правой части окна находится список квартир, отсортированный по номерам, для каждой квартиры отображается ее общая и жилая площадь. Под списком отображается статистическая информация по общей сумме доходов и расходов по квартире в текущем месяце.В средней части окна находятся списки доходов и расходов для квартиры, выбранной в списке квартир, по статье, выбранной в соответствующем списке статей. Указывается величина дохода/расхода, а также дата его регистрации в квадратных скобках. Для добавления дохода или расхода выбирается квартира в списке, выбирается статья в списке, нажимается соответствующая кнопка «+», при этом система автоматически рассчитывает величину платежа в зависимости от типа статьи и запрашивает подтверждение добавления дохода или расхода на такую сумму. Для удаления дохода или расхода можно воспользоваться соответствующими кнопками, расположенными под списками доходов и расходов. Программа запрашивает подтверждение удаления.На рисунке 25 показано окно добавления/редактирования статьи дохода или расхода.Рисунок 25 – Окно добавления/редактирования статьи дохода/расходаВ этом окне в верхней части можно задать название статьи, а в средней части выбрать тип применения ставки (которая указывается в нижней части окна) – на квартиру, на метр жилой площади или на метр общей площади. Далее нажимается кнопка OK.
1. Васильев А. C#. Объектно-ориентированное программирование: Учебный курс. – СПб.: Питер, 2012. – 320 с.: ил.
2. Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектноориентированного программирования. Паттерны проектирования. –СПб: Питер, 2009. – 366 с.: ил.
3. Герберт Шилдт. С# 3.0. Полное руководство. – Изд. Вильямс, 2010.
4. Нейгел К., Ивьен Б. и др. С# 2008 и платформа NET 3.5 для профессионалов. – Изд. Диалектика, 2008.
5. Трей Нэш. C# 2010. Ускоренный курс для профессионалов. – Изд. Вильямс, 2010.
6. Троелсен Э. Язык программирования С# 2008 и платформа .NET 3.5 –Изд. Вильямс, 2010.
7. Стиллмен Э., Грин Дж. Изучаем C# [пер. с англ. И. Рузмайкина]. – 2-е изд. - Москва: Питер, 2012. – 694 с. : ил.