![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Господа программисты, помогите, пожалуйста, идеями!
Задача такая: есть база данных (access), содержащая, помимо всего прочего список учащихся - поле "ФИО" в таблице. Интерфейс к БД пишется на делфи. На одной из форм есть элемент TEdit, в который нужно вводить фамилию учащегося. При этом при вводе должна выпадать подсказка на основе данных, содержащихся в БД: предположим, вводим фамилию Алексеев. Ввели первую букву фамилии - например, А. Выдались все фамилии на букву А . Ввели следующую букву л - список подсказки поменялся, остались только те фамилии, которые начинаются на Ал... Ввели следующую букву - список еще сократился. Ну, и нужно дать возможность пользователю выбрать нужную фамилию из имеющегося списка... Как это все реализовать? Если где-то описана похожая проблема - киньте ссылку! Заранее премного благодарна! |
#2
|
|||
|
|||
![]() Я бы смотрел в сторону ComboBox. Это если список не очень большой. Если список большой, то тут придется изголяться. Открывать его все-равно придется весь, но можно фильтрацию устроить с помощью OnFilterRecord.
|
#3
|
|||
|
|||
![]() Цитата:
Список достаточно большой - порядка 200 записей, по моим подсчетам. Может быть, будет больше... Про ComboBox я тоже думала... А не подскажите, как сделать, чтобы выпадающий список автоматически раскрывался, а не при нажатии на стрелочку? |
#4
|
||||
|
||||
![]() Открыть ComboBox:
Код:
ComboBox1.DroppedDown := True; ... ComboBox1.Perform(CB_SHOWDROPDOWN, True, 0); Код:
procedure AutoInsertComboBoxItem(ComboBox: TCombobox; var LastLength: integer); var i, ln: integer; begin // Сравниваем длину текста, если новая длина меньше старой - // значит было удаление символов и автоподбор не нужен if Length(ComboBox.Text) <= LastLength then begin LastLength := Length(ComboBox.Text); exit; end; // Запоминаем длину текста для следующего вызова процедуры LastLength := Length(ComboBox.Text); // Ищем в списке начала строк, совпадающие с введенным текстом for i := 0 to ComboBox.Items.Count - 1 do begin // Для поиска с учетом регистра: //if Copy(ComboBox.Items[i],1,Length(ComboBox.Text)) = ComboBox.Text then // Для поиска без учета регистра: if Copy(AnsiUpperCase(ComboBox.Items[i]), 1, Length(ComboBox.Text)) = AnsiUpperCase(ComboBox.Text) then begin ln := length(ComboBox.Text); // Вставляем текст ComboBox.Text := ComboBox.Items[i]; // Выделяем добавленный блок текста ComboBox.SelStart := ln; ComboBox.SelLength := Length(ComboBox.Items[i]) - ln; break; end; end; end; Пример использования: Код:
var Form1: TForm1; EndL: integer; implementation procedure TForm1.ComboBox1Change(Sender: TObject); begin AutoInsertComboBoxItem(ComboBox1, EndL); end; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. Последний раз редактировалось angvelem, 29.06.2012 в 00:15. |
#5
|
|||
|
|||
![]() Цитата:
о, это именно то, что нужно! Попробовала сейчас - работает! Спасибо Вам огромнейшее! |