В этом посте я попрактикуюсь с некоторыми элементами DataControls в Delphi XE7. За основу программы возьму программу, написанную в посте про основные операции с БД. Также воспользуюсь теоретическими постами
–Delphi. Data Controls — компоненты доступа к БД (теория1)
–Delphi. Data Controls — компоненты доступа к БД (теория2)
–Delphi. Data Controls — компоненты доступа к БД (теория3)
Итак, для начала вспомним как подключиться к БД по технологии DBExpress?
Синим отмечено какие поля и свойства нужно заполнять, чтобы установить подключение
Какие DataControls существуют (на примере Delphi XE7)?
Практически всегда для отображения таблиц используется DBGrid, остальные компоненты как правило в меньшей степени. В предыдущих постах мы также использовали DBGrid и DBNavigator. В данном посте посмотрим как можно пользоваться другими компонентами.
DBEdit, DBText, DBMemo, DBRichEdit
Когда использовать компоненты DBEdit, DBText, DBMemo, DBRichEdit?
–DBEdit – просмотр / редактирование сравнительно небольших полей;
-DBText – только просмотр текстовых полей, если текст не помещается, можно использовать свойство WordWrap, поставив его в True;
-DBMemo – для просмотра / редактирования больших текстовых полей;
-DBRichEdit – аналогично DBMemo, но если нужен формат RTF;
Как подключить? Ниже я привожу код из FormCreate
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//Настраиваем DataControls DBEdit1.DataSource:=DataSource1; DBEdit1.DataField:='MyField'; with DBText1 do begin DataSource:=DataSource1; DataField:='MyField'; end; with DBMemo1 do begin DataSource:=DataSource1; DataField:='MyField'; end; with DBRichEdit1 do begin DataSource:=DataSource1; DataField:='MyField'; end; |
Как сохранить в физической БД?
1 2 3 4 5 |
procedure TMainForm.Button3Click(Sender: TObject); begin simpledataset1.ApplyUpdates(-1); simpledataset1.Refresh; end; |
Как сделать синхронное обновление в DBGrid, вместе с вводом данных, например в DBEdit?
Нужно обработать событие OnChange
1 2 3 4 5 |
procedure TMainForm.DBEdit1Change(Sender: TObject); begin simpledataset1.ApplyUpdates(-1); simpledataset1.Refresh; end; |
Но так лучше не делать – можно “посадить” сетку. Лучше всё-таки все “пишущие” операции оборачивать в транзакции и делать относительно “разовые” обновления и синхронизации с физической БД.
Дополнительные возможности компонентов DBEdit, DBText, DBMemo, DBRichEdit можно посмотреть в теоретической статье.
DBIMAGE
Перед тем как говорить о DBIMAGE, давайте разберемся как загрузить картинку в БД?
Как загрузить картинку в БД ?
Я использовал такой код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
procedure TMainForm.Button4Click(Sender: TObject); var MS:TMemorystream; image:timage; FileExt:string; BS:Tblobstream; begin simpledataset1.DataSet.MaxBlobSize:=-1;// снимаем ограничения OpenPictureDialog1.Execute; MS:=TMemoryStream.Create; MS.LoadFromFile(OpenPictureDialog1.FileName); simpledataset1.Insert; TBlobfield(SimpleDataset1.FieldByName('Picture')).LoadFromStream(MS); simpledataset1.Post; simpledataset1.ApplyUpdates(-1); simpledataset1.Refresh; // Button 4click... end; |
Естественно это черновой вариант (без обработки ошибок);
Как отобразить картинку в DBImage?
Для этого, я в FormCreate прописал следующий код…
1 2 3 4 |
with DBImage1 do begin DataSource:=DataSource1; DataField:='Picture'; end; |
Это для Bmp,png но не для jpg (для последнего нужно код поправить, но это не тема данного поста);
ТРАБЛ
В процессе создания примера столкнулся с ограничением максимально возможного размера BLOB поля. Это и хорошо – узнал ценную информацию. Первоначально картинки по 1,5 мб. не грузились, сервер падал. Пару часов погуглил и выяснил, что это из-за максимального размера BLOB поля, которое может быть различным.
Первоначально, я установил при создании таблицы тип поля BLOB, но грузил картинки по 1,5 мб. Естественно, это вызывало ошибку, которую я читал через обрабатываемое событие ReconcileError, например, у SimpleDataSet. В событии писал showmessage(e.message);
Когда разобрался в вопросе – всё встало на места – выставил тип поля MEDIUMBLOB;
DBListBox
По началу этот компонент мне показался странным, потому что не отображал данные из таблицы. Но чуть позже, я разобрался в чем дело. Этот компонент нужен для того, чтобы “вбивать” в БД значения из заранее заготовленного списка. У меня в примере выше настроено таким образом – жмем на DBListBox – на любое значение. При этом курсор переходит в режим редактирования. Далее жмем “Сохранить в физическую БД”, при этом выполняются команды simpledataset1.applyupdates(-1); simpledataset1.refresh;
Но этот список нужно заготовить, для этого, я в FormCreate заполнил его в ручную…
1 2 3 4 5 6 |
with dblistbox1 do begin datasource:=DataSource1; Datafield:='MyField'; Items.Add('Строка из DBListBox1'); Items.Add('Строка из DBListBox2'); end; |
Аналогичная ситуация будет и с DBCombobox
Код для предварительной подготовки списка в DBCombobox
1 2 3 4 5 6 |
with dbcombobox1 do begin datasource:=DataSource1; Datafield:='MyField'; Items.Add('Строка из DBListBox1'); Items.Add('Строка из DBListBox2'); end; |
DBRadioGroup
Этот компонент работает аналогично компонентам DBListBox и DBCombobox
Выбираем одно из значений в блоке DBRadioGroup и оно тут же пишется в базу. Сохранить в физическую БД, можно стандартными инструкциями Post; ApplyUpdates;
Код для создания строк в радио группе следующий
1 2 3 4 5 6 |
with dbradiogroup1 do begin DataSource:=Datasource1; Datafield:='MyField'; items.Add('1RadioItem'); items.Add('2RadioItem'); end; |
DBCheckBox
Одним из главных свойств компонента DBCheckBox будут свойства ValueChecked, ValueUnChecked… Если в присоединенном поле из БД будет хотя бы одно из значений, которое мы перечислили, то компонент соответственно будет отмечен галочкой или нет.
Отмечу, что по факту, у флажка 3 значения… Если в поле ничего не подходит, тогда флажок cbGrayed
typeCheckBoxState = (cbUnchecked,cbChecked, cbGrayed)
На этом данный пост завершу, остается ещё компонент DBCtrlGrid, но это отдельный, относительно сложный компонент – разберу его в отдельном посте.
С уважением, Станислав.