TListView добавляет 600+ символов к заголовку элемента

Мне нужно добавить 600+ (или более) символов в Item.Caption и SubItems, но я вижу, что TListView полностью обрезает текст, если он длиннее N символов.

Я пробовал это:

procedure TForm1.FormCreate(Sender: TObject);
var
 i1: Integer;
 s: String;
begin
 for i1 := 0 to 690 do
  s := s + IntToStr(i1) + '-';

 with ListView1.Items.Add do
 begin
   Caption := s;
   SubItems.Add(s);
 end;
end;

Затем я включил ListView1.OwnerDraw := True;

Как вы можете видеть на картинке ниже, текст из столбца 1 проходит над столбцом 2:

введите здесь описание изображения

Кто-нибудь может помочь мне в решении этой проблемы?


person user2972081    schedule 09.11.2013    source источник
comment
Собственный вид списка не отображает более 260 символов. Что касается рисования владельца, вы можете показать код, который вы используете.   -  person Sertac Akyuz    schedule 09.11.2013


Ответы (1)


Быстрое тестовое приложение в Delphi 2007 с использованием следующего (более разумного) кода показывает, что ListView перестает отображать символы Ansi на 88-8, длина которого составляет 259 символов.

procedure TForm4.FormCreate(Sender: TObject);
var
  s: string;
  i: Integer;
  Item: TListItem;
begin
  s := '';
  for i := 0 to 89 do
    s := s + '-' + IntToStr(i);

  // Set the width of the first column so there's room for all
  ListView1.Columns[0].Width := ListView1.Canvas.TextWidth(s) + 10;

  Item := ListView1.Items.Add;
  Item.Caption := s;
  Item.SubItems.Add(s);

  // Display length of string actually displayed, which
  // is one short of the total length (the final '9' in '89'
  // is truncated), in the form's caption.
  Caption := IntToStr(Length(s) - 1);
end;

Добавление к нему нулевого терминатора (как того требует Windows API) означает, что это 260 символов, что, согласно документации MSDN, является максимальной длиной отображаемого текста; элемент LVITEM.pszText может хранить больше, но не будет отображать его.

(Спасибо @SertacAkyuz за ссылку, так что мне не пришлось ее искать.)

Вы можете убедиться в этом сами, используя RegEdit. Найдите значение реестра, превышающее этот предел (например, я быстро нашел HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder). RegEdit обрезает отображение независимо от того, насколько широко вы перетаскиваете столбец Data, но покажет вам полный текст в виде подсказки в одну строку, если вы наведете на нее указатель мыши. (Конечно, прочитать все это невозможно, если у вас нет нескольких широких мониторов, потому что вы не можете прокрутить окно подсказки.)

Невозможно сказать, что не так с вашим OwnerDraw кодом (если он у вас есть), потому что вы его не выкладывали. Простая установка OwnerDraw := True; ничего не делает без предоставления события для рисования.

Просто как комментарий: я бы переосмыслил ваш дизайн на вашем месте. Это ужасно с точки зрения пользовательского интерфейса, и я могу продемонстрировать, почему. Измените приведенный выше код на исходное значение 690 и запустите код. Вы увидите, что ширина первого столбца действительно достаточна для отображения всего, даже если текст останавливается в одной и той же точке (88-8). Однако обратите внимание, как далеко вам нужно прокручивать страницу, чтобы найти вторую колонку? Если бы я использовал ваше программное обеспечение, это бы воняло.

Было бы намного лучше, IMO, отображать небольшое количество текста в заголовке и отображать полный текст в метке или элементе управления заметками, если пользователь щелкает по нему, чтобы указать, что он действительно хочет прочитать все это или отобразить его. во всплывающем окне.

person Ken White    schedule 09.11.2013
comment
Я думаю, это все, обработчика рисования нет - OP, вероятно, устанавливает только OwnerDraw. - person Sertac Akyuz; 09.11.2013
comment
@Sertac: Я тоже так думал. :) Приготовьтесь к пересмотру или новому сообщению с просьбой привести пример рисования более 600 символов в столбце ListView. :D - person Ken White; 09.11.2013
comment
Спасибо, Кен и Сертак, очень ценим ваши ответы и рекомендации :) Я принял ответ. - person user2972081; 09.11.2013