现在的位置: 首页 > 综合 > 正文

在ListView的Item中显示CheckBox与Button

2013年08月17日 ⁄ 综合 ⁄ 共 1840字 ⁄ 字号 评论关闭

在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     // 如果为空则创建CheckBoxButton.

     

        begin

     

          new(P);   // 创建一个指针用于存储CheckBoxButton.          

     

     

     

          { 创建并显示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].Caption01,直接转换为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;    // CheckBoxButton的结构指针保存于Item.Data属性.

     

        end;

     

      end;

     

    end;

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

抱歉!评论已关闭.