在 ListView 的 Item 中顯示 CheckBox 與 Button

 

在ListView的Item中显示CheckBox与Button,主要思路就是在绘制每一个Item时创建一个CheckBox与Button,并显示在Item对应Column的位置.主要注意于3点:

将要显示的CheckBox与Button(其实可以更多其它控件)定义在一个结构中,使用指针连接到Item.Data,以便与该Item对应
要检查Item.Data是否为nil,防止重复创建控件
通过Item.SubItem所对应的Column.Width得出CheckBox与Button应该放置的坐标
代码并不难懂,首先定义一个结构:

type PItemCtrl = ^TItemCtrl
  TtemCtrl = record
     CheckBox: TCheckBox;
     Button: TButton;
   end;
end;

procedure TfrmMain.ListView1CustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer; State: TCustomDrawState; var DefaultDraw: Boolean);
var
  Rect: TRect;
  P: PItemCtrl;
begin
  { 第2个子项目上显示CheckBox,第5个子项目上显示Button }
  if SubItem in [2, 5] then
  begin
    DefaultDraw:= False;        // 不显示默认的文本.
    Rect:= Item.DisplayRect(drBounds);  // 获取Item显示的区域.

    if Item.Data = nil then     // 如果为空则创建CheckBox及Button.
    begin
      new(P);   // 创建一个指针用于存储CheckBox及Button.

      { 创建并显示CheckBox }
      P.CheckBox:= TCheckBox.Create(ListView1);
      P.CheckBox.Parent:= ListView1;
      P.CheckBox.Caption:= '';
      P.CheckBox.Width:= 20;
      P.CheckBox.Height:= 20;
      P.CheckBox.Left:= Rect.Right - ListView1.Columns[3].Width
        - ListView1.Columns[4].Width - ListView1.Columns[5].Width
        - ((ListView1.Columns[2].Width + P.CheckBox.Width) div 2);
      P.CheckBox.Top:= Rect.Top;
      P.CheckBox.Visible:= True;
      { SubItems[2 -1].Caption为0和1,直接转换为Boolean型并给CheckBox赋值. }
      P.CheckBox.Checked:= StrToBool(Item.SubItems[SubItem -1]);

      { 创建并显示Button }
      P.Button:= TSpeedButton.Create(ListView1);
      P.Button.Parent:= ListView1;
      P.Button.Caption:= '...';
      P.Button.Width:= 20;
      P.Button.Height:= 20;
      P.Button.Left:= Rect.Right - ((ListView1.Columns[5].Width
        + P.Button.Width) div 2);
      P.Button.Top:= Rect.Top;
      P.Button.Visible:= True;

      Item.Data:= P;    // 将CheckBox及Button的结构指针保存于Item.Data属性.
    end;
  end;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值