![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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; Последний раз редактировалось angvelem, 29.06.2012 в 00:15. |
|
#5
|
|||
|
|||
|
Цитата:
о, это именно то, что нужно! Попробовала сейчас - работает! Спасибо Вам огромнейшее! |