IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

 
 Ответить  Открыть новую тему 
> Выпадающий список - ?
1147
сообщение 26.02.2010 15:02
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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


Гость






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

Что именно не получается?
 К началу страницы 
+ Ответить 
1147
сообщение 1.03.2010 17:10
Сообщение #3


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Какие преимущества DBComboBox перед DBLookupComboBox в данной ситуации? На первый взгляд, как мне показалось, DBLookupComboBox удобнее, но почему-то он остается неактивным...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.03.2010 17:20
Сообщение #4


Гость






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

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

Цитата
но почему-то он остается неактивным...
значит, неправильно подключил.
 К началу страницы 
+ Ответить 
1147
сообщение 1.03.2010 18:02
Сообщение #5


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

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

Сообщение отредактировано: 1147 - 1.03.2010 18:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.03.2010 19:04
Сообщение #6


Гость






На форме - 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 1:14
Сообщение #7


Бывалый
***

Группа: Пользователи
Сообщений: 205
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 24.07.2025 23:45
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"