Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Базы данных Microsoft Access в C++ Builder 6 с использованием ADO.



Базы данных Microsoft Access в C++ Builder 6 с использованием ADO.

Задание 1.

1. Создайте в MS Access БД со списком учащихся.

Все поля имеют тип данных "Текстовый", поле "Фотография" имеет тип данных "Поле объекта OLE". БД сохраните с именем «Учащиеся».

2. Запустите C++ Builder, сохраните весь проект (Save Project As...). Путь не должен содержать русских имен. Размещаем на форме компоненты. С вкладки ADO (а в более старших версиях с dbGo) ADOTable и ADOConnection.

 

С вкладки Data Access компонент DataSource. С вкладки Data Controls компоненты DBGrid и DBNavigator.

Щелкаем по DataSource1 и в DataSet выбираем ADOTable1.

Щелкаем по ADOTable1 и в свойстве Connection выбираем ADOConnection1.

Дважды щелкаем по ADOConnection1 и нажимаем кнопку Build.... Выбираем свойства канал передачи данных и нажимаем "Далее". И нажимаем два раза "Ок".



Теперь, в Object Inspector ставим Connected в true, в User Name напишем "Admin", поле пароля оставим пустым (чтобы больше не повторять эту процедуру, установите LoginPrompt в false.)

Щелкаем по DBGrid и в DataSource выбираем DataSource1. Тоже самое повторяем и для DBNavigator.
Щелкаем по ADOTable1 в TableName выбираем нашу таблицу. Устанавливаем Active в true.

Если все сделано правильно, то у вас должно получиться вот так:

 

3. Щелкаем дважды по DBGrid, в появившемся окошечке нажимаем на кнопку "Add All Fields".

Щелкая по полям, можно задать им другие имена для отображения, свойство FieldName и изменить ширину - Width. Свойство Visible поля "Фотография" можно установить в false, т.к. это Blob-поле и отображать его придется через другие компоненты.

4. Добавьте на форму две кнопки Button, компонент Image и диалог OpenPictureDialog.

Рекомендуется установить свойство Center Image1 и свойство Proportional в true.

Код кнопки "Загрузить фото":

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

if (OpenPictureDialog1->Execute())

{

AnsiString CurrentFile = OpenPictureDialog1->FileName;

Image1->Picture->LoadFromFile(CurrentFile);

}

}

 

Код кнопки "Сохранить фото":

void __fastcall TForm1::Button2Click(TObject *Sender)

{

ADOTable1->Edit();

TMemoryStream* strm = new TMemoryStream();

Image1->Picture->Graphic->SaveToStream(strm);

((TGraphicField*)Form1->ADOTable1->FieldByName("Фотография"))->LoadFromStream(strm);

delete strm;

Form1->ADOTable1->Post();

}

 

В обработчик события OnCellClick (щелчок по ячейке) DBGrid пишем следующий код:

 

void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)

{

if(!(TBlobField*)ADOTable1->FieldByName("Фотография")->IsNull){

if(!Image1->Visible)Image1->Visible=true;

TMemoryStream* strm = new TMemoryStream;

TJPEGImage *ptJpg=new TJPEGImage;

((TGraphicField*)ADOTable1->FieldByName("Фотография"))->SaveToStream(strm);

strm->Seek(0,0);

if (*(Word*)strm->Memory == 0xD8FF)Image1->Picture->Graphic=ptJpg;



Image1->Picture->Graphic->LoadFromStream(strm);

delete strm;

delete ptJpg;

}else

Image1->Visible=false;

}

 

Для загрузки jpeg изображений добавим в начало
#include "jpeg.hpp"

 

5. Добавьте в базу данных несколько записей.

Задание №2. Создание базы данных транзисторов.

 

1. Создайте в Access таблицу с названием Transistor и так же назовите файл базы данных. Заполните поля:

Поля Photo, Pinout, Description имеют тип " Поле объекта OLE ". Остальные остаются по умолчанию. Значения полей с лева на право: порядковый номер записи, название транзистора, его тип, структура, количество, фотография, цоколевка, описание.

2. Расположите компоненты на форме и установите связи, кроме того отрегулируйте ширину полей (Width) и замените англоязычные написания (Title->Caption):

 

Кроме "стандартных" компонентов присутствуют пять кнопок BitBtn, два Image, один RichEdit, диалог OpenPictureDialog. Переименуйте кнопки:

 

 

3. Создайте форму для организации фильтрации:

 

 

 

На ней так же располагаются кнопки BitBtn, Edit, Label и один ListBox, заполняем его свойство Items русскими названиями полей.

Для удобства создадим форму добавления и редактирования записи:

 

На ней располагаются два ComboBox, два Edit, RichEdit, два Image и три кнопки BitBttn. Меняем свойство Text у обоих ComboBox.

