Разработчики часто сталкиваются с необходимостью заполнения элементов управления, таких как комбобокс, данными из базы данных. Это может быть, например, выбор языка или другой тип информации, который пользователь должен выбрать из списка. В данной статье мы рассмотрим, как быстро и безболезненно реализовать такой функционал в среде разработки Delphi, используя VCL.
Основные требования
Использование Delphi, любой версии, поддерживающей VCL.
Наличие таблицы в базе данных с полями id и value.
Наличие набора данных (Dataset), включая запросы и ClientDataSets.
Наличие источника данных (DataSource), связанного с набором данных.
Наличие компонента TDBLookupComboBox, связанного с DataSource, который будет отображать список значений и возвращать выбранный id.
Подготовка данных
Первым шагом является определение порядка сортировки элементов в комбобоксе. Это можно сделать с помощью простого SQL-запроса или индекса набора данных. Если стандартной сортировки недостаточно, можно добавить поле sort_order и заполнить его значениями, соответствующими нужному порядку. Для отображения только некоторых записей можно использовать поле visible или enabled в запросе.
SELECT id, value
FROM my_database_table
WHERE visible = 1
ORDER BY sort_order
Обратите внимание, что тип поля visible определен как INTEGER, и проверяется на равенство 1, а не на TRUE, так как многие СУБД, включая SQLite, не поддерживают булевы типы данных.
Проверка данных
Для проверки того, что данные корректно отображаются в комбобоксе, можно временно добавить на форму компонент TDBGrid, связав его с тем же TDataSource, что и TDBLookupComboBox. Это позволит убедиться, что данные отображаются правильно. После проверки TDBGrid можно удалить.
Использование ClientDataSets
В некоторых случаях для заполнения комбобокса удобно использовать ClientDataSets. Они кэшируют данные из базы данных при старте программы, что ускоряет работу и уменьшает нагрузку на базу данных.
Настройка TDBLookupComboBox
Далее необходимо открыть свойства TDBLookupComboBox и заполнить следующие параметры:
ListSource (а не DataSource): указать TDataSource, связанный с набором данных, данные из которого нужно отобразить.
ListField: указать имя поля, которое будет отображаться в комбобоксе. Например, поле value.
KeyField: указать имя поля, значение которого будет возвращаться при выборе элемента. Например, поле id.
Не забудьте также проверить свойство TabOrder, чтобы пользователь мог удобно перемещаться по элементам управления с помощью клавиши TAB.
Чтение выбранного значения
Если вам нужно только отобразить форму и считать выбранное значение из TDBLookupComboBox при нажатии кнопки, можно использовать следующий код в обработчике события OnClick кнопки:
SelectedId := MyCombo.KeyValue;
Где SelectedId - переменная для хранения возвращаемого значения, а MyCombo - имя TDBLookupComboBox. Свойство KeyValue будет содержать значение поля id, указанного в KeyField, а не текст, отображаемый на экране.
Динамическое обновление данных
Если необходимо динамически обновлять данные на форме в зависимости от выбранного значения в комбобоксе, можно использовать событие OnAfterScroll набора данных, к которому подключен TDBLookupComboBox. Это позволит симулировать событие OnChange.
procedure TMyForm.MyDataSetAfterScroll(DataSet: TDataSet);
var
SelectedId : integer;
begin
SelectedId := MyDataSet.FieldByName('id').AsInteger;
EditValue.Text := MyDataSet.FieldByName('value').AsString;
end;
Важно помнить, что событие OnAfterScroll может срабатывать чаще, чем ожидается, поэтому код должен быть готов к этому.
Настройка начального значения
Чтобы в комбобоксе при старте формы был выбран определенный элемент, установите значение свойства KeyValue в обработчике события OnFormCreate или другом подходящем событии.
MyCombo.KeyValue := DefaultId;
Это заставит комбобокс отобразить предвыбранный элемент при старте формы.
Следуя этим шагам, вы сможете быстро и эффективно заполнить комбобокс данными из базы данных в Delphi с VCL.
Описание процесса заполнения комбобокса данными из базы данных в среде разработки Delphi, используя VCL.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS