Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Выпадающий список - ?

Автор: 1147 26.02.2010 19:02

В базу данных посредством DBEdit вводятся фамилии, которые после ввода отображаются в соответствующем поле DBGrid. Проблема в том что фамилия одного и того же человека не всегда может вводиться правильно. Чтобы этого избежать, вводится дополнительная таблица в MSAccess содержащая только список фамилий. Отсюда вот какой вопрос: возможно ли чтобы при вводе фамилии, появлялось что-то вроде выпадающего списка с фамилиями из таблицы в MSAccess, т.е. допустим набираются начальные буквы - Ива, а в выпадающем списке уже видны все фамилии, начинающиеся на Ива, пользователь видит среди них нужную - Иванов, и выберает ее. Таким образом, в БД всегда вводится правильная фамилия. Есть ли в Delphi компонент, наиболее оптимально отвечающий данным требованиям? Т. к. похоже DBEdit придется заменить потому что для этой цели он не годится?

Автор: volvo 26.02.2010 21:32

Бери обычный DBComboBox, вешай ему в источник либо таблицу, либо Query, и по OnDropDown выбирай из источника то, что удовлетворяет уже введенному в Text значению. SELECT-запросы показывал уже десятки раз, LIKE там тоже присутствовало...

Что именно не получается?

Автор: 1147 1.03.2010 21:10

Какие преимущества DBComboBox перед DBLookupComboBox в данной ситуации? На первый взгляд, как мне показалось, DBLookupComboBox удобнее, но почему-то он остается неактивным...

Автор: volvo 1.03.2010 21:20

Цитата
Компоненты DBLookup... используются при наличии связанных таблиц, когда необходимо вывести на экран описательную информацию вместо поля, содержащего ее код.
Исходя из твоего описания - у тебя нет никаких кодов, в доп. таблице хранятся собственно фамилии, из которых и будет осуществляться выбор. Так что Lookup здесь ни при чем.

К тому же - в DBLookup - контролах ты можешь только выбрать текст из списка, последовательно вводить что-то у тебя не получится - просто нет поля ввода. А в DBComboBox-е есть.

Цитата
но почему-то он остается неактивным...
значит, неправильно подключил.

Автор: 1147 1.03.2010 22:02

LIKE это с использованием фильтра да? Почему по OnDropDown нужно выбирать из источника то, что удовлетворяет уже введенному в Text значению, а не по OnChange? Источник нужно указать в Properties или в OnDropDown?
Т.е. в DataSource и DataField я указываю таблицу и поле, куда будет заноситься введенный в DBComboBox1 текст а не источник, так?

Цитата
по OnDropDown выбирай из источника то, что удовлетворяет уже введенному в Text значению

Здесь имеется ввиду введенный текст в поле DBComboBox1?

Автор: volvo 1.03.2010 23: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, тогда при вводе очередного символа будет обновляться выпадающий список. Только вот я не экспериментировал, не знаю, будет ли он опять открываться после обновления, или то на то и выйдет, и его надо будет опять открывать вручную... Пробуй smile.gif

Автор: 1147 6.03.2010 5:14

В случае с DBComboBox1DropDown все прекрасно работает, большое спасибо! А то что список не обновляется, это не имеет значения, т. к. в момент печати осуществляется переход на нужную фамилию, поэтому необходимости использования события DBComboBox1Change нет, тем более что в этом случае наблюдается некорректная работа комбобокса - список мало того что не обновляется, так еще и показывает только одну фамилию, после ввода второго символа, курсор переходит в начало.

Автор: buy cialis online no prescriptio 6.11.2021 9:35

Where Can I Buy Proventil Inhaler

Автор: how long does gabapentin stay in 4.12.2021 15:31

How Many Days Amoxicillin Cat

Автор: is gabapentin a controlled subst 9.12.2021 6:22

Viagra Ohne Potenzstorung

Автор: how long does it take for propec 21.12.2021 11:33

cialis tomar media pastilla

Автор: nishaknapp 16.01.2023 6:18

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://zainview.com/4-questions-to-ask-yourself-before-you-play-casino-online/