Файл: Разработка объектной программы для обработки данных о авторах издательства.docx

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 18.03.2024

Просмотров: 154

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


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;


begin

Assign(f, Filename); // соединяем файл с переменной

rewrite(f); // Открываем файл на запись

for i := 0 to AuthorCount - 1 do // проходим по всем авторам

begin

author := AuthorList[i];

writeln(f, author.GetAuthorName); // запись фамилии автора

writeln(f, author.GetBooksCount); // запись количества книг

book := author.GetHead.GetNext;

while (book <> nil) do// проходим по всем книгам

begin

writeln(f, book.GetBookName); // запись названия книги

writeln(f, book.GetCirculation); // запись тиража
book := book.GetNext; // переходим к след элементу

end;

end;

CloseFile(f);

end;
procedure TPublishing.Load(Filename: string);

var

aFile: Textfile;

author: TAuthor; // экземпляр автора

tauthorCount: integer; // количество авторов

aAuthorName: string; // фамилия автора

i: integer;

book: TBook; // экземпляр книги

aBookName: string; // название книги

aCirculation: integer; // тираж

lastBook: TBook; // закладка - ссылка на посл добавленную книгу

begin

AssignFile(aFile, Filename);

reset(aFile);

while not EOF(aFile) do

begin

lastBook := nil;

Readln(aFile, aAuthorName); // фамилия автора

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);// создаём книгу

if author.GetBooksCount = 0 then

author.AddFirst(book) // добавляем первую книгу

else

author.AddAfter(book, lastBook.GetBookName); // добавляем в конец

lastBook := book; // сохраняем последнюю добавленную книгу

end;

AddAuthor(author); // добавляем автора в издательство

end;

CloseFile(aFile);

end;

unit unitAuthor;
interface
uses

Classes, uniTBook;
type

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;
implementation
constructor TAuthor.Create(aAuthorName: string);

begin

AuthorName := aAuthorName;

Head := TBook.Create('', 0); // создаём заголовок

BooksCount := 0;

end;
function TAuthor.GetAuthorName(): string;

begin

Result := AuthorName;

end;
procedure TAuthor.SetAuthorName(aAuthorName: string);

begin

AuthorName := aAuthorName;

end;
function TAuthor.GetBooksCount(): integer;

begin

Result := BooksCount;

end;
function TAuthor.GetHead(): TBook;

begin

Result := Head;

end;
procedure TAuthor.AddFirst(aBook: TBook);

begin

begin

Head.SetNext(aBook); // Изменяеем ссылку на след у заголовка на новый

BooksCount := BooksCount + 1;

end;

end;
function TAuthor.AddAfter(aBook: TBook; aBookName: string): boolean;

var

temp: TBook;

begin

Result := False;

temp := Search(aBookName); // поиск книги

if (temp <> nil) then // при её нахождении

begin

aBook.SetNext(temp.GetNext);// настриваем ссылки

temp.SetNext(aBook);

BooksCount := BooksCount + 1; // увеличиваем счетчик

Result := True;

end;

end;
function TAuthor.AddBefore(aBook: TBook; aBookName: string): boolean;

var

temp, prev: TBook;

begin

Result := False;

temp := Search(aBookName, prev); // поиск книги и её предшественника

if (temp <> nil) then // при её нахождении

begin

aBook.SetNext(prev.GetNext); // настриваем ссылки

prev.SetNext(aBook);

BooksCount := BooksCount + 1; // увеличиваем счетчик

Result := True;

end;

end;
function TAuthor.Delete(aBookName: string): boolean;

var

temp, prev: TBook;

begin

Result := False;

temp := Search(aBookName, prev); // поиск книги и её предшественника

if (prev <> nil) then // при нахождении

begin

prev.SetNext(temp.GetNext);// настриваем ссылки

temp := nil;

BooksCount := BooksCount - 1;// увеличиваем счётчик

Result := True;

end;

end;
function TAuthor.Search(aLastName: string): TBook;

var

temp: TBook;

begin

Result := nil;

temp := Head.GetNext; // установка переменной в начало списка

while temp <> nil do // организация цикла до достижения заголовка

if temp.GetBookName = aLastName then// в случае нахождения прерывание

begin

Result := temp;

break;

end

else

temp := temp.GetNext;// переход к следующему

end;
function TAuthor.Search(aLastName: string; var pPrev: TBook): TBook;

var

temp: TBook;

begin

Result := nil;

pPrev := Head;

temp := Head.GetNext;// установка переменной в начало списка

while (temp <> nil) do // организация цикла до достижения заголовка

begin

if (aLastName = temp.GetBookName) then // в случае нахождения прерывание

begin

Result := temp;

break;

end

else

begin

pPrev := temp; // Запомнимаем предыдущего

temp := temp.GetNext;// переходим к следующему

end;

end;

end;
function TAuthor.SumCirculation: integer;

var

temp: TBook;

begin

Result := 0;

temp := Head.GetNext;

while (temp <> nil) do

begin

Result := Result + temp.GetCirculation;

temp := temp.GetNext;


end;

end;
end.

unit unitBook;
interface
uses

Classes;
type

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;
implementation
constructor TBook.Create(aBookName: string; aCirculation: integer);

begin

BookName := aBookName;

Circulation := aCirculation;

end;
function TBook.GetNext: TBook;

begin

Result := Next;

end;
procedure TBook.SetNext(aNext: TBook);

begin

Next := aNext;

end;
function TBook.GetBookName: string;

begin

Result := BookName;

end;
procedure TBook.SetBookName(aBookName: string);

begin

BookName := aBookName;

end;
function TBook.GetCirculation: integer;

begin

Result := Circulation;

end;
procedure TBook.SetCirculation(aCirculation: integer);

begin

Circulation := aCirculation;

end;
end.