Delphi dbcombobox как заполнить из бд

от admin

Delphi filling combobox items from SQL database [closed]

This isn’t so much about the combo-box as whether you’re getting anything returned from your query. The first thing to do is ensure that the query is working. I’d first put a TMemo or TList on the form and mess with the query until it’s returning the data you’re expecting.

Alternatively, drop a DB-aware component on the form and hook it to the TSqlQuery component to verify you’re getting a non-empty result set.

«Select * from provider_table» may well be returning items, but the query in the example is far more specific and it may not be returning anything.

Once you’ve verified you’re getting a non-empty result set, THEN fill up the combo-box.

Ensure that its style property is set to «Dropdown List» so the user can only select from the returned items.

Also, FWIW, lists of items placed into combo-boxes like this from database queries are, more often than not, lists of foreign keys from another table than what you’re dealing with. So a DB-combobox that allows foreign-key selection to fill it up is a much better way to go than the approach you’re using. You set a couple of properties in the Object Inspector and it fills itself when the form loads.

It’s also common in such situations that the string displayed in the combo-box is also NOT the value used as the key in the table or as the foreign-key value. Instead, an index (number) might be used. This requires a lookup property where the selected item is mapped to another value that the database tables use. (Not all combo-boxes are the same when it comes to DB uses!)

Delphi dbcombobox как заполнить из бд

Часто, в ответ на вопрос «как связать комбобокс с БД» Вы услышите — «используй dbLookupComboBox».
Возможно это действительно наиболее удачный вариант, но в силу моей к нему неприязни, я использую обычный ComboBox практически всегда.
Да, действительно, он не всегда удобен, если информацию о работе с ним получать только из книг по Delphi. Ведь в них, обычно, рассматриваются только самые просте способы и методы работы с ним.
В своих проектах я использую его на формах добавления или редактирования записи в базе данных.
Не буду описывать его свойства — это Вы и так можете найти в книгах или на просторах интернета, — благо форумы пестрят подобными заголовками.
В этой статье рассмотрим конкретную реализацию.
База данных выступает в качестве хранилища информации, которую мы будем добавлять или редактировать.
ComboBox, в данном описании, выступает как сомпонент позволяющий выбрать запись из таблицы-справочника для внесения информации в другую таблицу, либо как элемент выступающий в роли отображающего сохраненнную информацию на форме редактирования..
В данном примере для внесения записи и для ее редактирования применяется одна и та же форма, открываемая с различными входными параметрами.
На скринах показано много элементов формы, но я вам покажу работу на примере двух ComboBox-ов. Двух — по той причине что тут они связаны между собой и выбор элемента в первом, изменяет набор данных во втором и при редактировании записи второго ComboBox (связанного с первым по условию) это требует дополнительных операций.
На приведенном изображении фокус установлен на боксе с помощью которого, в данном случае, оператор выбирает назначение рельса (форма открыта в режиме добавления новой записи).


При этом Combobox «Тип оборудования» не содержит никакой информации, поскольку еще не сделан выбор назначения.
После того как назначение будет выбрано, список типов будет заполнен и доступен для выбора необходимой записи и в нем будут отображены только те типы (в данном случае рельса) которые связаны с выбранным назначением. Теперь оператор может выбрать нужный ему тип. Данные связаны.

Теперь о реализации.
Для боксов «Назначение» и «Тип» в БД существуют справочные таблицы, из которых и выполняется наполнение боксов.

Активация формы просходит из другой (родительской) формы, при которой и передается некий параметр определяющий роли элементов.

Определили роль действий как «Добавление записи» и открыли форму, скрины которой показаны выше.
Как работает Form2. Вот что выполняется при открытии формы:

Поскольку форма может быть запущена больше одного раза , то Combobox необходимо очистить от существуюещго набора, ведь набор данных мог и поменяться, — что и сделано командой NaznBox.Items.Clear;
Далее обращаемся к БД для формирования текущего набора элементов бокса. Процедура стандартная и не вижу необходимости ее описывать. Однако стоит остановиться на части кода отображенном в цикле while.
Здесь из набора данных формируем объекты Combobox-а взяв в качестве оборажемого текста, хранящееся в таблице БД имя (здесь «назначение» — поле ‘nazn’), а ключ выбранной записи помещаем в TObject этого Item.
Combobox наполнен необходимыми значениями. Теперь наполним второй, связанный с первым по смыслу.
Следует заметить: поскольку в данный момент рассматриваем форму как оболочку для внесения новой записи — то бокс содержащий типы, в данном случае рельсов, наполняется только после выбора назначения. И вот как я это делаю:
Так как существует связка между назначеним и типом, то необходимо сначала получить значение связующего звена. Связку можно понять внимательно взгянув на скрины таблиц БД.

После чего становится доступным выбор позиции во втором боксе.
На этом прекращаю рассмотрение формы в режиме добавления записи. Сам процесс записи данных в БД должен быть Вам известен.
И приступим к рассмотрению наиболее интересной части статьи, а именно позиционирование Combobox-а на нужную запись при редактировании.
Далее в тексте описания и примерах кода Вы увидите обращение к элементу DBGridEh — это табличное отображение набора данных которые будем редактированить.
Сам грид и процесс его наполнения показывать не буду — это тема для отдельной статьи, но процесс получения значений из него частино будет приведен и если у читателя будет желание получить информацию о реализации отображения табличных данных в рамках этой статьи — дополню ее или оформлю ссылкой на отдельную запись.
Как я уже отметил, на основной форме имеется некий DBGridEh с набором данных. Для редактирования записи ее нужно сначала выбрать, выполнив клик мышью на нужной строке.
Используя событие OnMouseDown DBGridEh-а получаю ключ записи (поле ‘pk’), которая будет радактироваться. Ключ так же содержится в таблице, но столбец с этой информацие скрыт, поскольку для пользователя он, как правило, не нужен.

Читать:
Как оптимально настроить ноутбук программой ryzen controller

Теперь обрабатываем нажатие кнопки «Редактировать»

Передали форме form2 информацию о том, что она должна быть открыта в режиме редактирования записи…
Зная этот параметр отрываю форму активируя следующий набор операций:

Здесь мной использован вызов процедуры, поскольку в своей программе вызов этот (редактирование значений) я допускаю делать в различных блоках программы.
И вот так выглядит сама процедура:

Выбрал значения текущих параметров для всех полей в переменные
Ведь при выполнении обновления записи потребуются они все (дабы не писать кучу условий..)
Далее выбираю позицию для бокса «назначение рельса» в соответсвии с записью в БД

Когда у нас есть наполненный по условию связки бокс типов оборудования, — остается последняя операция: Выбираю позицию для бокса «тип рельса» в соответсвии с записью в БД

В сети Вы найдете и другие реализации форм редактирования на Delphi, но поскольку ни одна из них меня не устроила по своему функционалу — я написал код, который и представил на Ваше рассмотрение. Пусть Вас не смущают значения NaznBox и TipBox — это обычные Combobox-ы…
Далее выполняется стандартная процедура обновления записи в таблице базы данных (в данном примере это таблица railslist).
Надеюсь статья получилась вполне читабельна и изложение доходчиво.

Урок 32 — Объединение всего изученного про базы данных

Для начала нам нужно создать пустую таблицу «кадры» с набором полей: «Имя, Фамилия, Отчество, Телефон, Статус». Всё точно также как это делали в прошлом уроке.

Таблица

Также возьмём за основу пример программы из прошлого урока, добавим 3 кнопки и проверим нашу таблицу:

Таблица

Мы напишем программу для полноценного управления базой данных (добавление, редактирование, удаление). Добавим новую форму и положим на неё следующие компоненты:

Вторая форма

Форма готова и чтоб начать задавать свойства нам нужно подключить 2 юнит к 1 юниту, потому что без этого мы не можем обратится к первой форме из второй. Делается это очень просто, создаем обработчик события OnClick на 1 кнопке: И у нас вылезет вот такое окно:

Добавить во второй юнит первый?

Нажимаем ОК и первая форма подключается ко второй, можно использовать её свойства. Всем DBEdit’ам и BDComboBox1 свойство DataSource зададим как Form1.DataSource1, а DataField как «Имя», «Фамилия», «Отчество», «Телефон», «Статус» соответственно. Далее настроим еще одно свойство у DBComboBox1, кликаем на Items и заполняем его как на рисунке:

Items у DBComboBox1

Теперь нам надо изменить наш ранее созданный обработчик события на кнопке «ОК», стираем там все что есть и пишем новый код: И сразу же создадим обработчик события на кнопке «Добавить» на первой форме: У нас опять вылезет сообщение о том что надо добавить первый юнит ко второму, соглашаемся, компилируем и добавляем:

Добавлине

Теперь можно заполнять базу данных. Удаляются значения так, создаем обработчик события кнопки «Удалить» на первой форме: Все, выделенная строка исчезает. Также легко можно изменить строку, создаем обработчик события кнопки «Изменить»: У нас просто показывается вторая форма и выделенную строку можно изменять.

Теперь представим что наша база данных состоит из тысячи строки и нам надо найти одну единственную, эта задача решается поиском строки, это мы сейчас и сделаем. Кидаем на форму компонент StatusBar и 2 раза кликаем на неё, в открывшемся окне создаем новую панель и закрываем. Создаем глобальную переменную fs: String и в обработчике события OnKeyPress DBGrid1 пишем код: И что бы во время печатания слова мы случайно не изменили значение в таблице надо установит свойство dgRowSelect у DBGrid1, которое находится в списке Options на True. Все поиск у нас есть, давайте его опробуем, запускаем программу и вводим «ми»:

Как работать DBComboBox?

Попробывал DBLookupComboBox принцип тот же самый но список у меня так и не открывается как будто в свойстве enabled стоит false но на самом деле стоит true а кнопка на списке почему то заблакирована подскажи почему.

Попробуй использовать ListSource, ListField и
попробуй KeyField (у меня ключевое поле ID),
без KeyField не работало.

Свойство KeyField заполнил кнопка со стрелочкой на раскрывающемся списке стала доступной когда компилирую и нажимаю на кнопку список открывается слава богу с данными которые находятся у меня в базе. Но почемуто недает производить выбор. И по умолчанию почемуто пустое поле. Почему?

Впиши строчку после открытия базы
DBLookupComboBox1->KeyValue=1;, она установит
первую запись в окошко. А по поводу выборки
должно выбирать, где-то что-то в свойствах не
то выставил. Самое простое создать новый
DBLookupComboBox и выставить свойства заново.

Похожие статьи