|
Базы данных 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. Если все сделано правильно, то у вас должно получиться вот так:
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 изображений добавим в начало
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 |