I have a listview and and imagelist on my form, the listview is set to display large icons from left to right. The problem is that I want to set a limit on how many items the listview can display at a time, say 10. I want to just pass a bitmap to this listview procedure, and it can internally add it and delete the first one if the total number of icons is already 10. This procedure works well up to 11, but then it starts adding icons not to the end of the listview but the beginning in increasing numbers. I've tried everything but can't seem to get it right.
procedure TForm1.FormCreate(Sender: TObject);
begin
ImageList1.Height := 200;
ImageList1.Width := 200;
// initialize LV
ListView1.Left := 8;
ListView1.Top := 12;
ListView1.Height := 244;
ListView1.Width := 445;
ListView1.Color := clActiveCaption;
ListView1.ColumnClick := False;
ListView1.IconOptions.Arrangement := iaLeft;
ListView1.ShowColumnHeaders := False;
ListView1.LargeImages := ImageList1;
ListView1.LargeImages.Height := 200;
ListView1.LargeImages.Width := 200;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
bmp: TBitmap;
begin
OpenDialog1.Filter := 'Bitmaps (*.bmp)|*.BMP';
if OpenDialog1.Execute then
begin
if OpenDialog1.FileName <> '' then
begin
bmp := TBitmap.Create;
try
bmp.LoadFromFile(OpenDialog1.FileName);
pushOntoListView(ImageList1, ListView1, bmp, OpenDialog1.FileName);
finally
bmp.Free;
end;
end;
end;
end;
procedure pushOntoListView(IL: TImageList; LV: TListView; bmp: TBitmap; inputStr: String);
const
Max_Count = 10;
var
index: integer;
ListItem: TListItem;
begin
if LV.Items.Count >= Max_Count then
begin
//IL.Delete(0);
LV.Items.Delete(0);
end;
// load bitmap into ImageList
index := IL.Add(bmp, nil);
// load ImageList into ListView
if index > -1 then
begin
with LV do
begin
ListItem := Items.Add;
Listitem.Caption := inputStr;
ListItem.ImageIndex := index;
end;
end;
end;
Open in new window