如何在Delphi中触发ListView中的项目换行? [关闭]

问题描述 投票:1回答:1

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

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

  • ListView.Update;
  • ListView.Refresh;
  • ListView.Repaint;
  • 函数ListView_Arrange(hwndLV:HWND;代码:UINT):Bool;
  • 函数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。

listview delphi delphi-7
1个回答
2
投票

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

listview.IconOptions.AutoArrange := true;

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

© www.soinside.com 2019 - 2024. All rights reserved.