Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.05.2022, 08:33
Cafabuiter Cafabuiter вне форума
Прохожий
 
Регистрация: 04.05.2022
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию ComboBox с поиском внутри строки

Здравствуйте!
Есть такой компонент, как ComboBox.
Если его свойство AutoComplete = true, то он "подбирает" из списка его строк те, которые НАЧИНАЮТСЯ с текста, вводимого пользователем в поле редактирования.
Нельзя ли сделать, чтобы компонент подбирал строки, которые СОДЕРЖАТ (необязательно - в начале) текст, вводимый пользователем?
Ответить с цитированием
  #2  
Старый 05.05.2022, 14:31
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Можно сделать всё
Код:
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  
Старый 05.05.2022, 22:10
Cafabuiter Cafabuiter вне форума
Прохожий
 
Регистрация: 04.05.2022
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Kailon
Можно сделать всё
Код:
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;

Спасибо за ответ!
Но, судя по Вашему коду, это решение использует два экранных элемента: TEdit и TComboBox. То есть, ComboBox фильтруется используя строку,вводимую в Edit. Я же хотел обойтись одним ComboBox.
Ответить с цитированием
  #4  
Старый 06.05.2022, 22:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Делал подобнцую штуку. Только так именно был поиск с начала строки, т.к. по результатам поиска в поле редактирования 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  
Старый 07.05.2022, 15:42
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Цитата:
Сообщение от Cafabuiter
...ComboBox фильтруется используя строку,вводимую в Edit...
Да, совершенно верно. Можно, конечно, переделать и на ввод текста в ComboBox
Код:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  if ComboBox1.Text <> '' then
    ComboBox1.Items := CBFilter(ComboBox1.Text)
  else
    ComboBox1.Items := SList;
end;
Но тогда возникают интересные ситуации:
  1. По мере ввода, курсор остаётся в начале строки и как следствие вводимый текст получается перевёрнутым.
  2. При выборе любого элементы выпадающего списка, поле ввода становится пустым, а сам список очищается.
  3. Свойство AutoComplete, скорее всего, придётся отключить.
Если решить эти проблемы, то всё будет работать как Вам надо.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #6  
Старый 10.05.2022, 07:48
Cafabuiter Cafabuiter вне форума
Прохожий
 
Регистрация: 04.05.2022
Сообщения: 3
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ну да, обо всё это я уже споткнулся.
Теперь пытаюсь делать некий эрзац-комбобокс: новый компонент, состоящий из TEdit и TList (возможно, вместо TList - TMemo), всё это - на TPanel.
Будет некий исходный набор строк TStringList, из которого, по мере ввода текста в TEdit, при помощи Pos() будут подбираться и вноситься в TList подходящие строки. Собранная на скорую руку пара из TEdit и TList работает нужным мне образом. Теперь нужно наладить их правильное взаимодействие. Для этого и делаю компонент.
Если получится что дельное - отпишусь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter