Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ЛР по ОС.doc
Скачиваний:
3
Добавлен:
04.05.2019
Размер:
735.23 Кб
Скачать

4.5.1Реализация функции изменения строк таблицы на базе имеющегося диалога для добавления строк

Создавать отдельный диалог для изменения значений строки таблицы не будем, а вместо этого воспользуемся имеющимся диалогом добавления строки, расширив имеющуюся функциональность диалога (см. раздел 4.2). Подход использования единого объекта для двух операций (добавления / изменения) позволит избежать дублирования программного кода.

Дополним раздел объявления переменных-членов класса диалога TfmStudent следующими переменными.

    1. Объявление дополнительных переменных в классе TfmStudent

// файл fmStudentUnit.h, класс TfmStudent

private: // User declarations

...

// Определяет режим создания диалога: true – добавление, false - изменение

bool AddAction;

// Значение первичного ключа обновляемой строки

AnsiString No;

Также воспользуемся одним из постулатов ООП и добавим перегруженный вариант конструктора объекта, который позволит создавать диалог в режиме изменения значений выбранной строки таблицы.

    1. Объявление перегруженного конструктора в классе TfmStudent

// файл fmStudentUnit.h, класс TfmStudent

public: // User declarations

...

__fastcall TfmStudent(TComponent* Owner, AnsiString No);

Перегруженный вариант конструктора объекта, как и базовый вариант конструктора, принимает параметр TComponent* Owner – указатель на родительский объект, но в отличие от базового варианта также принимает дополнительный параметр AnsiString No – который используется для однозначного получения содержимого изменяемой строки.

Правилом «хорошего тона» в программировании является присваивание всем объявляемым переменным умалчиваемых значений. Поэтому базовый вариант конструктора необходимо дополнить следующим программным кодом.

    1. Инициализация переменных умалчиваемыми значениями

// файл fmStudentUnit.cpp, класс TfmStudent

__fastcall TfmStudent::TfmStudent(TComponent* Owner)

: TForm(Owner)

{

this->AddAction = true;

this->No = "";

...

}

Реализация перегруженного варианта конструктора для изменения строки будет отличаться от реализации конструктора базового варианта.

    1. Реализация перегруженного конструктора класса TfmStudent

// файл fmStudentUnit.cpp, класс TfmStudent

__fastcall TfmStudent::TfmStudent(TComponent* Owner, AnsiString No)

: TForm(Owner)

{

this->AddAction = false;

this->No = No;

// Инициализация графических объектов умалчиваемыми значениями

edNo->Text = "";

edFIO->Text = "";

edGroup->Text = "";

dtBirthday->Date = TDate(2000, 1, 1);

edAddress->Text = "";

Graphics::TBitmap *Photo = new Graphics::TBitmap();

imPhoto->Picture->Bitmap = Photo;

TStudent *student;

int i;

bool Exists = false;

// Поиск в таблице студентов строки с указанным значением ПК = No

for (i = 0; i<MainForm->Students->Count; i++)

{

student = (TStudent *)MainForm->Students->Items[i];

if (student->No.AnsiCompareIC(No) == 0)

{

// Строка была найдена. Прервать цикл

Exists = true;

break ;

}

}

// Если строка была найдена

if (Exists == true)

{

// Инициализация графических объектов значениями из найденной строки

edNo->Text = student->No;

edFIO->Text = student->Fio;

edGroup->Text = student->GroupNo;

dtBirthday->Date = student->Birthday;

edAddress->Text = student->Address;

imPhoto->Picture->Bitmap = student->Photo;

}

// Иначе

else

{

btOk->Enabled = false;

}

}

Теперь при создании объекта TfmStudent в зависимости от типа используемого конструктора диалоговое окно будет создаваться либо в режиме добавления (базовый вариант конструктора), либо в режиме изменения строки (перегруженный вариант конструктора). В завершении обновления объекта TfmStudent необходимо модифицировать обработчик нажатия клавиши ОК.

    1. Реализация перегруженного конструктора класса TfmStudent

// файл fmStudentUnit.cpp, класс TfmStudent

void __fastcall TfmStudent::btOkClick(TObject *Sender)

{

// Объявление указателя на строку в соответствии с типом текущей таблицы

TStudent *student;

if (AddAction == true)

{

// Выделение памяти для новой строки

student = new TStudent();

// Заполнение значений новой строки значениями из элементов графического окна

student->No = edNo->Text;

student->Fio = edFIO->Text;

student->GroupNo = edGroup->Text;

student->Birthday = dtBirthday->DateTime;

student->Address = edAddress->Text;

student->Photo->Assign(imPhoto->Picture->Bitmap);

// Добавление новой строки в общий список строк таблицы

MainForm->Students->Add(student);

}

else

{

for (int i = 0; i<MainForm->Students->Count; i++)

{

student = (TStudent *)MainForm->Students->Items[i];

if (student->No.AnsiCompareIC(No) == 0)

break ;

}

// Заполнение значений новой строки значениями из элементов графического окна

student->No = edNo->Text;

student->Fio = edFIO->Text;

student->GroupNo = edGroup->Text;

student->Birthday = dtBirthday->DateTime;

student->Address = edAddress->Text;

student->Photo->Assign(imPhoto->Picture->Bitmap);

}

}