Вопрос, с которым сталкиваются разработчики, работающие с компонентом TListView в режиме vsReportMode, заключается в том, что не удаётся назначить индекс изображения для подэлементов. Это может показаться очевидной ошибкой, однако свойство ImageIndex не существует для подэлементов напрямую. Рассмотрим, как можно решить эту проблему, используя свойства компонента.
Пример некорректного использования свойства:
Разработчики пытаются присвоить индекс изображения для подэлементов следующим образом:
ListView1.Items[0].ImageIndex := 0;
ListView1.Items[1].ImageIndex := 1;
ListView1.Items[2].ImageIndex := 2;
// Ожидаемый, но неверный способ назначения изображения подэлементам
ListView1.Items[0].SubItems[0].ImageIndex := 0;
ListView1.Items[1].SubItems[0].ImageIndex := 1;
ListView1.Items[2].SubItems[0].ImageIndex := 2;
Подтверждённый ответ и решение проблемы:
Для решения этой задачи следует использовать свойство SubItemImages. Вот пример кода, который демонстрирует, как это можно сделать:
var
LI: TListItem;
i: Integer;
begin
ListView1.ViewStyle := vsReport;
for i := 0 to 1 do
with ListView1.Columns.Add do
Caption := 'Column ' + IntToStr(i);
for i := 0 to ImageList1.Count - 1 do
begin
LI := ListView1.Items.Add;
LI.Caption := Format('Item %d', [i]);
LI.ImageIndex := i;
LI.SubItems.Add(Format('SubItem %d', [i]));
LI.SubItemImages[0] := i; // Подэлементы[0] := ImageIndex;
end;
end;
Результатом работы данного кода будет TListView с подэлементами и изображениями:
Дополнительные замечания:
Если вы не хотите отображать изображение в первой колонке, но желаете, чтобы только подэлементы имели изображения, можно установить ImageIndex первой колонки в -1:
li.ImageIndex := -1;
li.SubItemImages[0] := 1;
Это позволит избежать отображения изображения в первой колонке, но текст первой колонки будет смещён на размер изображения.
Также, если стандартное поведение не подходит, вы можете создать кастомный рисунок для первой колонки.
Таким образом, разработчики могут использовать свойство SubItemImages для назначения изображений подэлементам в TListView в режиме vsReportMode, что позволяет решить возникшую проблему.
Проблема заключается в том, что при использовании компонента TListView в режиме vsReportMode с двумя колонками, невозможно напрямую назначить индекс изображения подэлементам, и для решения этого вопроса необходимо использовать свойство SubItemImages.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS