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 中显示少量文本,并在标签或备忘录控件中显示全文,如果用户单击它以表明他们实际上想要阅读全部内容,或者显示它在弹出窗口中。