Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как обойти ограничение в 255 символов для подэлементов TListView (и TJvListView) в Delphi?

Delphi , Компоненты и Классы , TListView

 

Проблема ограничения длины подэлементов

Стандартный компонент 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 (отрисовка владельцем), когда вы сами управляете процессом отрисовки элементов списка.

Основные шаги реализации:

  1. Установите свойство OwnerDraw в True
  2. Обработайте событие OnDrawItem для кастомной отрисовки
  3. Убедитесь, что включен режим 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 и переопределить его поведение:

type
  TLongTextListView = class(TListView)
  protected
    procedure DrawItem(Item: TListItem; Rect: TRect; State: TOwnerDrawState); override;
  end;

procedure TLongTextListView.DrawItem(Item: TListItem; Rect: TRect; State: TOwnerDrawState);
begin
  // Кастомная реализация отрисовки
end;

3. Использование сторонних компонентов

Некоторые сторонние компоненты не имеют этого ограничения, например: - DevExpress ExpressQuantumGrid - TMS TAdvListView - LMD Innovative LMDListView

Советы по оптимизации

  1. Двойная буферизация: Включите DoubleBuffered := True для предотвращения мерцания
  2. Масштабирование: Используйте ScaleValue для корректного отображения на разных DPI
  3. Производительность: Для большого количества элементов используйте 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TListView ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-29 02:58:11/0.0036530494689941/0