Затем заполняем свойства Items.

 

 

Для первого: Для второго:

3. Добавьте на форму компонент OpenPictureDialog:

4. На четвертой форме разместите Image со свойством Align установленное в alClient.

 

5. Все формы имеют значение свойства Position poDesktopCenter. И все кроме первой FormStyle fsStayOnTop. У всех Image установлено в true свойства Center и Proportional. У RichEdit свойство ScrollBars установлено ssVertical. У диалогов в свойстве Filter оставьте только jpg и jpeg.

6. На всех формах в заголовках проставьте:

#include "Unit1.h"

#include "Unit2.h"

#include "Unit3.h"

#include "Unit4.h"

#include "jpeg.hpp"

Это нужно чтобы формы "знали" друг о друге. Последняя библиотека отвечает за поддержку изображений формата jpeg, которые только мы и будем использовать в нашей базе данных.

7. Пропишет код для следующих кнопок:

Кнопка "Фильтр ":

void __fastcall TForm1::BitBtn1Click(TObject *Sender)

{
if(!Form2->Visible)

Form2->Show();
}

Кнопка "Добавить запись ":

void __fastcall TForm1::BitBtn2Click(TObject *Sender)

{
ADOTable1->Insert();
if(!Form3->Visible)
Form3->Show();
Form3->Edit1->Clear();
Form3->Edit2->Clear();
Form3->ComboBox1->ItemIndex = -1;

Form3->ComboBox2->ItemIndex = -1;

Form3->ComboBox1->Text = "Выберите тип";

Form3->ComboBox2->Text = "Выберите структуру";

Form3->RichEdit1->Clear();
Form3->Image1->Picture->Bitmap->FreeImage();
Form3->Image1->Picture->Bitmap = NULL;

Form3->Image2->Picture->Bitmap->FreeImage();
Form3->Image2->Picture->Bitmap = NULL;

}

 

Кнопка "Редактировать запись":

void __fastcall TForm1::BitBtn3Click(TObject *Sender)

