我需要在Item.Caption和SubItems上添加600多个(或更多)字符,但我发现如果文本长于N个字符,TListView会完全剪切文本。
我试过了:
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:
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:3)
Delphi 2007中的快速测试应用程序,使用以下(更合理的)代码,显示ListView
停止在88-8
显示Ansi字符,长度为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
)。无论您拖动Data
列的宽度,RegEdit都会截断显示,但如果将鼠标悬停在其上,则会以单行提示显示全文。 (当然,除非你有多个宽显示器,否则不可能全部读取,因为你无法滚动提示窗口。)
你的OwnerDraw
代码(如果你有的话)是不可能的,因为你没有发布它。仅仅设置OwnerDraw := True;
没有提供任何事件来进行绘图。
正如评论:如果我是你,我会重新考虑你的设计。从UI的角度来看,这很糟糕,我可以证明原因。将上面的代码更改为原始690
值并运行代码。您将看到第一列确实将其宽度设置为足以显示全部,即使文本停在同一点(88-8
)。但是,请注意你必须在多大程度上滚动才能找到第二列?如果我使用你的软件,那会很臭。
在标题中显示少量文本会更好,如果用户点击它以表明他们确实想要全部阅读,则在标签或备忘录控件中显示全文,或者在弹出窗口中显示它。