虚拟ListView是否支持vsIcon和vsSmallIcon复选框?

虚拟ListView是否支持vsIcon和vsSmallIcon复选框?,listview,delphi,checkbox,vcl,Listview,Delphi,Checkbox,Vcl,我在Delphi中使用ListView。我将OwnerData属性设置为true,以便在OnData事件中提供该项的数据 此外,我想为列表视图的每个项目添加一个复选框。但是Checkbox属性只支持vsList和vsReport模式,而不支持vsIcon和vsSmallicon。有解决办法吗?或者是否有支持此功能的随时可用的第三方VCL 但是Checkbox属性只支持vsList和vsReport模式 那是不对的。您正在查看VCL,其中说明 设置为true可使复选框显示在列表旁边 ViewSty

我在Delphi中使用ListView。我将OwnerData属性设置为true,以便在OnData事件中提供该项的数据

此外,我想为列表视图的每个项目添加一个复选框。但是Checkbox属性只支持vsList和vsReport模式,而不支持vsIcon和vsSmallicon。有解决办法吗?或者是否有支持此功能的随时可用的第三方VCL

但是Checkbox属性只支持vsList和vsReport模式

那是不对的。您正在查看VCL,其中说明

设置为true可使复选框显示在列表旁边 ViewStyle为vsList或vsReport时的项目

这是过时的信息。有关本机控件的详细信息,请参见:

复选框是可见的,并且与所有 列出除ComCtl32.dll中引入的平铺视图模式以外的其他视图模式 版本6

事实上,如果您以图标模式之一在常规的
TListView
控件上进行尝试,您会发现复选框没有问题



然而,这对你没有帮助。在这方面,您的问题的格式不正确,它假设
复选框
在具有虚拟列表视图控件的列表和报告模式下正常工作。事实并非如此

当您可以对列表项使用
Checked
属性时,复选框是很好的选择。在虚拟列表视图控件中,没有可以检查的项。我引述消息:

如果列表视图控件是在没有样式的情况下创建的, 发送此消息会导致控件分配其内部数据 指定项目数的结构

如果列表视图控件是使用样式(a)创建的 虚拟列表视图),发送此消息将设置 控件包含的项

控件只知道有那么多的项,没有每个项的存储。VCL反映API控件:当您请求一个项并且您的控件设置了
OwnerData
时,会对临时项调用
OnData
事件处理程序以反映该项的属性

在虚拟列表视图中,您可以使用状态映像管理检查。引述:

。。。您可以使用状态图像,例如选中和清除的复选框, 指示应用程序定义的项状态。国家形象是 在图标视图、小图标视图、列表视图和报告视图中显示



下面是一个基本的实现,它将项目状态信息保存在一个单独的数组中。要运行它,请创建一个空白的新表单,为表单创建一个
OnCreate
处理程序并粘贴代码

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics,   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ImgList;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FListView: TListView;
    FListViewCheckStateArray: array of 0..1;
    procedure ListViewData(Sender: TObject; Item: TListItem);
    procedure ListViewMouseDown(Sender: TObject; Button: TMouseButton;
        Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  Bmp: TBitmap;
begin
  FListView := TListView.Create(Self);
  FListView.Parent := Self;
  FListView.Align := alClient;
  FListView.OwnerData := True;
  FListView.ViewStyle := vsSmallIcon;

  FListView.StateImages := TImageList.Create(Self);
  Bmp := TBitmap.Create;
  Bmp.PixelFormat := pf32bit;
  Bmp.SetSize(16, 16);
  DrawFrameControl(Bmp.Canvas.Handle, Rect(0, 0, 16, 16), DFC_BUTTON,
      DFCS_BUTTONCHECK);
  FListView.StateImages.Add(Bmp, nil);
  DrawFrameControl(Bmp.Canvas.Handle, Rect(0, 0, 16, 16), DFC_BUTTON,
      DFCS_BUTTONCHECK or DFCS_CHECKED);
  FListView.StateImages.Add(Bmp, nil);
  Bmp.Free;

  FListView.Items.Count := 257;
  SetLength(FListViewCheckStateArray, FListView.Items.Count);

  FListView.OnData := ListViewData;
  FListView.OnMouseDown := ListViewMouseDown;
end;

procedure TForm1.ListViewData(Sender: TObject; Item: TListItem);
begin
  Item.Caption := Format('This is item %.2d', [Item.Index]);
  Item.StateIndex := FListViewCheckStateArray[Item.Index];
end;

procedure TForm1.ListViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  Item: TListItem;
begin
  if (Button = mbLeft) and
      (htOnStateIcon in FListView.GetHitTestInfoAt(X, Y)) then begin
    Item := FListView.GetItemAt(X, Y);
    Assert(Assigned(Item));
    FListViewCheckStateArray[Item.Index] :=
        Ord(not Boolean(FListViewCheckStateArray[Item.Index]));
    FListView.UpdateItems(Item.Index, Item.Index);
  end;
end;

end.

PS:绘图工件应该是另一个问题的主题。

使用虚拟树view@DavidHeffernan你是说虚拟树视图吗?但这是一个树状视图,而不是列表视图。请仔细查看。该控件可以执行您想要的操作。@alancc尽管它的名称是,
TVirtualTreeView
也可以类似于ListView的方式使用。