|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
ComboBox с поиском внутри строки
Здравствуйте!
Есть такой компонент, как 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 работает нужным мне образом. Теперь нужно наладить их правильное взаимодействие. Для этого и делаю компонент. Если получится что дельное - отпишусь. |