[H-L-L.ru]

Форма входа

Меню сайта

Categories
Программы с GUI [8]
Создание программ с графическим интерфейсом пользователя

Главная » Статьи » C++ Builder 6 - GUI » Программы с GUI

Базы данных Microsoft Access в C++ Builder 6 с использованием ADO. Часть 2
  В этой статье мы продолжим осваивать базы данных Microsoft Access с использованием компонентов ADO. В этот раз мы создадим базу данных более удобную в пользовании и заточенную под жизненную проблему. У большинства радиолюбителей скапливается большое количество деталей. Для привидения всего этого добра в порядок мы создадим базу данных транзисторов. Если вы не читали первой части этой статьи, то рекомендую ознакомиться. Создаем в Access таблицу с названием Transistor и так же называем файл базы данных. Заполняем поля:



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







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



  Создадим форму для фильтрации:





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



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



  Для второго:



 Добавляем на форму OpenPictureDialog:



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



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



  Теперь займемся кодом. На всех формах в заголовках проставьте:

#include "Unit1.h"
#include "Unit2.h"
#include "Unit3.h"
#include "Unit4.h"
#include "jpeg.hpp"


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

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();
}


  Теперь, когда все готово, можно загружать данные:





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



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



  Если у вас есть вопросы по коду или другого характера - пишите в комментариях или на форуме - статья будет доработана. Кроме того, прилагаю
исходник проекта .

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



Источник: база транзисторов создание

Всего комментариев: 3
3 oderyigorby  
Спасибо большое за информацию, очень пригодилась для написания дипломного проекта)

2 Skyline  
* 1 Skyline (Сегодня 16:12)
Доброго времени суток!
Отличный материал!
Такой вот вопрос, а что значат AND OR < > в форме фильтра?

Разобрался)

1 Skyline  
Доброго времени суток!
Отличный материал!
Такой вот вопрос, а что значат AND OR < > в форме фильтра?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Полная версия сайта