[H-L-L.ru] |
Форма входа |
Меню сайта |
Categories | |
|
Главная » Статьи » C++ Builder 6 - GUI » Программы с GUI |
В этой статье мы продолжим осваивать базы данных 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 | ||||
| ||||