![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте!
Есть такой компонент, как ComboBox. Если его свойство AutoComplete = true, то он "подбирает" из списка его строк те, которые НАЧИНАЮТСЯ с текста, вводимого пользователем в поле редактирования. Нельзя ли сделать, чтобы компонент подбирал строки, которые СОДЕРЖАТ (необязательно - в начале) текст, вводимый пользователем? |
|
#2
|
||||
|
||||
|
Можно сделать всё
Код:
var
SList: TStringList;
...
function CBFilter(AText: String): TStringList;
var
I: LongInt;
SL: TStringList;
begin
SL := TStringList.Create;
for I := 0 to SList.Count - 1 do
if Pos(AnsiUpperCase(AText), AnsiUpperCase(SList[i])) > 0 then
SL.Add(SList[i]);
Result := SL;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text <> '' then
ComboBox1.Items := CBFilter(Edit1.Text)
else
ComboBox1.Items := SList;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: LongInt;
begin
SList := TStringList.Create;
for I := 0 to ComboBox1.Items.Count - 1 do
SList.Add(ComboBox1.Items[i]);
end; |
| Этот пользователь сказал Спасибо Kailon за это полезное сообщение: | ||
Cafabuiter (05.05.2022)
| ||
|
#3
|
|||
|
|||
|
Цитата:
Спасибо за ответ! Но, судя по Вашему коду, это решение использует два экранных элемента: TEdit и TComboBox. То есть, ComboBox фильтруется используя строку,вводимую в Edit. Я же хотел обойтись одним ComboBox. |
|
#4
|
|||
|
|||
|
Делал подобнцую штуку. Только так именно был поиск с начала строки, т.к. по результатам поиска в поле редактирования ComboBox вписвывася текст найденной строки и делалось выделение (select) текста после найденного отрезка. Как результат, при наборе с клавиатуры следующего символа происходила замена "хвоста" на введенный символ и поиск повторялся.
В твоем случае не понятно что выделять. Тут действительно можно только отфильтровать выпадающий список. Код:
uses System.StrUtils;
procedure TForm1.InitCbDropList;
begin
ComboBox1.Items.Clear;
ComboBox1.Items.Add('Item1');
...
ComboBox1.Items.Add('ItemN');
end;
procedure TForm1.ComboBox1Change(Sender : TObject);
var
I : Integer;
SL : TStringList;
begin
If ComboBox1.Text = ''
Then InitCbDropList
Else
Begin
SL := TStringList.Create;
Try
For I := 0 To ComboBox1.ITems.Count-1 Do
If ContainsText(ComboBox1.ITems[i],ComboBox1.Text) Then
SL.Add(ComboBox1.ITems[i]);
ComboBox1.Items.Assign(SL);
Finally
SL.Free;
End;
End;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
InitCbDropList;
end;Последний раз редактировалось lmikle, 06.05.2022 в 22:35. |
|
#5
|
||||
|
||||
|
Цитата:
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.Text <> '' then
ComboBox1.Items := CBFilter(ComboBox1.Text)
else
ComboBox1.Items := SList;
end;
|
|
#6
|
|||
|
|||
|
Ну да, обо всё это я уже споткнулся.
Теперь пытаюсь делать некий эрзац-комбобокс: новый компонент, состоящий из TEdit и TList (возможно, вместо TList - TMemo), всё это - на TPanel. Будет некий исходный набор строк TStringList, из которого, по мере ввода текста в TEdit, при помощи Pos() будут подбираться и вноситься в TList подходящие строки. Собранная на скорую руку пара из TEdit и TList работает нужным мне образом. Теперь нужно наладить их правильное взаимодействие. Для этого и делаю компонент. Если получится что дельное - отпишусь. |