delphi и отображение элементов списка - PullRequest
3 голосов
/ 13 июля 2010

Я использую список для отображения простого списка имен файлов. У меня также есть компонент редактирования, который позволяет мне искать эти элементы с помощью простого:

procedure TForm1.Edit1Change(Sender: TObject);
const
  indexStart = -1;
var
  search : array[0..256] of Char;
begin
  if edit1.Text='' then exit;
  StrPCopy(search, Edit1.Text) ;
  ListBox1.ItemIndex := ListBox1.Perform(LB_SELECTSTRING, indexStart, LongInt(@search));
end;

Теперь, есть ли способ "выборочно" отображать элементы в списке? Я имею в виду, что если я ищу элемент, начинающийся с «привет», то будут отображаться ТОЛЬКО те, которые будут «привет», либо затемняя те, которые не делают, либо делая видимыми: = false в целом. Есть ли способ сделать это с помощью списка?

спасибо!

О, это Delphi 7 ...

Ответы [ 2 ]

7 голосов
/ 13 июля 2010

Мне всегда нравится это (и я делаю это довольно часто):

У меня есть array of string или TStringList, содержащий элементы списка.Затем в Edit1Change я очищаю свойство Items и добавляю только те строки, которые соответствуют тексту в поле редактирования.

Array Of String

Если вы работаете с массивом строк, такиекак

var
  arr: array of string;

, который каким-либо образом инициализируется, как в

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetLength(arr, 3);
  arr[0] := 'cat';
  arr[1] := 'dog';
  arr[2] := 'horse';
end;

, тогда вы можете сделать

procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  ListBox1.Items.BeginUpdate;
  ListBox1.Items.Clear;
  if length(Edit1.Text) = 0 then
    for i := 0 to high(arr) do
      ListBox1.Items.Add(arr[i])
  else
    for i := 0 to high(arr) do
      if Pos(Edit1.Text, arr[i]) > 0 then
        ListBox1.Items.Add(arr[i]);
  ListBox1.Items.EndUpdate;
end;

Это будет отображать только те строки в массиве, которые содержит Edit1.Text;строка не должна начинаться с Edit1.Text.Для этого замените

Pos(Edit1.Text, arr[i]) > 0

на

Pos(Edit1.Text, arr[i]) = 1

TStringList

В случае TStringList, как в

var
  arr: TStringList;

и

procedure TForm1.FormCreate(Sender: TObject);
begin
  arr := TStringList.Create;
  arr.Add('cat');
  arr.Add('dog');
  arr.Add('horse');
end;

вы можете сделать

procedure TForm1.Edit1Change(Sender: TObject);
var
  i: Integer;
begin
  ListBox1.Items.BeginUpdate;
  ListBox1.Items.Clear;
  if length(Edit1.Text) = 0 then
    ListBox1.Items.AddStrings(arr)
  else
    for i := 0 to arr.Count - 1 do
      if Pos(Edit1.Text, arr[i]) = 1 then
        ListBox1.Items.Add(arr[i]);
  ListBox1.Items.EndUpdate;
end;

Чувствительность к регистру

Приведенный выше код использует регистрозависимое сопоставление, так что "bo" не будет соответствовать "Бостону"", например.Чтобы код не был чувствителен к регистру, введите

if Pos(AnsiLowerCase(Edit1.Text), AnsiLowerCase(arr[i])) > 0 then

вместо

if Pos(Edit1.Text, arr[i]) > 0 then
1 голос
/ 14 июля 2010

То, что вы запрашиваете, может быть реализовано путем подключения стандартного интерфейса Win32 API IAutoComplete к стандартному TEdit, TListBox не требуется.Не так сложно подключить объект TStrings к IAutoComplete, чтобы он знал, какие строки доступны для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...