В базу данных посредством DBEdit вводятся фамилии, которые после ввода отображаются в соответствующем поле DBGrid. Проблема в том что фамилия одного и того же человека не всегда может вводиться правильно. Чтобы этого избежать, вводится дополнительная таблица в MSAccess содержащая только список фамилий. Отсюда вот какой вопрос: возможно ли чтобы при вводе фамилии, появлялось что-то вроде выпадающего списка с фамилиями из таблицы в MSAccess, т.е. допустим набираются начальные буквы - Ива, а в выпадающем списке уже видны все фамилии, начинающиеся на Ива, пользователь видит среди них нужную - Иванов, и выберает ее. Таким образом, в БД всегда вводится правильная фамилия. Есть ли в Delphi компонент, наиболее оптимально отвечающий данным требованиям? Т. к. похоже DBEdit придется заменить потому что для этой цели он не годится?
volvo
26.02.2010 17:32
Бери обычный DBComboBox, вешай ему в источник либо таблицу, либо Query, и по OnDropDown выбирай из источника то, что удовлетворяет уже введенному в Text значению. SELECT-запросы показывал уже десятки раз, LIKE там тоже присутствовало...
Что именно не получается?
1147
1.03.2010 17:10
Какие преимущества DBComboBox перед DBLookupComboBox в данной ситуации? На первый взгляд, как мне показалось, DBLookupComboBox удобнее, но почему-то он остается неактивным...
volvo
1.03.2010 17:20
Цитата
Компоненты DBLookup... используются при наличии связанных таблиц, когда необходимо вывести на экран описательную информацию вместо поля, содержащего ее код.
Исходя из твоего описания - у тебя нет никаких кодов, в доп. таблице хранятся собственно фамилии, из которых и будет осуществляться выбор. Так что Lookup здесь ни при чем.
К тому же - в DBLookup - контролах ты можешь только выбрать текст из списка, последовательно вводить что-то у тебя не получится - просто нет поля ввода. А в DBComboBox-е есть.
Цитата
но почему-то он остается неактивным...
значит, неправильно подключил.
1147
1.03.2010 18:02
LIKE это с использованием фильтра да? Почему по OnDropDown нужно выбирать из источника то, что удовлетворяет уже введенному в Text значению, а не по OnChange? Источник нужно указать в Properties или в OnDropDown? Т.е. в DataSource и DataField я указываю таблицу и поле, куда будет заноситься введенный в DBComboBox1 текст а не источник, так?
Цитата
по OnDropDown выбирай из источника то, что удовлетворяет уже введенному в Text значению
Здесь имеется ввиду введенный текст в поле DBComboBox1?
volvo
1.03.2010 19:04
На форме - DBGrid1, отображающий информацию, связанный с ADOTable1 через DataSource1. Также на форме - ADOQuery1, изначально для нее SQLText = 'SELECT * FROM table3' (у меня таблица Table3 содержит список фамилий).
Кладу на форму TDBComboBox, связываю его с тем же DataSource1, который связан с DBGrid-ом, поскольку мне надо, чтобы обновлялась информация в той же, рабочей таблице ADOTable1... У этого комбобокса не забываю установить нужное поле, в которое будет писАться информация. А вот теперь - самое интересное: как, собственно, осуществить сам выбор? А очень просто: при печати в DBComboBox я ничего делать не буду. Буду обрабатывать напечатанное значение по открытию списка, т.е.,
procedure TForm1.DBComboBox1DropDown(Sender: TObject); // нажали на кнопку со стрелкой? var s: string; begin s := 'SELECT * FROM table3'; if Length((Sender as TDbComboBox).Text) > 0 then s := s + ' where [fio] like ' + QuotedStr((Sender as TDbComboBox).Text + '%'); s := s + ';';
// Переоткрываем запрос с новым SQL ADOQuery1.Active := false; ADOQuery1.SQL.Text := s; ADOQuery1.Active := true;
// А теперь нам надо заполнить выпадающий список теми значениями, которые подходят под введенное:
(Sender as TDbComboBox).Items.Clear; // очищаем старое содержимое
ADOQuery1.First; // идем по всей Query и заносим данные, которые вернулись... while not ADOQuery1.Eof do begin (Sender as TDbComboBox).Items.Add(ADOQuery1.FieldByName('fio').AsString); ADOQuery1.Next; end; end;
Собственно, это - все... Все работает. Единственное, что не происходит - это нельзя при открытом выпадающем списке печатать. Вернее, печатать-то можно, вот обновляться он не будет в момент печатания. Чтоб обновился - надо закрыть и переоткрыть. Хочешь - попробуй повесить это на DBComboBox1Change, тогда при вводе очередного символа будет обновляться выпадающий список. Только вот я не экспериментировал, не знаю, будет ли он опять открываться после обновления, или то на то и выйдет, и его надо будет опять открывать вручную... Пробуй
1147
6.03.2010 1:14
В случае с DBComboBox1DropDown все прекрасно работает, большое спасибо! А то что список не обновляется, это не имеет значения, т. к. в момент печати осуществляется переход на нужную фамилию, поэтому необходимости использования события DBComboBox1Change нет, тем более что в этом случае наблюдается некорректная работа комбобокса - список мало того что не обновляется, так еще и показывает только одну фамилию, после ввода второго символа, курсор переходит в начало.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.