它是 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”,因为所有五个都不适合。现在应该很明显,我从未使用过工作区,但我特意给出了这个例子,以便能够指出可能的怪癖。我所期望的是出现文档中提到的滚动条。