Разработка объектной программы для обработки данных о авторах издательства». 4 этап переделанный 2. Разработка объектной программы для обработки данных о авторах издательства
Скачать 183.44 Kb.
|
Формализованное описание разработанных классовКласс «Автор»: TAuthor = class // класс автор private AuthorName: string; // фамилия автора BooksCount: integer; // количество книг Head: TBook; // ссылка на заголовок public constructor Create(aAuthorName: string); function GetAuthorName(): string; function GetBooksCount(): integer; function GetHead(): TBook; procedure SetAuthorName(aAuthorName: string); procedure AddFirst(aBook: TBook); // добавляет в начало function AddAfter(aBook: TBook; aBookName: string): boolean; // добавление после заданного function AddBefore(aBook: TBook; aBookName: string): boolean; // добавление перед заданным function Delete(aBookName: string): boolean; // удаление function Search(aLastName: string): TBook; overload; // поиск обычный function Search(aLastName: string; var pPrev: TBook): TBook; overload; // поиск с возвратом предшетсвенника function SumCirculation: integer; // суммарный тираж end; Класс «Книга»: TBook = class // класс книга private BookName: string; // название книги Circulation: integer; // тираж Next: TBook; // след книга public constructor Create(aBookName: string; aCirculation: integer); function GetNext: TBook; function GetBookName: string; function GetCirculation: integer; procedure SetNext(aNext: TBook); procedure SetBookName(aBookName: string); procedure SetCirculation(aCirculation: integer); end; Класс «Издательство »: 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 Описание демонстрационного модуляПри запуске программы появляется следующее окно: Рис.8 Оконное приложение В программе используются компоненты: StringGrid1, этот компонент используется для отображения информации в табличном виде, где текст распределяется по ячейкам. Таблица StringGrid состоит из выделенных серым FixedCols и FixedRows - зафиксированных ячеек-заголовков, и обычных, белых ячеек. Содержимое Fixed ячеек недоступно редактированию, и меняется только программно. За возможность редактирования обычных ячеек отвечает значение свойства Edit в Options. Компонент StringGrid имеет возможность адресации каждой отдельной ячейки по номеру столбца и строки. Содержимое ячейки (i, j), где где i - номер столбца, j - номер строки, имеет вид StringGrid1.Cells[i, j] и доступно как для чтения, так и для записи. Здесь, как и всегда, номера столбцов ( i ) и строк ( j ) отсчитываются от 0. Выделенная ячейка таблицы имеет номер столбца: StringGrid1.Col номер строки: StringGrid1.Row Компонент MainMenu не визуальный, то есть, хотя и отображается на прототипе Формы как небольшой квадрат, в работающей программе не будет виден. Опции главного меню создаются с помощью специального редактора. Редактор меню вызывается с помощью двойного щелчка по компоненту MainMenu. Опции этой программы: Сохранить и Загрузить. SaveDialog и OpenDialog – визуальные компоненты, позволяющие открывать любые файлы и работать с файлами. Диалоги используются для выбора пользователем имени файла, предназначенного для сохранения либо загрузки. FileName – выдает имя файла, заданное по умолчанию. Компонент Button это простая командная кнопка. Командная кнопка Button используется для реализации в программе команд с помощью обработчика события OnClick этого компонента. Компонент Label предназначен для отображения статического текста, то есть надписей и меток на Форме, которые не меняются в течение всего времени работы программы. Текст надписи, отображаемый компонентом Label можно изменить только программно. Компонент Edit представляет собой однострочное текстовое поле, служащее для ввода данных пользователем. Основным свойством компонента Edit, передающим введённую информацию, является свойство Edit1.Text типа String. Событие KeyPress и UTF8KeyPress компонента Edit позволяют программно контролировать вводимые данные. Так, обработчик события принимает 2 аргумента: Sender: TObject; var Key: Char. Параметр Key отображает последний введенный символ. Для контроля ввода только чисел достаточно проверить находится ли Key в диапазоне цифр от 0 до 9. Алгоритм сохранения: Соединяем файл с переменной: Assign(f, Filename); Открываем файл на запись: rewrite(f); проходим по всем авторам: for i := 0 to AuthorCount - 1 do В теле цикла: адресуем указатель author в текущий элемент массива: author := AuthorList[i]; Записываем все поля в файл writeln(f, author.GetAuthorName); // запись фамилии автора writeln(f, author.GetBooksCount); // запись количества книг Адресуем указатель book на первого автора: book := author.GetHead.GetNext; Проходим по всем книгам while (book <> nil) do// проходим по всем книгам В теле цикла записываем все поля в файл writeln(f, book.GetBookName); // запись названия книги writeln(f, book.GetCirculation); // запись тиража Переходим к след книге book := book.GetNext; // переходим к след элементу Закрываем файл: CloseFile(f); В результате сохранения данных будет сформирован текстовый файл Рис.9 Результат сохранения Алгоритм загрузки файла: Соединяем файл с переменной: Assign(aFile, Filename); Открываем файл на чтение: reset(aFile); Организуем цикл до конца файла: while not EOF(aFile) do В теле цикла Считываем все поля и создаем автора author := TAuthor.Create(aAuthorName); // создаём автора Считываем количество авторов: Readln(aFile, tauthorCount); // считываем количество авторов В дополнительном цикле считываем книги for i := 1 to tauthorCount do begin Readln(aFile, aBookName); // считываем название книги Readln(aFile, aCirculation); // считываем тираж book := TBook.Create(aBookName, aCirculation);// создаём книгу Добавляем книгу author.AddFirst(book) // добавляем первую книгу Добавляем автора в очередь: AddAuthor(author); Закрываем файл: CloseFile(aFile); В демонстрационном модуле реализованы следующие обработчики: procedure ButtonAddAuthorClick(Sender: TObject); // Обработчик добавления автора procedure ButtonAddBookAfterClick(Sender: TObject); // обработчик добавления книги после procedure ButtonAddBookBeforeClick(Sender: TObject);// Обработчик добавление книги до procedure TForm1.ButtonAddFirstBookClick(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 MenuItemLoadClick(Sender: TObject); // Обработчик загрузки из фалйла procedure MenuItemSaveClick(Sender: TObject); обработчик сохранения в файл procedure GridAuthorsClick(Sender: TObject); // Обработчик клика по гриду с авторами procedure LoadAuthors();//загружает данные об авторах procedure LoadBooks(aAuthor: TAuthor);Grid(aOffice: TOffice); // загружает данные о книгах procedure ClearGrid(aStringGrid: TStringGrid); // очищает указанный грид function SelectedAuthor: TAuthor;// возвращает выбранного в таблице автора procedure UpdateSumLabel(); // обновляет label с суммой всех окладов |