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

4.5.2Вызов диалога добавления / изменения строк

Для того чтобы производить добавление / изменение строк, для клавиш «Добавить» и «Изменить» диалога TfmStudentTable создайте необходимые обработчики нажатия.

    1. Реализация обработчика нажатия клавиши «Добавить»

// файл fmStudentTableUnit.cpp, класс TfmStudentTable

void __fastcall TfmStudentTable::btAddClick(TObject *Sender)

{

// Создание и выделение памяти для графического окна

TfmStudent *fmStudent = new TfmStudent(this);

// Отображение графического окна

if (fmStudent->ShowModal() == mrOk)

Refresh();

// Удаление окна

delete fmStudent;

}

    1. Реализация обработчика нажатия клавиши «Изменить»

// файл fmStudentTableUnit.cpp, класс TfmStudentTable

void __fastcall TfmStudentTable::btUpdateClick(TObject *Sender)

{

if (lvList->Selected == NULL)

return ;

AnsiString No = lvList->Selected->Caption;

// Создание и выделение памяти для графического окна

TfmStudent *fmStudent = new TfmStudent(this, No);

// Отображение графического окна

if (fmStudent->ShowModal() == mrOk)

Refresh();

// Удаление окна

delete fmStudent;

}

Использованный метод Refresh() позволяет обновлять содержимое окна, после обновления состава строк таблицы.

4.5.3Удаление строк таблицы

Для того чтобы производить удаление строк, для клавиши «Удалить» диалога TfmStudentTable создайте обработчик нажатия.

    1. Реализация обработчика нажатия клавиши «Удалить»

// файл fmStudentTableUnit.cpp, класс TfmStudentTable

void __fastcall TfmStudentTable::btDeleteClick(TObject *Sender)

{

if (Application->MessageBox("Вы действительно хотите удалить выбранную строку?", "Внимание", MB_OKCANCEL) == IDCANCEL)

return ;

if (lvList->Selected == NULL)

return ;

AnsiString No = lvList->Selected->Caption;

TStudent *student;

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

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

{

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

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

break ;

}

// Исключеие указателя из общего списка строк таблицы

MainForm->Students->Remove(student);

// Освобождение памяти, занимаемой строкой

delete student;

Refresh();

}

4.6Создание фильтра строк по заданным условиям для каждой таблицы

В соответствии с пунктом 8 «Общих требований» для каждой таблицы предусмотреть фильтр строк, обладающий следующими возможностями:

  • выбор одного из условий сравнения: равно, не равно;

  • выбор одного или нескольких полей таблицы для сравнения;

  • применение одного условия или объединения по «И» двух и более условий для осуществления логического поиска;

  • вывод результата работы фильтра строк на экран в табличном виде.

Для реализации фильтра строк воспользуемся созданным ранее в разделе диалогом. Совмещение в одном окне функций полного просмотра таблицы и просмотра строк удовлетворяющих логическому условию позволит наглядно анализировать правильность работы фильтра строк.

Разместите необходимые графические элементы в окне, при этом не забывая присваивать осмысленные наименования объектам. Для включения / отключения использования столбца таблицы при проверке условия удобно будет воспользоваться объектом TCheckBox. Примерный вид окна представлен на рисунке 4.6.

Рисунок 4.6 – Расширенное окно просмотра строк таблицы с возможностью фильтрации строк

Для реализации функции фильтрации строк необходимо сформировать обработчик нажатия клавиши «Применить». Логику работы фильтра строк можно описать следующим образом:

  1. Организовать цикл по всем строкам таблицы

  2. Получить очередную i-ую строку

  3. Проверить использование первого столбца таблицы при поиске строк. Если столбец используется перейти к Шагу 3.1, иначе к Шагу 4.

    1. Проверить на равенство значение первого столбца таблицы i-ой строки и значение заданное в фильтре. Сохранить результат сравнения.

    2. Если выбранное условие равенства для первого столбца таблицы задано как «равно» и сохранённый результат сравнения на Шаге 3.1 «ложь», пропустить i-ую итерацию цикла и перейти к Шагу 2.

    3. Если выбранное условие равенства для первого столбца таблицы задано как «не равно» и сохранённый результат сравнения на Шаге 3.1 «истина», пропустить i-ую итерацию цикла и перейти к Шагу 2.

  4. Выполнить действия, описанные в Шаге 3, для остальных столбцов таблицы

  5. Выполнение этого шага производится, только если каждое из используемых условий «истинно». Вывести i-ую строку на экран

  6. Перейти к шагу 2

Ниже приведён пример программного кода, который осуществляет поиск строк, удовлетворяющих заданному критерию поиска.

    1. Реализация обработчика нажатия клавиши «Применить»

// файл fmStudentTableUnit.cpp, класс TfmStudentTable

void __fastcall TfmStudentTable::btApplyClick(TObject *Sender)

{

lvListFilter->Clear();

imPhotoFilter->Picture->Bitmap = NULL;

TListItem *item;

TStudent *student;

bool Equal = false;

// Поиск в таблице студентов

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

{

// Получение i-ой строки таблицы текущей таблицы

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

// Проверка использования столбца

if (chbNo->Checked == true)

{

Equal = (student->No.AnsiCompareIC(edNoValue->Text) == 0) ? true : false;

// выбрано условие равенства

if (cbNoCondition->Text == "равно" && Equal != true)

continue ;

// выбрано условие не равенства

if (cbNoCondition->Text == "не равно" && Equal == true)

continue ;

}

if (chbFio->Checked == true)

{

Equal = (student->Fio.AnsiCompareIC(edFioValue->Text )== 0) ? true : false;

if (cbFioCondition->Text == "равно" && Equal != true)

continue ;

if (cbFioCondition->Text == "не равно" && Equal == true)

continue ;

}

...

...

// Только если каждое из заданных условий истинно, добавлять и выводить на экран строку

item = lvListFilter->Items->Add();

item->Caption = student->No;

item->SubItems->Add(student->Fio);

...

}

}