Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК ПП1 (C++ БД).doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
5.01 Mб
Скачать

Работа 2.7. Поиск и фильтрация

[1], с.588-591, 611-615

Цель: Изучение способов построения фильтров

Результат: Получить интерфейс, аналогичный рис. 118.

Рис. 118. Организация фильтров

Последовательность действий.

  1. Установите на интерфейсе группу управляющих компонентов в соответствии с рис. 118.

  2. Для ComboBox1 выберите событие OnChange (при изменении) и запишите обработчик, создающий фильтр, например:

void __fastcall TForm1::ComboBox1Change(TObject *Sender)

{ tSpisok->Filtered=true;

tSpisok->Filter= "(Gorod='"+ComboBox1->Text+"')";

}

  1. Постройте обработчик щелчка по кнопке «Снять фильтр», записав в нём команду:

tSpisok->Filtered=false

  1. Скомпилируйте и выполните программу и убедитесь в правильности построенного фильтра.

  2. Самостоятельно разберитесь в других методах построения фильтров:

    • способом прямого перебора записей таблицы и отбора тех строк, которые отвечают условию фильтрации;

    • методом SetRange.

  3. Организуйте быстрый поиск по полю «ФИО»: когда в окне поиска с пульта вводится очередная буква запроса на поиск, курсор в таблице автоматически устанавливается на первую запись, в которой напечатанный запрос входит как подстрока (рис. 119).

Если окно запроса имеет имя edPoisk, то процедура поиска может быть записана так:

void __fastcall TForm1::edPoiskChange(TObject *Sender)

{ TLocateOptions Regim; //тип переменной Regim объявлен как TLocateOptions,

//который используется только в функции поиска Locate

Regim<<loPartialKey; //loPartialKey системное значение режима

//"Поиск по частичному совпадению значения поля"

tSpisok->Locate("FIO",Trim(edPoisk->Text),Regim); // запрос на поиск по

//частичному совпадению строки запроса

}

Рис. 119. Быстрый поиск – ввод первой буквы

Когда введена вторая буква, курсор перемещается на вхождение подстроки «Ши» (рис. 120).

Рис. 120. Быстрый поиск – ввод второй буквы.

Содержание отчёта: см.п. 3.5 «Требования к оформлению отчетов по лабораторным работам».

Работа 2.8. Особенности сохранения изображений в бд

[1], с.239-244, 373-382

Цель: Изучение способов работы с изображениями в базе данных.

Результат: Получить интерфейс, аналогичный рис. 121.

Рис. 121. Работа с изображениями

Последовательность действий.

  1. Создайте вспомогательную директорию , например Kartinki, и занесите туда несколько изображений. Эти рисунки обязательно должны иметь формат BMP.

  2. С помощью утилиты DBD создайте файл vid.db базы данных для работы с изображениями. Пример структуры такого файла представлен на рис. 122.

Рис. 122. Примерная структура файла БД для хранения изображений

Назначение полей:

Поле

Назначение

Npp

Уникальный ключ, поле с автоматическим приращением значения на 1 при добавлении новой записи к файлу (автоинкрементное поле)

Naim

Наименование рисунка

Photo

Поле для хранения собственно изображения. Его тип – G(graphic), размер поля не указывается, так как память под него выделяется динамически при присвоении этому полю значения картинки – см.листинг программы

Path

Системный путь к каталогу, откуда взят рисунок. В данном примере он используется только в информационном плане

Memo

Текстовая сопутствующая информация

Создайте также вторичный индекс indVidNaim по полю Naim для сортировки рисунков по алфавиту.

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

Рис. 123. Интерфейс программы работы с изображениями

  1. Запишите обработчики событий по образцу листинга программы, представленного на рис. 124

#include <vcl.h>

#pragma hdrstop

#include "uGlav.h"

#include "jpeg.hpp"

#pragma package(smart_init)

#pragma resource "*.dfm"

AnsiString ModeTSyn;

TForm2 *Form2;

// - - - - - - - -процедура вывода количества строк - - - - - - - -

void ShowKol()

{Form2->lblKol->Caption="Всего фото "+IntToStr(Form2->tVid->RecordCount);

}

// - - - - - - - -процедура «Показать кнопки» - - - - - - -

void ShowButtons()

{Form2->bDob->Show();Form2->bZam->Show();Form2->bUda->Show();Form2->bPath->Show();

}

Рис. 124. Листинг программы работы с изображениями надёжного ввода (начало, продолжение на следующей странице)

// - - - - - - - -процедура «Спрятать кнопки» - - - - - - -

void HideButtons()

{Form2->bDob->Hide();Form2->bZam->Hide();Form2->bUda->Hide();Form2->bPath->Hide();

}

//-----------конструктор объекта-----------------------------------------------------------

