Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка СУБД MySQL Borland Кузин.doc
Скачиваний:
96
Добавлен:
13.05.2015
Размер:
3 Мб
Скачать
☆
    1. Работа с изображениями в бд

Изображения хранятся в базе данных в поле типа LONGBLOB. КомпонентDBImageпозволяет отображать изображения в форматеbmp.

Добавьте в таблицу детали столбец типа LONGBLOB. Поместите на форму «Детали» компонентыDBImage,OpenPictureDialog,Buttonкак показано на рисунке:

Задайте свойству DataSourceкомпонентаDBImageзначениеDataSource1. СвойствуDataFieldзначениеImage.

Создайте обработчик нажатия кнопки «Загрузить»:

ADODataSet1->Edit();

if (OpenPictureDialog1->Execute())

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

При загрузке изображения следует учесть, что в компонент DBImage способен работать только с изображениями в формате Windows Bitmap, а также «не умеет» масштабировать изображения.

    1. Имитация выпадающего списка в ячейке dbGrid

Для имитации выпадающего списка в ячейке DBGridнеобходимо создать компонентDBLookupComboBox, который будет автоматически размещаться поверх ячейкиDBGrid. В качестве примера создадим выпадающий список для выбора города в форме «Проекты».

Откройте форму «Проекты» и дополнительно поместите на нее компоненты ADODataSet,DataSource,DBLookupComboBoxкак показано на рисунке.

Свяжите ADODataSet с ADOConnection, DataSource с ADODataSet. Задайте свойству CommandText компонента ADODataSet значение select * from towns, свойству ListField компонента DBLookupComboBox значение Town, свойству KeyField компонента DBLookupComboBox значение Town_ID, свойству Visible компонента ADODataSet значение False.

Создайте обработчик события OnDrawColumnCellкомпонентаDBGridсо следующим кодом:

{

// если текущая ячейка находится в фокусе и принадлежит столбцу с номером города

if (State.Contains(gdFocused)&& Column->Field == ADODataSet1->Fields->Fields[2])

{

DBLookupComboBox1->Left=DBGrid1->Left+Rect.Left;

DBLookupComboBox1->Top=DBGrid1->Top+Rect.Top;

DBLookupComboBox1->Width=Rect.Right-Rect.Left+2;

DBLookupComboBox1->Visible=True;

}

}

Для того, чтобы при переходе на другой столбец DBLookupComboBox скрывался, создайте следующий обработчик:

void __fastcall TForm4::DBGrid1ColExit(TObject *Sender)

{

// при потере фокуса компонент DBLookupComboBox скрывается

if (DBGrid1->SelectedField == ADODataSet1->Fields->Fields[2]) DBLookupComboBox1->Visible=False;

}

Проверьте работу выпадающего списка:

    1. Вызов хранимой процедуры

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

CREATE PROCEDURE db1.Project_Supply_Number(IN Prj_ID INT, OUT n INT)

BEGIN

SELECT count(*)INTO n FROM supply where Project_ID=Prj_ID;

END

Поместите на форму дополнительные компоненты ADOQuery и DataSource. Свяжите компонент ADOQuery сADOConnection,DataSourceс ADOQuery.

Дополните обработчик OnDrawColumnCellкомпонентаDBGridсо следующим кодом:

//если текущая ячейка принадлежит столбцу с названием проекта

if( Column->Field == ADODataSet1->Fields->Fields[1])

{

DBGrid1->Canvas->Font->Style = TFontStyles() << fsBold;

DBGrid1->Canvas->Brush->Color = clSkyBlue;

DBGrid1->Canvas->FillRect(Rect);

//получение количества поставок для текущего проекта

ADOQuery1->SQL->Text="CALL Project_Supply_Number("+ADODataSet1->Fields->Fields[0]->AsString+",@N);";

ADOQuery1->ExecSQL();

ADOQuery1->SQL->Text="SELECT @N;";

ADOQuery1->Active=True;

ADOQuery1->ExecSQL();

//если для текущего проекта не осуществляется поставок

if(DataSource3->DataSet->Fields->Fields[0]->AsInteger==0)

{

DBGrid1->Canvas->Font->Color = clRed;

}

ADOQuery1->Close();

if (Column->Alignment==taRightJustify)

DBGrid1->Canvas->TextOut(Rect.Right-2-DBGrid1->Canvas->TextWidth(Column->Field->Text),Rect.Top+2,Column->Field->Text);

else

DBGrid1->Canvas->TextOut(Rect.Left+2,Rect.Top+2,Column->Field->Text);

}

Проверьте работу формы: