Элементы списка VCL, Список в API, не имеют свойства видимости.Единственный вариант не показывать элемент - это удалить его.
Однако вы можете использовать элемент управления в виртуальном режиме, когда элементов вообще нет.Вы сами решаете, какие данные хранить, какие отображать.Это LBS_NODATA
стиль окна в API.В VCL установите для свойства style
значение lbVirtual
.
Ниже приведен чрезвычайно упрощенный пример.
Давайте сохраним массив записей, по одной записи на виртуальный элемент.
type
TListItem = record
FileName: string;
Visible: Boolean;
end;
TListItems = array of TListItem;
Вы можете расширить поля в соответствии с вашими требованиями.Видимость - одна из главных проблем в вопросе, добавил я.Вы, вероятно, добавили бы что-то, представляющее исходное имя, чтобы вы знали, какое имя было изменено, и т. Д.
Иметь один массив в каждом спискеЭтот пример содержит один список.
var
ListItems: TListItems;
Хотя лучше сделать это поле, это только для демонстрации.
Необходимые единицы.
uses
ioutils, types;
Некоторая инициализация при создании формы.Очистите фильтр.Установите стиль списка соответственно.Заполните некоторые имена файлов.Все элементы будут видны при запуске.
procedure TForm1.FormCreate(Sender: TObject);
var
ListFiles: TStringDynArray;
i: Integer;
begin
ListFiles := ioutils.TDirectory.GetFiles(TDirectory.GetCurrentDirectory);
SetLength(ListItems, Length(ListFiles));
for i := 0 to High(ListItems) do begin
ListItems[i].FileName := ListFiles[i];
ListItems[i].Visible := True;
end;
ListBox1.Style := lbVirtual;
ListBox1.Count := Length(ListFiles);
Edit1.Text := '';
end;
В виртуальном режиме список интересует только свойство Count
.Это определит, сколько элементов будет отображаться, соответственно область прокрутки.
Вот часть фильтра, она чувствительна к регистру.
procedure TForm1.Edit1Change(Sender: TObject);
var
Text: string;
Cnt: Integer;
i: Integer;
begin
Text := Edit1.Text;
if Text = '' then begin
for i := 0 to High(ListItems) do
ListItems[i].Visible := True;
Cnt := Length(ListItems);
end else begin
Cnt := 0;
for i := 0 to High(ListItems) do begin
ListItems[i].Visible := Pos(Text, ListItems[i].FileName) > 0;
if ListItems[i].Visible then
Inc(Cnt);
end;
end;
ListBox1.Count := Cnt;
end;
Особый случай в редакторе OnChange
заключается в том, чтокогда текст пуст.Тогда все предметы покажут.В противном случае код от вопроса.Здесь мы также сохраняем общее количество видимых элементов, чтобы мы могли соответствующим образом обновить список.
Теперь единственная интересная часть, список требует данных.
procedure TForm1.ListBox1Data(Control: TWinControl; Index: Integer;
var Data: string);
var
VisibleIndex: Integer;
i: Integer;
begin
VisibleIndex := -1;
for i := 0 to High(ListItems) do begin
if ListItems[i].Visible then
Inc(VisibleIndex);
if VisibleIndex = Index then begin
Data := ListItems[i].FileName;
Break;
end;
end;
end;
Что здесь происходит, так это то, чтодля списка требуется элемент, показывающий его индекс.Мы перебираем главный список, подсчитывающий видимые элементы, чтобы выяснить, какой из них соответствует этому индексу, и предоставляем его текст.