Implementing the On Item Checked Event for the TListView Control

Posted 游子日月长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Implementing the On Item Checked Event for the TListView Control相关的知识,希望对你有一定的参考价值。

The TListView Delphi control displays a list of items in a fashion similar to how Windows Explorer displays files and folders.

ViewStyle := Report; CheckBoxes := True;

 

The WindowProc is a special procedure every TControl uses to respond to messages sent to the control.

Here‘s how to get notified when an item in the list view is checked or un-checked:

  1. Drop a TListView (name "ListView1") on a Delphi form. Add some items to the list view.
  2. Set ViewStyle to vsReport,
  3. Set CheckBoxes to true,
  4. In the form‘s OnCreate event hijack the ListView1‘s WindowProc.
  5. If the message being processed in CN_Notify (Delphi extension to the WM_NOTIFY message) and if the notification message is "LVN_ITEMCHANGED",
  6. Read the tagNMLISTVIEW record to grab additional data.
  7. If this is a state change (LVIF_STATE) and if the state of an item changes (LVIS_STATEIMAGEMASK) grab the changed item, read it‘s Checked property.
uses CommCtrl;  

procedure TForm1.FormCreate(Sender: TObject) ; 
begin 
  OriginalListViewWindowProc := ListView1.WindowProc;  
   ListView1.WindowProc := ListViewWindowProcEx; 
  end;  
  
  procedure TForm1.ListViewWindowProcEx(var Message: TMessage) ; 
  var   listItem : TListItem; 
begin   if Message.Msg = CN_NOTIFY then   
begin   
  if PNMHdr(Message.LParam)^.Code = LVN_ITEMCHANGED then   
    begin       
    with PNMListView(Message.LParam)^ do      
   begin        
    if (uChanged and LVIF_STATE) <> 0 then      
      begin      
           if ((uNewState and LVIS_STATEIMAGEMASK) shr 12) <> ((uOldState and LVIS_STATEIMAGEMASK) shr 12) then         
             begin        
                  listItem := listView1.Items[iItem];             
                  memo1.Lines.Add(Format(%s checked:%s, [listItem.Caption, BoolToStr(listItem.Checked, True)])) ;           
             end;        
              end;       
              end;   
                end;   
                end;   //original ListView message handling   
                
                OriginalListViewWindowProc(Message) ; 
                end;  
                procedure TForm1.GetCheckedButtonClick(Sender: TObject) ; 
                var   li : TListItem; 
             begin   
             memo1.Lines.Clear;   memo1.Lines.Add(Checked Items:) ;   
             for li in listView1.Items do   
             begin   
               if li.Checked then     
             begin     
               memo1.Lines.Add(Format(%s %s %s, [li.Caption, li.SubItems[0], li.SubItems[1]])) ;     
             end;  
            end; 
           end; 

 

Note: Reading the description of the tagNMLISTVIEW record in the Windows API help, reveals that "uChanged" field notifies that the item attributes have changed. This field is zero for notifications that do not use it. Otherwise, it can have the same values as the mask member of the LVITEM record. Bits 12 through 15 of the "state" member specify the state image index. To isolate these bits, use the LVIS_STATEIMAGEMASK.

以上是关于Implementing the On Item Checked Event for the TListView Control的主要内容,如果未能解决你的问题,请参考以下文章

React does not recognize the `colStyle` prop on a DOM element. If you intent

zabbix监控mysql之Warning: Using a password on the command line interface can be insecure.

Can some one explain the difference between the Wasmer and Wasmtime projects

On Writing Well - The Transaction & Simplicity

刷新CollectionView 报错the item height must be less that the height of the UICollectionView minus the s(

embody the data item with the ability to control access to itself