В базу данных посредством DBEdit вводятся фамилии, которые после ввода отображаются в соответствующем поле DBGrid. Проблема в том что фамилия одного и того же человека не всегда может вводиться правильно. Чтобы этого избежать, вводится дополнительная таблица в MSAccess содержащая только список фамилий. Отсюда вот какой вопрос: возможно ли чтобы при вводе фамилии, появлялось что-то вроде выпадающего списка с фамилиями из таблицы в MSAccess, т.е. допустим набираются начальные буквы - Ива, а в выпадающем списке уже видны все фамилии, начинающиеся на Ива, пользователь видит среди них нужную - Иванов, и выберает ее. Таким образом, в БД всегда вводится правильная фамилия. Есть ли в Delphi компонент, наиболее оптимально отвечающий данным требованиям? Т. к. похоже DBEdit придется заменить потому что для этой цели он не годится?
Бери обычный DBComboBox, вешай ему в источник либо таблицу, либо Query, и по OnDropDown выбирай из источника то, что удовлетворяет уже введенному в Text значению. SELECT-запросы показывал уже десятки раз, LIKE там тоже присутствовало...
Что именно не получается?
Какие преимущества DBComboBox перед DBLookupComboBox в данной ситуации? На первый взгляд, как мне показалось, DBLookupComboBox удобнее, но почему-то он остается неактивным...
LIKE это с использованием фильтра да? Почему по OnDropDown нужно выбирать из источника то, что удовлетворяет уже введенному в Text значению, а не по OnChange? Источник нужно указать в Properties или в OnDropDown?
Т.е. в DataSource и DataField я указываю таблицу и поле, куда будет заноситься введенный в DBComboBox1 текст а не источник, так?
На форме - DBGrid1, отображающий информацию, связанный с ADOTable1 через DataSource1. Также на форме - ADOQuery1, изначально для нее SQLText = 'SELECT * FROM table3' (у меня таблица Table3 содержит список фамилий).
Кладу на форму TDBComboBox, связываю его с тем же DataSource1, который связан с DBGrid-ом, поскольку мне надо, чтобы обновлялась информация в той же, рабочей таблице ADOTable1... У этого комбобокса не забываю установить нужное поле, в которое будет писАться информация. А вот теперь - самое интересное: как, собственно, осуществить сам выбор? А очень просто: при печати в DBComboBox я ничего делать не буду. Буду обрабатывать напечатанное значение по открытию списка, т.е.,
procedure TForm1.DBComboBox1DropDown(Sender: TObject); // нажали на кнопку со стрелкой?Собственно, это - все... Все работает. Единственное, что не происходит - это нельзя при открытом выпадающем списке печатать. Вернее, печатать-то можно, вот обновляться он не будет в момент печатания. Чтоб обновился - надо закрыть и переоткрыть. Хочешь - попробуй повесить это на DBComboBox1Change, тогда при вводе очередного символа будет обновляться выпадающий список. Только вот я не экспериментировал, не знаю, будет ли он опять открываться после обновления, или то на то и выйдет, и его надо будет опять открывать вручную... Пробуй
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;
В случае с DBComboBox1DropDown все прекрасно работает, большое спасибо! А то что список не обновляется, это не имеет значения, т. к. в момент печати осуществляется переход на нужную фамилию, поэтому необходимости использования события DBComboBox1Change нет, тем более что в этом случае наблюдается некорректная работа комбобокса - список мало того что не обновляется, так еще и показывает только одну фамилию, после ввода второго символа, курсор переходит в начало.
Where Can I Buy Proventil Inhaler
How Many Days Amoxicillin Cat
Viagra Ohne Potenzstorung
cialis tomar media pastilla
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/