__fastcall TForm2::TForm2(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

void __fastcall TForm2::FormCreate(TObject *Sender)

{tVid->Open(); ShowKol();

}

//---------------------------------------------------------------------------

void __fastcall TForm2::FormActivate(TObject *Sender)

{ Image1->Hide(); tVid->IndexName="indVidNaim";

}

//---------------------------------------------------------------------------

void __fastcall TForm2::bExitClick(TObject *Sender)

{ Close();

}

//--------Д О Б А В И Т Ь - - - - - - - - - - - - - - - - - - - - - - - - -

void __fastcall TForm2::bDobClick(TObject *Sender)

{ HideButtons();

if (OpenPictureDialog1->Execute())

{ Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

tVid->Insert();

tVid->FieldByName("Photo")->Assign(Image1->Picture);

tVid->FieldByName("Naim")->AsString=s;

tVid->FieldByName("Path")->AsString=s;

tVid->Post();

ShowKol();

}// конец if

ShowButtons();

}//конец bDobClick

//----З А М Е Н И Т Ь --------------------------------------------

void __fastcall TForm2::bZamClick(TObject *Sender)

{AnsiString s; int n;

s="Уточните действие:\nЗаменить только изображение, сохранив надписи (Yes)";

s=s+"\nЗаменить все элементы (All) ";

HideButtons();

Рис. 124. Листинг программы работы с изображениями надёжного ввода (продолжение, далее см. следующую страницу)

if (OpenPictureDialog1->Execute())

{ tVid->Edit();

Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);

/* здесь используется числовая переменная n, принимающая формальное числовое значение той кнопки, на которую нажмёт пользователь. В системе установлено такое соответствие:

кнопке Yes соответствует число 6

- - - - - All - 8

Cancel 2

Далее переменная n используется как аргумент переключателя switch*/

*/

n=MessageDlgPos(s,

mtConfirmation, TMsgDlgButtons()<< mbYes<< mbAll<<mbCancel,0,300,400);

switch (n)

{case 6:{tVid->FieldByName("Photo")->Assign(Image1->Picture);//Yes

tVid->Post();

break;}

case 8:{tVid->FieldByName("Photo")->Assign(Image1->Picture);//All

tVid->FieldByName("Naim")->AsString=OpenPictureDialog1->FileName;

tVid->FieldByName("Path")->AsString=OpenPictureDialog1->FileName;

tVid->Post();

break;}

case 2:{ tVid->Cancel();break;}//Cancel

}

}

ShowButtons();

}//конец bZamClick

//-- кнопка удаления строки файла изображений ---------------------------

void __fastcall TForm2::bUdaClick(TObject *Sender)

{

HideButtons();

if (MessageDlgPos("Подтвердите удаление фото "+

tVid->FieldByName("Naim")->AsString,

mtConfirmation, TMsgDlgButtons()<< mbYes<< mbNo,0,350,400)==mrYes)

{tVid->Delete();ShowKol();

}

ShowButtons();

}// конец bUdaClick

Рис. 124. Листинг программы работы с изображениями надёжного ввода (продолжение, далее см. следующую страницу)

//----кнопка управления видимостью пути к картинке-----------------------

void __fastcall TForm2::bPathClick(TObject *Sender)

{ if (lblPath->Visible==true)

{lblPath->Visible=false;DBText1->Visible=false;

bPath->Caption="Показать путь";

}

else {lblPath->Visible=true;DBText1->Visible=true;

bPath->Caption="Спрятать путь";

}

}// конец блока bPathClick

//--конец программы-----------------------------------------------------------

Рис. 124. Листинг программы работы с изображениями надёжного ввода (окончание, начало см. предыдущую страницу)

Обратите внимание на прием, позволяющий записать рисунок в базу данных – это метод Assign (назначить) в команде

tVid->FieldByName("Photo")->Assign(Image1->Picture);

эта команда динамически выделяет столько памяти, сколько места занимает объект Image1->Picture, и записывает эти байты в автоматически построенный вспомогательный файл vid.mb, а в поле Photo заносится ссылка на него. Такой прием называется «внедрение» объекта (embedding). В результате файл изображений получается достаточно объёмным (см. файл vid.mb в рабочем каталоге программы) , но он хранит в себе все рисунки, работает быстро и не зависит от местоположения исходных картинок.

А

Алгоритм записи изображения в базу данных состоит из двух этапов:

  1. Из директории изображений загрузить в компонент TImage нужный рисунок.

  2. Присвоить информацию из TImage соответсвующему полю файла базы данных.

ргументом метода Assign может служить только рисунок, находящийся в компоненте TImage, поэтому и приходится помещать на форме этот вспомогательный объект. Непосредственно присвоить полю Photo информацию из рисунка, хранящегося на диске, невозможно, поэтому

Студенту следует по источнику [1] самостоятельно ознакомиться со способом передачи данных в файл изображений через системный буфер обмена ClipBoard.

Содержание отчёта: см.п. 3.5 «Требования к оформлению отчетов по лабораторным работам».