This example is from documentation, GetNextItem
:
procedure TForm1.Button1Click(Sender: TObject);
var
Item: TListItem;
begin
Item := ListView1.Selected;
while Item <> nil do
begin
ListBox1.Items.Add(Item.Caption);
Item := ListView1.GetNextItem(Item, sdAll, [isSelected]);
end;
end;
TListView.Selected
gets the first selected item, while GetNextItem
unwinds more selected items.
As noted by David, it is possible to wrap this logic into an enumerator, so that a for .. in
loop could be used.
The easiest thing is to put this enumeration into a class helper, much like the answer from @StefanGlienke
.
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;
{ TSelectedListItemsEnumerator }
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;
{ TListViewHelper }
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
Memo1.Lines.Add(Item.Caption);
end;
end;