如何在Delphi中触发ListView中的项目换行?

时间:2011-10-13 12:20:47

标签: listview delphi delphi-7

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

到目前为止我尝试了什么:

  • ListView.Update;

  • ListView.Refresh;

  • ListView.Repaint;

  • function ListView_Arrange(hwndLV:HWND; Code:UINT):Bool;

  • function ListView_RedrawItems(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;

但是,正如你所注意到的那样,对于大量的物品来说并不是那么快。 你能帮我找一个更好的方法......?

谢谢。

我使用Delphi 7。

1 个答案:

答案 0 :(得分:2)

listview可以自动为您完成。 在代码中的某处(可能在formcreate中)插入以下内容:

listview.IconOptions.AutoArrange := true;

或者你也可以在属性窗口中设置它。