代码之家  ›  专栏  ›  技术社区  ›  Alec

如何检测单击TListView中的复选框

  •  5
  • Alec  · 技术社区  · 7 年前

    我的代码简单明了

    procedure LvUserChange(Sender: TObject; Item: TListItem;Change: TItemChange);
     var
     objUser : TUsers;
    begin
       if not assigned(objListOfChangedUsers) then
       objListOfChangedUsers := TObjectList.Create;
    
       objUser := Item.Data;
       objListOfChangedUsers.Add(objUser);
    end;
    

    2 回复  |  直到 7 年前
        1
  •  8
  •   David Heffernan    7 年前

    在Delphi 2009及更高版本中,您可以使用 TListView.OnItemChecked 检测复选框点击的事件。Delphi 2007没有此类事件,在这种情况下,您需要在自己的代码中手动检测通知。我将用一个插入器类进行演示,但还有其他方法可以做到这一点。

    uses
      ..., CommCtrl, ComCtrls, ...;
    
    type
      TListView = class(ComCtrls.TListView)
      protected
        procedure CNNotify(var Message: TWMNotifyLV); message CN_NOTIFY;
      end;
    
    ....
    
    procedure TListView.CNNotify(var Message: TWMNotifyLV);
    begin
      inherited;
      if Message.NMHdr.code = LVN_ITEMCHANGED then
      begin
        if (Message.NMListView.uChanged = LVIF_STATE) and
           ( ((Message.NMListView.uOldState and LVIS_STATEIMAGEMASK) shr 12)
             <> ((Message.NMListView.uNewState and LVIS_STATEIMAGEMASK) shr 12)) then
        begin
          // changing check box state will land you here
        end;
      end;
    end;
    
        2
  •  3
  •   Dsm    7 年前

    procedure LvUserChange(Sender: TObject; Item: TListItem;Change: TItemChange);
     var
     objUser : TUsers;
    begin
       if Change = ctState then
       begin
         if Item.Checked then
         begin
           if not assigned(objListOfChangedUsers) then
           objListOfChangedUsers := TObjectList.Create;
    
           objUser := Item.Data;
           objListOfChangedUsers.Add(objUser);
         end
         else
         begin
           // just in case there are any actions when unchecking
         end;
       end;
    end;
    

    我没有Delphi 2007,但已经检查了文档,它应该可以工作。