如何在Delphi中触发ListView中的项目包装?

如何在Delphi中触发ListView中的项目包装?,listview,delphi,delphi-7,Listview,Delphi,Delphi 7,我将ListView设置为vsIcon。每个项目都是一个图像,下面有一个小文本。当我添加许多项时,它们会按照ListView的宽度进行包装(例如,一行5项)。但是,当我改变它的宽度时,它们就不再为新的宽度进行包装 到目前为止,我尝试的是: ListView.Update 刷新 重新绘制 函数列表视图(hwndLV:HWND;代码:UINT):布尔 函数ListView_重绘项(hwndLV:HWND;iFirst,iLast:Integer):Bool 我没有尝试对项目进行排序,因为我不希望

我将ListView设置为vsIcon。每个项目都是一个图像,下面有一个小文本。当我添加许多项时,它们会按照ListView的宽度进行包装(例如,一行5项)。但是,当我改变它的宽度时,它们就不再为新的宽度进行包装

到目前为止,我尝试的是:

  • ListView.Update

  • 刷新

  • 重新绘制

  • 函数列表视图(hwndLV:HWND;代码:UINT):布尔

  • 函数ListView_重绘项(hwndLV:HWND;iFirst,iLast:Integer):Bool

我没有尝试对项目进行排序,因为我不希望对它们进行排序。但大多数情况下,它们是被排序的,所以排序不会有多大帮助(如果它能将它们包装起来,我相信它不会)

我现在用的是:

procedure TForm.WMExitSizeMove(var Message: TMessage);
var
   i, p: Integer;
   ListItem: TListItem;
   c: array of string;
   b: array of Boolean;
begin
   if Showing and (PreviousWidth <> Width) then
   begin
      p := ListView.ItemIndex;
      SetLength(c, ImageList.Count);
      SetLength(b, ImageList.Count);
      for i := 0 to ImageList.Count - 1 do
      begin
         c[i] := ListView.Items[i].Caption;
         b[i] := ListView.Items[i].Selected;
      end;
      ListView.Items.BeginUpdate;
      ListView.Clear;
      for i := 0 to ImageList.Count - 1 do
      begin
         ListItem := ListView.Items.Add;
         ListItem.Caption := c[i];
         ListItem.ImageIndex := i;
         ListItem.Selected := b[i];
      end;
      ListView.ItemIndex := p;
      ListView.Items.EndUpdate;
      SetLength(c, 0);
      SetLength(b, 0);
      PreviousWidth := Width;
   end;
   inherited;
end;
过程TForm.WMExitSizeMove(var消息:TMessage);
变量
i、 p:整数;
列表项:TListItem;
c:字符串数组;
b:布尔数组;
开始
如果显示和(以前的宽度),则
开始
p:=ListView.ItemIndex;
SetLength(c,ImageList.Count);
SetLength(b,ImageList.Count);
对于i:=0到ImageList.Count-1 do
开始
c[i]:=ListView.Items[i]。标题;
b[i]:=ListView.Items[i]。选中;
结束;
ListView.Items.BeginUpdate;
ListView.Clear;
对于i:=0到ImageList.Count-1 do
开始
ListItem:=ListView.Items.Add;
标题:=c[i];
ListItem.ImageIndex:=i;
ListItem.Selected:=b[i];
结束;
ListView.ItemIndex:=p;
ListView.Items.EndUpdate;
设定长度(c,0);
设定长度(b,0);
前一个宽度:=宽度;
结束;
继承;
结束;
但是,正如您所注意到的,对于大量的项目来说,速度并没有那么快。 你能帮我找到一个更好的方法吗

多谢各位


我使用Delphi 7。

listview可以自动为您执行此操作。 在代码的某个地方(可能在formcreate中)插入以下内容:

listview.IconOptions.AutoArrange := true;

或者您也可以在“属性”窗口中进行设置。

谢谢,但它不起作用。我制作了一个简单的应用程序,其中包含一个列表视图和一系列项目。我将ListView锚定到表单,并将AutoArrange设置为true,所有操作都按预期进行。是否覆盖了任何可能阻止触发默认绘图的绘图事件?绘图事件不是问题所在,但ShowWorkAreas属性已设置为True。当设置为False时,似乎正在工作。谁会知道…:D谢谢你。