Преодоление Ошибки: Использование GetNextItem для Перебора Выделенных Элементов Списка в Delphi
Описание проблемы
При работе с компонентом TListView в Delphi возникает ошибка, когда пытаются перебрать выделенные элементы списка. Ошибка связана с использованием конструкции for-in для объекта типа TListItem, который не поддерживает итерацию по умолчанию.
Оригинальный код
Вот пример кода, который приводит к ошибке:
var
TLsttem: TListItem;
begin
for TLsttem in form1.listview1.Selected do
begin
// Действия с элементом списка
end;
end;
Ошибка, возникающая при выполнении данного кода:
[dcc32 Error] MSGBox.pas(50): E2431 for-in statement cannot operate on collection type 'TListItem' because 'TListItem' does not contain a member for 'GetEnumerator', or it is inaccessible
Решение проблемы
Для перебора выделенных элементов TListView необходимо использовать метод GetNextItem. Вот пример кода, который правильно перебирает выделенные элементы:
var
Item: TListItem;
begin
Item := ListView1.Selected;
while Item <> nil do
begin
// Действия с элементом списка Item.Caption
Item := ListView1.GetNextItem(Item, sdAll, [isSelected]);
end;
end;
Альтернативный ответ: Использование перечислителя
Для удобства можно создать перечислитель, который позволит использовать конструкцию for-in для перебора выделенных элементов. Вот пример класса-перечислителя:
type
TSelectedListItemsEnumerator = record
private
FListView: TListView;
FItem: TListItem;
public
constructor Create(aListView: TListView);
function GetEnumerator: TSelectedListItemsEnumerator;
function MoveNext: Boolean;
property Current: TListItem read FItem;
end;
TListViewHelper = class helper for TListView
private
function GetSelectedItems: TSelectedListItemsEnumerator;
public
property SelectedItems: TSelectedListItemsEnumerator
read GetSelectedItems;
end;
constructor TSelectedListItemsEnumerator.Create(aListView: TListView);
begin
FListView := aListView;
end;
function TSelectedListItemsEnumerator.GetEnumerator: TSelectedListItemsEnumerator;
begin
FItem := nil;
Result := Self;
end;
function TSelectedListItemsEnumerator.MoveNext: Boolean;
begin
FItem := FListView.GetNextItem(FItem, sdAll, [isSelected]);
Result := (FItem <> nil);
end;
function TListViewHelper.GetSelectedItems: TSelectedListItemsEnumerator;
begin
Result := TSelectedListItemsEnumerator.Create(Self);
end;
Теперь можно использовать перечислитель для перебора элементов:
procedure TForm1.Button2Click(Sender: TObject);
var
Item: TListItem;
begin
for Item in ListView1.SelectedItems do
begin
// Действия с элементом списка Item
end;
end;
Заключение
При работе с выделенными элементами TListView важно использовать метод GetNextItem, который позволяет корректно перебрать все выделенные элементы. Создание перечислителя позволяет упростить процесс итерации, делая код более читаемым и удобным для поддержки.
Пользователь столкнулся с ошибкой при попытке перебрать выделенные элементы в компоненте `TListView` в Delphi, используя конструкцию `for-in` для объекта `TListItem`, и ищет решение этой проблемы.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.