1

我需要在 Item.Caption 和 SubItems 上添加 600 多个(或更多)字符,但我看到 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;

从下图中可以看出,Column1 中的文本越过了 Column2:

在此处输入图像描述

任何人都可以帮助我解决这个问题吗?

4

1 回答 1

4

Delphi 2007 中的一个快速测试应用程序,使用以下(更合理的)代码,显示在259 个字符的长度ListView处停止显示 Ansi字符。88-8

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例如,我很快找到了)。无论您拖动Data列多宽,RegEdit 都会截断显示,但如果您将鼠标悬停在它上面,它将以单行提示向您显示全文。(当然,除非您有多个宽显示器,否则不可能全部阅读,因为您无法滚动提示窗口。)

不可能说出您的OwnerDraw代码有什么问题(如果有的话),因为您没有发布它。如果不提供事件来进行绘图,仅设置OwnerDraw := True;不会做任何事情。

就像评论一样:如果我是你,我会重新考虑你的设计。从 UI 的角度来看,这很糟糕,我可以证明原因。将上面的代码更改为您的原始690值并运行代码。您会看到第一列确实将其宽度设置为足以显示所有内容,即使文本停在同一点 ( 88-8)。但是,请注意您必须滚动多远才能找到第二列?如果我使用你的软件,那会很臭。

IMO 最好在 Caption 中显示少量文本,并在标签或备忘录控件中显示全文,如果用户单击它以表明他们实际上想要阅读全部内容,或者显示它在弹出窗口中。

于 2013-11-09T19:19:09.260 回答