{
ADOTable1->Edit();
if(!Form3->Visible)
Form3->Show();
Form3->Edit1->Clear();
Form3->Edit2->Clear();
Form3->ComboBox1->Text =ADOTable1->FieldByName("Type")->AsString;

Form3->ComboBox2->Text = ADOTable1->FieldByName("Struct")->AsString;

Form3->RichEdit1->Clear();
Form3->Image1->Picture->Bitmap->FreeImage();
Form3->Image1->Picture->Bitmap = NULL;

Form3->Image2->Picture->Bitmap->FreeImage();

Form3->Image2->Picture->Bitmap = NULL;


if(!(TBlobField*)ADOTable1->FieldByName("Photo")->IsNull){

TMemoryStream* strm = new TMemoryStream;

TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Photo"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Form3->Image1->Picture->Graphic=ptJpg;
Form3->Image1->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
if(!(TBlobField*)ADOTable1->FieldByName("Pinout")->IsNull){
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Pinout"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Form3->Image2->Picture->Graphic=ptJpg;
Form3->Image2->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
if(!(TBlobField*)ADOTable1->FieldByName("Description")->IsNull){
TMemoryStream* strm = new TMemoryStream;
((TGraphicField*)ADOTable1->FieldByName("Description"))->SaveToStream(strm);
strm->Seek(0,0);
Form3->RichEdit1->Lines->LoadFromStream(strm);
delete strm;
}
Form3->ComboBox1->Text = ADOTable1->FieldByName("Type")->AsString;
Form3->ComboBox2->Text = ADOTable1->FieldByName("Struct")->AsString;
Form3->Edit1->Text = ADOTable1->FieldByName("Names")->AsString;
Form3->Edit2->Text = ADOTable1->FieldByName("amount")->AsString;
}

Кнопка "Загрузить изображение":
void __fastcall TForm1::BitBtn4Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
Form1->ADOTable1->Edit();
if(Image1->Picture->Graphic!= 0)
{
Form1->ADOTable1->Edit();
TMemoryStream* strm2 = new TMemoryStream();
Image1->Picture->Graphic->SaveToStream(strm2);
((TGraphicField*)Form1->ADOTable1->FieldByName("Photo"))->LoadFromStream(strm2);
Form1->Image1->Picture->Graphic = Image1->Picture->Graphic;
delete strm2;
}
Form1->ADOTable1->Post();
}

Кнопка "Загрузить цоколевку ":
void __fastcall TForm1::BitBtn5Click(TObject *Sender)
{
if(OpenPictureDialog1->Execute())
Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
Form1->ADOTable1->Edit();
if(Image2->Picture->Graphic!= 0)
{
Form1->ADOTable1->Edit();
TMemoryStream* strm3 = new TMemoryStream();
Image2->Picture->Graphic->SaveToStream(strm3);
((TGraphicField*)Form1->ADOTable1->FieldByName("Pinout"))->LoadFromStream(strm3);
Form1->Image2->Picture->Graphic = Image2->Picture->Graphic;
delete strm3;
}
Form1->ADOTable1->Post();
}

Обработчик события закрытия формы:

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ADOTable1->Close();
}
Щелчок левой клавишей мыши по Image1:
void __fastcall TForm1::Image1Click(TObject *Sender)
{
if(!Form4->Visible)
Form4->Show();
if(!(TBlobField*)ADOTable1->FieldByName("Photo")->IsNull){
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Photo"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Form4->Image1->Picture->Graphic=ptJpg;
Form4->Image1->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
}
Щелчок левой клавишей мыши по Image2:
void __fastcall TForm1::Image2Click(TObject *Sender)
{
if(!Form4->Visible)
Form4->Show();
if(!(TBlobField*)ADOTable1->FieldByName("Pinout")->IsNull){
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Pinout"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Form4->Image1->Picture->Graphic=ptJpg;
Form4->Image1->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
}
Щелчок по ячейке DBGrid:
void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
if(!(TBlobField*)ADOTable1->FieldByName("Photo")->IsNull){
Image1->Visible = true;
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Photo"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Image1->Picture->Graphic=ptJpg;
Image1->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
else
Image1->Visible = false;

if(!(TBlobField*)ADOTable1->FieldByName("Pinout")->IsNull){
Image2->Visible = true;
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Pinout"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Image2->Picture->Graphic=ptJpg;
Image2->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
else
Image2->Visible = false;

if(!(TBlobField*)ADOTable1->FieldByName("Description")->IsNull){
TMemoryStream* strm = new TMemoryStream;
((TGraphicField*)ADOTable1->FieldByName("Description"))->SaveToStream(strm);
strm->Seek(0,0);
RichEdit1->Lines->LoadFromStream(strm);
delete strm;
}
}

 

Обработчик события создания формы:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
String filename = "Transistor.mdb";
if(!FileExists(ExtractFilePath(Application->ExeName)+filename))
{
AnsiString ds = "Файл базы данных не обнаружен \n\n\t" +filename;
}
else
{
String WayToBase=ExtractFilePath(Application->ExeName)+filename;
Form1->ADOConnection1->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin;Data Source="+WayToBase+";Mode=Share Deny None;Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;";
Form1->ADOConnection1->Connected = true;
Form1->ADOTable1->Active = true;
Form1->ADOTable1->Open();
}
if(!(TBlobField*)ADOTable1->FieldByName("Photo")->IsNull){
Image1->Visible = true;
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Photo"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Image1->Picture->Graphic=ptJpg;
Image1->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
else
Image1->Visible = false;
if(!(TBlobField*)ADOTable1->FieldByName("Pinout")->IsNull){
Image2->Visible = true;
TMemoryStream* strm = new TMemoryStream;
TJPEGImage *ptJpg=new TJPEGImage;
((TGraphicField*)ADOTable1->FieldByName("Pinout"))->SaveToStream(strm);
strm->Seek(0,0);
if (*(Word*)strm->Memory == 0xD8FF) Image2->Picture->Graphic=ptJpg;
Image2->Picture->Graphic->LoadFromStream(strm);
delete strm;
delete ptJpg;
}
else
Image2->Visible = false;
if(!(TBlobField*)ADOTable1->FieldByName("Description")->IsNull){
TMemoryStream* strm = new TMemoryStream;
((TGraphicField*)ADOTable1->FieldByName("Description"))->SaveToStream(strm);
strm->Seek(0,0);
RichEdit1->Lines->LoadFromStream(strm);
delete strm;
}
}

Форма фильтрации. Кнопка "Очистить ->":
void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
Edit1->Clear();
}

Кнопка "Очистить поле запроса ":
void __fastcall TForm2::BitBtn7Click(TObject *Sender)
{
Edit2->Clear();
}

Кнопки AND, OR, <, >:
void __fastcall TForm2::BitBtn2Click(TObject *Sender)
{
Edit2->Text = Edit2->Text + " AND ";
}
void __fastcall TForm2::BitBtn3Click(TObject *Sender)
{
Edit2->Text = Edit2->Text + " OR ";
}
void __fastcall TForm2::BitBtn4Click(TObject *Sender)
{
Edit2->Text = Edit2->Text + " < ";
}
void __fastcall TForm2::BitBtn5Click(TObject *Sender)
{
Edit2->Text = Edit2->Text + " > ";
}

Кнопка "Отфильтровать":
void __fastcall TForm2::BitBtn6Click(TObject *Sender)
{
Form1->ADOTable1->Filter = Edit2->Text;
Form1->ADOTable1->Filtered = true;
}

 

Событие закрытия формы:

void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
Form1->ADOTable1->Filtered = false;
}

Событие щелчка левой клавишей мыши по ListBox:

void __fastcall TForm2::ListBox1Click(TObject *Sender)
{
if(ListBox1->ItemIndex == 0)
Edit2->Text = Edit2->Text + "Number" + "='" + Edit1->Text + "'";
if(ListBox1->ItemIndex == 1)
Edit2->Text = Edit2->Text + "Type" + "='" + Edit1->Text + "'";
if(ListBox1->ItemIndex == 2)
Edit2->Text = Edit2->Text + "Names" + "='" + Edit1->Text + "'";
if(ListBox1->ItemIndex == 3)
Edit2->Text = Edit2->Text + "Struct" + "='" + Edit1->Text + "'";
if(ListBox1->ItemIndex == 4)
Edit2->Text = Edit2->Text + "amount" + "='" + Edit1->Text + "'";
}

 

Форма добавления и редактирования. Кнопка "Загрузить фото ":
void __fastcall TForm3::BitBtn1Click(TObject *Sender)
{
Form1->Image1->Picture->Bitmap->FreeImage();
Form1->Image1->Picture->Bitmap = NULL;
if(OpenPictureDialog1->Execute())
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}

 

Кнопка "Загрузить цоколевку":
void __fastcall TForm3::BitBtn2Click(TObject *Sender)
{
Form1->Image2->Picture->Bitmap->FreeImage();
Form1->Image2->Picture->Bitmap = NULL;

if(OpenPictureDialog1->Execute())
Image2->Picture->LoadFromFile(OpenPictureDialog1->FileName);
}

 

Кнопка "Сохранить изменения и выйти ":
void __fastcall TForm3::BitBtn3Click(TObject *Sender)
{
Form1->ADOTable1->Edit();
TMemoryStream* strm = new TMemoryStream();
RichEdit1->Lines->SaveToStream(strm);
((TGraphicField*)Form1->ADOTable1->FieldByName("Description"))->LoadFromStream(strm);
Form1->RichEdit1->Lines = RichEdit1->Lines;
delete strm;
if(Image1->Picture->Graphic!= 0)
{
Form1->ADOTable1->Edit();
TMemoryStream* strm2 = new TMemoryStream();
Image1->Picture->Graphic->SaveToStream(strm2);
((TGraphicField*)Form1->ADOTable1->FieldByName("Photo"))->LoadFromStream(strm2);
Form1->Image1->Picture->Graphic = Image1->Picture->Graphic;
delete strm2;
}
if(Image2->Picture->Graphic!= 0)
{
Form1->ADOTable1->Edit();
TMemoryStream* strm3 = new TMemoryStream();
Image2->Picture->Graphic->SaveToStream(strm3);
((TGraphicField*)Form1->ADOTable1->FieldByName("Pinout"))->LoadFromStream(strm3);
Form1->Image2->Picture->Graphic = Image2->Picture->Graphic;
delete strm3;
}
Form1->ADOTable1->FieldByName("Names")->AsString= Edit1->Text;
Form1->ADOTable1->FieldByName("amount")->AsString= Edit2->Text;
Form1->ADOTable1->FieldByName("Type")->AsString = ComboBox1->Text;
Form1->ADOTable1->FieldByName("Struct")->AsString = ComboBox2->Text;
Form1->ADOTable1->Post();
Form3->Close();
}

 

8. Заполните базу данных данными:

 

Комментарии к проекту:

Код в основном представляет загрузку из blob - полей изображений или текста. Код при создании формы нужен чтобы в Image и RichEdit отобразилась информация из первой записи. Кнопки "быстрой" смены изображения и цоколевки сразу же сохраняют их. А на форме добавления и редактирования сохранение всех изменений происходит после нажатия кнопки "Сохранить изменения и выйти". Щелчок по Image на главной форме дает нам возможность увеличить изображение, что очень удобно. Теперь о фильтрации. Это очень хорошая альтернатива поиску, более удобная.Русскоязычному названию соответствует англоязычное при щелчке по ListBox.

На форме фильтрации создан конструктор запроса. Как им пользоваться? В поле "Данные" вводим то, что ищем, например КТ315. т.к. это имя транзистора, то нужно щелкнуть по ListBox по надписи "Имя". И он создаст строку запроса:

 

Так же можно использовать другие операторы вместо "=". AND - и, OR - или, < - меньше, > - больше. И комбинировать запросы. Например:

 


Дата добавления: 2015-11-04; просмотров: 152 | Нарушение авторских прав




<== предыдущая лекция | следующая лекция ==>
8. Запрос перекрестный: Фамилия-категория-прибавка_перекрестный Для этого необходимо: | Вратарская экипировка MIKLIN

mybiblioteka.su - 2015-2024 год. (0.024 сек.)