Разработка объектной программы для обработки данных о авторах издательства». 4 этап переделанный 2. Разработка объектной программы для обработки данных о авторах издательства
Скачать 183.44 Kb.
|
Описание структуры проектаПроект Lazarus-это несколько связанных между собой файлов. Главный файл проекта, называется PROJECT1.LPR В файлах расширением *.pas хранятся программные модули проекта. Файлы форм с расширением *LFM используются для сохранения информации о внешнем виде формы (окна разрабатываемого приложения). При переименовании названия модуля автоматически меняет свое название. Файл PROJECT1.RES изначально содержит иконку для проекта. Создается автоматически. Имеет одноименное название с названием проекта. Исполняемый EXE файл, который создается в процессе компиляции проекта. Если сохранить проект под другим именем, то изменят название и файлы с расширением RES (.pas), который компонуется в окончательный исполняемый файл. Рис.10 Файлы проекта Список литературы1. Гаско Р. Объектно Ориентированное Программирование. Настольная книга программиста, — СПб.: Питер 2018 г.; 2. Гаст Х. Объектно-ориентированное проектирование: концепции и программный код, — СПб.: Питер 2019 г. 3. Кнут, Д.Э. Искусство программирования. Том 1. Основные алгоритмы — Вильямс, 2017 4. Козин А.Н., Якунина Е.А. – Учебно методическое пособие/- Казань: УВО «Университет управления «ТИСБИ», 2020. 5. Козин А.Н., Таренко Л.Б. Структуры и алгоритмы обработки данных. Часть 1. Базовые структуры: стеки, очереди, списки. Учебно-методическое пособие/-Казань: УВО «Университет управления "ТИСБИ", 2017. 6. Козин А.Н., Якунина Е.А. – Учебно методическое пособие/- Казань: УВО «Университет управления «ТИСБИ», 2020. 7. Структуры и алгоритмы обработки данных. Часть 3. Поиск и сортировка данных. Теория и методика обучения. Учебно-методическое пособие / А.Н. Козин. Л.Б. Таренко. – Казань: «Университет управления «ТИСБИ». 2020. 8. Структуры и алгоритмы обработки данных. Часть 2. Поиск и сортировка данных. Теория и методика обучения. Учебно-методическое пособие / А.Н. Козин. Л.Б. Таренко. – Казань: «Университет управления «ТИСБИ». 2018 9. Мясникова Н.А. Алгоритмы и структуры данных. Учебное пособие. – КноРус, 2018 10. Тюльпинова Н.В. Алгоритмизация и программирование: Вузовское образование, 2019. – 200 с 11. Хорев П.Б. Объектно-ориентированное программирование / П.Б. Хорев. - М.: Academia, 2017. - 448 c Приложениеunit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, Grids, Menus, LCLProc, lazutf8, unitPublishing, unitAuthor, unitBook, LCLType, Spin; type { TForm1 } TForm1 = class(TForm) ButtonAddAuthor: TButton; ButtonAddBookAfter: TButton; ButtonAddBookBefore: TButton; ButtonAddFirstBook: TButton; ButtonDeleteAuthor: TButton; ButtonDeleteBook: TButton; ObTirag: TEdit; EditAuthorName: TEdit; EditBookName: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; MainMenu1: TMainMenu; MenuItem1: TMenuItem; MenuItemSave: TMenuItem; MenuItemLoad: TMenuItem; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; SpinEditCirculation: TSpinEdit; StringGridAuthors: TStringGrid; StringGridBooks: TStringGrid; procedure ButtonAddAuthorClick(Sender: TObject);// добавление автора procedure ButtonAddBookAfterClick(Sender: TObject); procedure ButtonAddBookBeforeClick(Sender: TObject); procedure ButtonAddFirstBookClick(Sender: TObject); // добавление первой книги procedure ButtonDeleteAuthorClick(Sender: TObject);// удаление автора procedure ButtonDeleteBookClick(Sender: TObject); // удаление книги procedure EditAuthorNameUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); procedure EditCirculationKeyPress(Sender: TObject; var Key: char); procedure EditBookNameUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); procedure FormCreate(Sender: TObject);// создание формы procedure Label1Click(Sender: TObject); procedure MenuItemLoadClick(Sender: TObject);// загрузка из фалйла procedure MenuItemSaveClick(Sender: TObject);// сохранение в файл procedure StringGridAuthorsClick(Sender: TObject); procedure StringGridBooksClick(Sender: TObject); // смена выбранной строки в авторах private procedure LoadAuthors(); //загружает данные об авторах procedure LoadBooks(aAuthor: TAuthor); // загружает данные о книгах procedure ClearGrid(aStringGrid: TStringGrid); // очищает указанный грид function SelectedAuthor: TAuthor; // текущий автор в таблице procedure UpdateBtnState(); public end; var Form1: TForm1; aPublishing: TPublishing; implementation {$R *.lfm} procedure TForm1.FormCreate(Sender: TObject); begin aPublishing := TPublishing.Create(5); UpdateBtnState(); end; procedure TForm1.Label1Click(Sender: TObject); begin end; procedure TForm1.MenuItemLoadClick(Sender: TObject); begin if OpenDialog1.Execute then begin aPublishing := TPublishing.Create(5); aPublishing.Load(OpenDialog1.FileName); LoadAuthors(); // загружает таблицы end; end; procedure TForm1.MenuItemSaveClick(Sender: TObject); begin if SaveDialog1.Execute then aPublishing.Save(SaveDialog1.FileName); end; procedure TForm1.ButtonAddAuthorClick(Sender: TObject); var author: TAuthor; authorName: string; begin authorName := EditAuthorName.Text; // считываем фамилию автора if (not authorName.IsEmpty) then // если edit заполнен begin author := TAuthor.Create(authorName); // создаём автора aPublishing.AddAuthor(author); // добалвяем автора LoadAuthors();// перезагружаем таблицу end else ShowMessage('Заполните адрес'); UpdateBtnState(); end; procedure TForm1.ButtonAddBookAfterClick(Sender: TObject); var author: TAuthor; book: TBook; aBookName, aCirculationString: string; begin author := SelectedAuthor; if (author <> nil) then begin aBookName := EditBookName.Text; // считываем название книги aCirculationString := SpinEditCirculation.Text; // считываем тираж if ((not aBookName.IsEmpty) and (not aCirculationString.IsEmpty)) then // если edit заполнен begin book := TBook.Create(aBookName, StrToInt(aCirculationString));// создаём книгу aBookName := StringGridBooks.Cells[0, StringGridBooks.Row]; // сохраняем название предшествующей if (not aBookName.IsEmpty) then // проверка на заполненность полей author.AddAfter(book, aBookName) // добалвяем книгу else ShowMessage('Ошибка добавления'); LoadAuthors(); // перезагружаем таблицу авторы LoadBooks(author); // перезагружаем таблицу книги end else ShowMessage('Заполните адрес'); end; UpdateBtnState(); end; procedure TForm1.ButtonAddBookBeforeClick(Sender: TObject); var author: TAuthor; book: TBook; aBookName, aCirculationString: string; begin author := SelectedAuthor; if (author <> nil) then begin aBookName := EditBookName.Text; // считываем название книги aCirculationString := SpinEditCirculation.Text; // считываем тираж if ((not aBookName.IsEmpty) and (not aCirculationString.IsEmpty)) then // если edit заполнен begin book := TBook.Create(aBookName, StrToInt(aCirculationString)); // создаём книгу aBookName := StringGridBooks.Cells[0, StringGridBooks.Row]; // сохраняем название предшествующей if (not aBookName.IsEmpty) then // проверка на заполненность полей author.AddBefore(book, aBookName) // добалвяем книгу else ShowMessage('Ошибка добавления'); LoadAuthors(); // перезагружаем таблицу авторы LoadBooks(author); // перезагружаем таблицу книги end else ShowMessage('Заполните всё поля'); end; UpdateBtnState(); end; procedure TForm1.ButtonAddFirstBookClick(Sender: TObject); var author: TAuthor; book: TBook; aBookName, aCirculationString: string; begin author := SelectedAuthor; if (author <> nil) then begin aBookName := EditBookName.Text; // считываем название книги aCirculationString := SpinEditCirculation.Text; // считываем тираж if ((not aBookName.IsEmpty) and (not aCirculationString.IsEmpty)) then // если edit заполнен begin book := TBook.Create(aBookName, StrToInt(aCirculationString)); // создаём книгу author.AddFirst(book); // добавляем книгу LoadAuthors(); // перезагружаем таблицу авторы LoadBooks(author); // перезагружаем таблицу книги end else ShowMessage('Заполните адрес'); end; UpdateBtnState(); end; procedure TForm1.ButtonDeleteAuthorClick(Sender: TObject); begin if (aPublishing.GetAuthorCount > 0) then // если что удалять begin aPublishing.DeleteAuthor(); // удаляем LoadAuthors(); // перезагружаем таблицу авторы end else ShowMessage('Нечего удалять'); UpdateBtnState(); end; procedure TForm1.ButtonDeleteBookClick(Sender: TObject); var aName: string; author: TAuthor; begin // удялаем - выбранный в таблице элемент aName := StringGridBooks.Cells[0, StringGridBooks.Row]; author := SelectedAuthor(); if ((author <> nil) and (not aName.IsEmpty)) then begin if not author.Delete(aName) then ShowMessage('Ошибка удаления'); LoadAuthors(); LoadBooks(author); end; UpdateBtnState(); end; procedure TForm1.EditAuthorNameUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); begin case UTF8Key of 'A'..'Z', 'a'..'z', 'а'..'я', 'А'..'Я', #8, #32: ; else UTF8Key := #0; end; end; procedure TForm1.EditCirculationKeyPress(Sender: TObject; var Key: char); begin if not CharInSet(Key, ['0' .. '9', #8]) then Key := #0; end; procedure TForm1.EditBookNameUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char); begin case UTF8Key of 'A'..'Z', 'a'..'z', 'а'..'я', 'А'..'Я','0'..'9', #8, #32: ; else UTF8Key := #0; end; end; procedure TForm1.LoadAuthors(); var item: TAuthor; i: integer; begin ClearGrid(StringGridAuthors); for i := 0 to aPublishing.GetAuthorCount - 1 do// проходим по всем авторам begin item := aPublishing.GetAuthor(i); StringGridAuthors.Cells[0, i + 1] := item.GetAuthorName(); StringGridAuthors.Cells[1, i + 1] := item.GetBooksCount.ToString; StringGridAuthors.Cells[2, i + 1] := item.SumCirculation.ToString; end; LoadBooks(SelectedAuthor); // загружаем связные данные end; procedure TForm1.StringGridAuthorsClick(Sender: TObject); var author: TAuthor; begin author := SelectedAuthor; LoadBooks(author); UpdateBtnState(); end; procedure TForm1.StringGridBooksClick(Sender: TObject); begin UpdateBtnState(); end; procedure TForm1.LoadBooks(aAuthor: TAuthor); var temp: TBook; index: integer; begin ClearGrid(StringGridBooks); if (aAuthor = nil) then exit; if StringGridBooks.RowCount - 1 < aAuthor.GetBooksCount then begin StringGridBooks.RowCount := StringGridBooks.FixedRows + aAuthor.GetBooksCount; //устанавливаем колиество строк end; index := 1; temp := aAuthor.GetHead().GetNext; while (temp <> nil) do begin StringGridBooks.Cells[0, index] := temp.GetBookName; StringGridBooks.Cells[1, index] := temp.GetCirculation.ToString; Inc(index); temp := temp.GetNext; end; ObTirag.Text:=IntToStr(aPublishing.GetObTirag); end; function TForm1.SelectedAuthor: TAuthor; begin Result := nil; if (StringGridAuthors.Row > 0) then if (StringGridAuthors.Row <= aPublishing.GetAuthorCount) then Result := aPublishing.GetAuthor(StringGridAuthors.Row - 1); end; procedure TForm1.UpdateBtnState(); var aAuthor : TAuthor; selectedBook:string; begin aAuthor:= SelectedAuthor; selectedBook := StringGridBooks.Cells[0, StringGridBooks.Row]; ButtonDeleteAuthor.Enabled:= aPublishing.GetAuthorCount > 0; ButtonAddFirstBook.Enabled := (aAuthor <> nil) and (aAuthor.GetBooksCount = 0); ButtonAddBookAfter.Enabled := (aAuthor <> nil) and (not selectedBook.IsEmpty) and (aAuthor.GetBooksCount > 0); ButtonAddBookBefore.Enabled := (aAuthor <> nil) and (not selectedBook.IsEmpty) and (aAuthor.GetBooksCount > 0); ButtonDeleteBook.Enabled := (aAuthor <> nil) and (not selectedBook.IsEmpty) and (aAuthor.GetBooksCount > 0); end; procedure TForm1.ClearGrid(aStringGrid: TStringGrid); var i: integer; j: integer; begin for i := 0 to aStringGrid.ColCount - 1 do for j := 1 to aStringGrid.RowCount - 1 do aStringGrid.Cells[i, j] := ''; end; end. unit unitPublishing; interface uses Classes, unitAuthor, unitBook; type TPublishing = class // класс издетальство private AuthorCount: integer; // количество авторов AuthorList: array of TAuthor; // динамичесий массив ObTirag:integer; public constructor Create(aSize: integer); function GetAuthorCount(): integer; // чтение количества авторов function GetObTirag:integer; // подсчёт общего тиража издательства procedure AddAuthor(aAuthor: TAuthor);// добавление автора function DeleteAuthor(): boolean; // удаление автора function GetAuthor(index: integer): TAuthor; // получает автора по номеру в очереди function SumCirculation: integer; // суммарный тираж procedure Save(Filename: string); // сохранение структуры в файл procedure Load(Filename: string); // загрузка структуры из файла end; implementation constructor TPublishing.Create(aSize: integer); begin AuthorCount := 0; SetLength(AuthorList, aSize); // устанавливаем изначальную размерность массива end; function TPublishing.GetAuthorCount(): integer; begin Result := AuthorCount; end; function TPublishing.GetObTirag:integer; Var i:integer; begin ObTirag:=0; if AuthorCount=0 then result:=0 else begin for i:= 0 to AuthorCount-1 do begin ObTirag:=ObTirag+ AuthorList[i].SumCirculation; end; result:=ObTirag; end; end; procedure TPublishing.AddAuthor(aAuthor: TAuthor); begin if (AuthorCount = Length(AuthorList)) then // если мест нет, увеличиваем размер массива begin SetLength(AuthorList, Length(AuthorList) * 2); end; AuthorList[AuthorCount] := aAuthor;// добавляем в конец массива новый элемент Inc(AuthorCount); // увеличиваем счётчик числа элементов end; function TPublishing.DeleteAuthor(): boolean; var i: integer; begin Result := False; if (AuthorCount > 0) then begin for i := 0 to AuthorCount - 2 do AuthorList[i] := AuthorList[i + 1]; // перемещает ячейки на одну влево Dec(AuthorCount); // уменьшаем счётчик числа элементов Result := True; end; end; function TPublishing.GetAuthor(index: integer): TAuthor; begin Result := AuthorList[index]; end; function TPublishing.SumCirculation: integer; var i: integer; begin Result := 0; for i := 0 to AuthorCount - 1 do begin Result := Result + AuthorList[i].SumCirculation; end; end; procedure TPublishing.Save(Filename: string); var f: Textfile; author: TAuthor; book: TBook; i: integer; |