5

我一直在玩 TListView 并一直试图弄清楚 WorkAreas 是如何工作的,以及它们有什么用处。似乎很少有文档(大惊喜)。

有人成功使用过 WorkAreas 吗?如果是的话是为了什么?

我一直在尝试以下方法:

  wa := ListView1.WorkAreas.Add;
  wa.DisplayName := 'Work Area 0';
  wa.Rect.Width := ListView1.Width div 2;
  wa.Rect.Height := ListView1.Height;

这似乎创建了一个工作区区域,您可以通过检查其 WorkArea 属性来确定项目是否与该工作区相关联。

4

1 回答 1

6

它是 VCL 对原生 List-View 控件的工作区的支持。请参阅列表视图工作区。该文档提供了一个示例,说明它们的用途:

[...] 多个工作区域可用于在一个视图中创建不同的区域。您可以在单个视图中创建具有不同含义的区域。例如,文件系统的视图可能有一个用于读/写文件的区域和另一个用于只读文件的区域。用户可以通过将项目放置在不同的工作区域来对它们进行分类。[...]

该文档还提到,您可以在边缘附近创建空边框,或者通过使用工作区导致通常不会出现滚动条。

VCL 的文档似乎没有太多遗漏。您可以添加和查询工作区。将项目重新定位到特定的工作区域,或询问它位于哪个工作区域。没有什么是自动的,你必须自己做。一个项目与工作区没有关联,您必须自己移动它(VCL 只是遍历工作区并检查项目和区域的坐标以找到项目所在的工作区)。

分类部分可能不是非常有用,因为无需控件本身的帮助就可以保留他/她自己的虚拟区域。关于边缘和滚动条的部分可能更重要。但我从未见过在应用程序中实现过这样的事情,包括操作系统本身。


布局控制的示例用法:

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListView1: TListView;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses
  commctrl;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  R1, R2: TRect;
begin
  R1 := Rect(0, 0,
              ListView1.ClientWidth div 2, ListView1.ClientHeight div 2 + 10);
  R2 := Rect(ListView1.ClientWidth div 2 + 1, 0,
              ListView1.ClientWidth - 1, ListView1.ClientHeight div 2 + 10);

  ListView1.WorkAreas.Add.Rect := R1;
  ListView1.WorkAreas.Add.Rect := R2;

  ListView1.AddItem('Item 1', nil);
  ListView1.AddItem('Item 2', nil);
  ListView1.AddItem('Item 3', nil);
  ListView1.AddItem('Item 4', nil);
  ListView1.AddItem('Item 5', nil);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do begin
    ListView1.Items[i].Left := ListView1.WorkAreas[1].Rect.Left;
    ListView1.Items[i].Top := ListView1.WorkAreas[1].Rect.Top;
  end;
  ListView1.Arrange(arAlignTop);
end;


初始视图:
在此处输入图像描述
按下按钮后:
在此处输入图像描述

请注意,在第一张图片中,“第 5 项”不在任何工作区。在按钮单击处理程序中,我尝试将所有五个项目放在“右上角”工作区中。将“Item 5”放在那里后,控件决定踢出“Item-1”,因为所有五个都不适合。现在应该很明显,我从未使用过工作区,但我特意给出了这个例子,以便能够指出可能的怪癖。我所期望的是出现文档中提到的滚动条。

于 2012-05-29T01:27:05.463 回答