- •Министерство образования и науки рф
- •1Общие требования
- •2Последовательность выполнения работы
- •3Порядок контроля и приёмки
- •4Пример выполнения работы
- •Создание mdi оболочки приложения. Определение структур данных в соответствии с заданием
- •4.1.1Создание mdi оболочки приложения
- •4.1.2Определение структур данных
- •4.2Добавление строк в таблицы, а также добавление фотографий
- •4.2.1Создание диалога для добавления строк в таблицы
- •4.2.2Объявление переменных, для хранения таблиц. Их инициализация и удаление
- •4.2.3Добавление строки в таблицу
- •4.2.4Загрузка изображения
- •4.2.5Отображение графического окна
- •Отображение строк таблиц
- •4.2.6Создание графического окна для отображения строк таблиц
- •4.2.7Вывод строк таблицы на экран
- •4.2.8Отображение графического окна
- •4.3Сохранение структур данных таблиц в файлы
- •4.4Чтение данных таблиц из файлов и заполнение соответствующих структур в памяти
- •4.5Реализация операций манипулирования над данными для каждой таблицы: изменение, удаление и сохранение значений в таблицах
- •4.5.1Реализация функции изменения строк таблицы на базе имеющегося диалога для добавления строк
- •4.5.2Вызов диалога добавления / изменения строк
- •4.5.3Удаление строк таблицы
- •4.6Создание фильтра строк по заданным условиям для каждой таблицы
- •4.7Реализация запросов на выбор данных из одной или нескольких таблиц
- •5Практические задания для самостоятельной работы
- •5.1Вариант 1
- •5.2Вариант 2
- •5.3Вариант 3
- •5.4Вариант 4
- •5.5Вариант 5
- •5.6Вариант 6
- •5.7Вариант 7
- •5.8Вариант 8
- •5.9Вариант 9
- •5.10Вариант 10
- •5.11Вариант 11
- •5.12Вариант 12
- •5.13Вариант 13
- •5.14Вариант 14
- •5.15Вариант 15
- •5.16Вариант 16
- •5.17Вариант 17
- •5.18Вариант 18
- •5.19Вариант 19
- •Список рекомендуемой литературы
4.5.1Реализация функции изменения строк таблицы на базе имеющегося диалога для добавления строк
Создавать отдельный диалог для изменения значений строки таблицы не будем, а вместо этого воспользуемся имеющимся диалогом добавления строки, расширив имеющуюся функциональность диалога (см. раздел 4.2). Подход использования единого объекта для двух операций (добавления / изменения) позволит избежать дублирования программного кода.
Дополним раздел объявления переменных-членов класса диалога TfmStudent следующими переменными.
Объявление дополнительных переменных в классе TfmStudent
// файл fmStudentUnit.h, класс TfmStudent
private: // User declarations
...
// Определяет режим создания диалога: true – добавление, false - изменение
bool AddAction;
// Значение первичного ключа обновляемой строки
AnsiString No;
Также воспользуемся одним из постулатов ООП и добавим перегруженный вариант конструктора объекта, который позволит создавать диалог в режиме изменения значений выбранной строки таблицы.
Объявление перегруженного конструктора в классе TfmStudent
// файл fmStudentUnit.h, класс TfmStudent
public: // User declarations
...
__fastcall TfmStudent(TComponent* Owner, AnsiString No);
Перегруженный вариант конструктора объекта, как и базовый вариант конструктора, принимает параметр TComponent* Owner – указатель на родительский объект, но в отличие от базового варианта также принимает дополнительный параметр AnsiString No – который используется для однозначного получения содержимого изменяемой строки.
Правилом «хорошего тона» в программировании является присваивание всем объявляемым переменным умалчиваемых значений. Поэтому базовый вариант конструктора необходимо дополнить следующим программным кодом.
Инициализация переменных умалчиваемыми значениями
// файл fmStudentUnit.cpp, класс TfmStudent
__fastcall TfmStudent::TfmStudent(TComponent* Owner)
: TForm(Owner)
{
this->AddAction = true;
this->No = "";
...
}
Реализация перегруженного варианта конструктора для изменения строки будет отличаться от реализации конструктора базового варианта.
Реализация перегруженного конструктора класса 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 необходимо модифицировать обработчик нажатия клавиши ОК.
Реализация перегруженного конструктора класса 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);
}
}