Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TListView添加600+;项目标题上的字符_Listview_Delphi_Ownerdrawn_Tlistview - Fatal编程技术网

TListView添加600+;项目标题上的字符

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

我需要在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

如下图所示,第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个字符的示例:谢谢你,肯和塞塔克,非常感谢你的回答和建议:)我接受了答案。