TListView添加600+;项目标题上的字符
我需要在Item.Caption和SubItems上添加600+(或更多)个字符,但我发现如果文本长度超过N个字符,TListView会完全剪切文本 我试过这个:TListView添加600+;项目标题上的字符,listview,delphi,ownerdrawn,tlistview,Listview,Delphi,Ownerdrawn,Tlistview,我需要在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 b
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列:
有人能帮我解决这个问题吗?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文档,它是显示文本的最大长度;成员可以存储更多,但不会显示
(感谢@SertacAkyuz提供的链接,所以我不必找到它。)
您可以使用RegEdit自己验证这一点。查找超过该限制的注册表值(例如,我很快找到了HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder
)。无论将数据
列拖动多宽,RegEdit都会截断显示,但如果将鼠标悬停在该列上,则会在单行提示中显示全文。(当然,除非您有多个宽屏显示器,否则不可能全部读取,因为您无法滚动提示窗口。)
你不可能说出你的OwnerDraw
代码有什么问题(如果你有),因为你没有发布它。仅设置OwnerDraw:=True代码>在不提供用于绘制图形的事件的情况下不会执行任何操作
作为评论:如果我是你,我会重新考虑你的设计。从UI的角度来看,这很糟糕,我可以说明原因。将上述代码更改为原始的690
值,然后运行代码。您将看到,第一列确实将其宽度设置为足以显示所有内容,即使文本停在同一点(88-8
)。但是,请注意,要找到第二列,您需要滚动多远?如果我用的是你的软件,那就糟了
IMO,最好在标题中显示少量文本,并在标签或备忘录控件中显示全文,如果用户点击它表示他们确实想阅读所有内容,或者在弹出窗口中显示它。Delphi 2007中的一个快速测试应用程序,使用以下(更合理的)代码,显示列表视图
在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文档,它是显示文本的最大长度;成员可以存储更多,但不会显示
(感谢@SertacAkyuz提供的链接,所以我不必找到它。)
您可以使用RegEdit自己验证这一点。查找超过该限制的注册表值(例如,我很快找到了HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Arbiters\AllocationOrder
)。无论将数据
列拖动多宽,RegEdit都会截断显示,但如果将鼠标悬停在该列上,则会在单行提示中显示全文。(当然,除非您有多个宽屏显示器,否则不可能全部读取,因为您无法滚动提示窗口。)
你不可能说出你的OwnerDraw
代码有什么问题(如果你有),因为你没有发布它。仅设置OwnerDraw:=True代码>在不提供用于绘制图形的事件的情况下不会执行任何操作
作为评论:如果我是你,我会重新考虑你的设计。从UI的角度来看,这很糟糕,我可以说明原因。将上述代码更改为原始的690
值,然后运行代码。您将看到,第一列确实将其宽度设置为足以显示所有内容,即使文本停在同一点(88-8
)。但是,请注意,要找到第二列,您需要滚动多远?如果我用的是你的软件,那就糟了
依我看,最好在标题中显示少量文本,如果用户单击标签或备忘录控件以表示他们确实想全部阅读,或在弹出窗口中显示,则在标签或备忘录控件中显示全文。本机列表视图显示的字符数不超过260个。对于所有者绘图,您可能希望显示正在使用的代码。本机列表视图显示的字符数不超过260个。至于所有者绘图,您可能希望显示正在使用的代码。我想就是这样,没有绘图处理程序-OP可能只设置了OwnerDraw。@Sertac:我也这么认为。:)准备好修订版或新帖子,要求提供所有者在ListView列中绘制超过600个字符的示例:谢谢Ken和Sertac,非常感谢你的回答和建议:)我接受了答案。我想就是这样,没有绘图处理程序-OP可能只是设置了OwnerDraw。@Sertac:我也这么想。:)准备好修订版或新帖子,要求提供所有者在ListView列中绘制超过600个字符的示例:谢谢你,肯和塞塔克,非常感谢你的回答和建议:)我接受了答案。