Стандартный компонент TListView в Delphi (и его расширенная версия TJvListView из библиотеки JVCL) имеет ограничение на длину текста в подэлементах (SubItems) - отображается только первые 255 символов. Это ограничение связано с особенностями реализации стандартного элемента управления Windows ListView, как указано в документации Microsoft.
В приведенном коде видно, что при попытке добавить длинный текст (670 символов) в SubItem, отображаются только первые 255 символов:
ListItem1.SubItems.Add('<RHINOSTRING English="Exploding this mesh will create...'); // Длинный текст обрезается
Решение: Owner-Draw режим
Для обхода этого ограничения можно использовать режим Owner-Draw (отрисовка владельцем), когда вы сами управляете процессом отрисовки элементов списка.
Основные шаги реализации:
Установите свойство OwnerDraw в True
Обработайте событие OnDrawItem для кастомной отрисовки
Убедитесь, что включен режим vsReport (табличное представление)
Пример реализации:
procedure TForm1.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
begin
if Sender = nil then Exit;
if Item = nil then Exit;
// Настройка цветов для выделенных и обычных элементов
if odSelected in State then
begin
Sender.Canvas.Font.Color := clHighlightText;
Sender.Canvas.Brush.Color := clHighlight;
end
else
begin
Sender.Canvas.Font.Color := clWindowText;
Sender.Canvas.Brush.Color := clWindow;
end;
// Заливка фона
Sender.Canvas.Brush.Style := bsSolid;
Sender.Canvas.FillRect(Rect);
var R := Rect;
var S: string;
Sender.Canvas.Brush.Style := bsClear;
R.Offset(ScaleValue(5), 0); // Небольшой отступ от края
// Отрисовка всех колонок
for var i := 0 to ListView1.Columns.Count - 1 do
begin
R.Width := Sender.Column[i].Width - ScaleValue(5);
if i = 0 then
S := Item.Caption
else
S := Item.SubItems[i - 1];
Sender.Canvas.TextRect(R, S, [tfSingleLine, tfVerticalCenter, tfEndEllipsis]);
R.Offset(Sender.Column[i].Width, 0);
end;
// Рисование фокуса
R := Rect;
R.Inflate(-ScaleValue(1), -ScaleValue(1));
if odFocused in State then
begin
Sender.Canvas.Pen.Color := clWindow;
Sender.Canvas.Brush.Color := clWindow;
Sender.Canvas.DrawFocusRect(R);
end;
end;
Альтернативные решения
1. Использование Virtual ListView
Для больших объемов данных можно использовать OwnerData режим:
procedure TForm1.FormCreate(Sender: TObject);
begin
ListView1.OwnerData := True;
ListView1.OnData := ListView1Data;
ListView1.Items.Count := 1000; // Указываем общее количество элементов
end;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := 'Item ' + IntToStr(Item.Index);
Item.SubItems.Add('Long text for item ' + IntToStr(Item.Index) +
': ' + StringOfChar('X', 500)); // Более 255 символов
end;
2. Подклассирование ListView
Можно создать потомок TListView и переопределить его поведение:
Некоторые сторонние компоненты не имеют этого ограничения, например: - DevExpress ExpressQuantumGrid - TMS TAdvListView - LMD Innovative LMDListView
Советы по оптимизации
Двойная буферизация: Включите DoubleBuffered := True для предотвращения мерцания
Масштабирование: Используйте ScaleValue для корректного отображения на разных DPI
Производительность: Для большого количества элементов используйте BeginUpdate/EndUpdate
ListView1.Items.BeginUpdate;
try
// Добавление множества элементов
finally
ListView1.Items.EndUpdate;
end;
Заключение
Ограничение в 255 символов для подэлементов TListView можно успешно обойти с помощью Owner-Draw режима. Это дает полный контроль над процессом отрисовки и позволяет отображать тексты любой длины. Для оптимального решения следует учитывать требования к производительности и удобству работы пользователя.
Приведенные примеры кода демонстрируют основные подходы к решению проблемы, и вы можете адаптировать их под свои конкретные задачи в Delphi-приложениях.
Обход ограничения в 255 символов для подэлементов TListView в Delphi возможен через Owner-Draw режим, позволяющий кастомную отрисовку элементов без ограничений на длину текста.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.