1. Home
  2. Computing & Technology
  3. Delphi Programming

Implementing the On Item Checked Event for the TListView Control
Handling Item Checked State Change Event

By Zarko Gajic, About.com

Handling TListView Item Checked

Handling TListView Item Checked

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;

When the ViewStyle property is set to vsReport and CheckBoxes is set to true, ListView includes a check box next to the items in the list.

To get the "checked" state for an item in the list view, read the Checked boolean property.

Missing the OnItemChecked event?

Unfortunately, the TListView does not raise an event when the "Checked" state changes for a TListItem (an item in the list view).

If you need to react when the checked state of an item changes you need to tweek the message handling processing of the TListView control.

You can perform tasks such as changing the state of an item's icon or another application-specific task each time an item is checked in the TListView control.

By changing the default behavior of the ListView's WindowProc procedure, you can react when the checked state of an item changes.
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.

Delphi tips navigator:
» Delete Multiple Selected Items in a TListBox
« How to Parse TAB Delimited Files in Delphi

More Delphi Programming Quick Tips
Zarko Gajic
Guide since 1998

Zarko Gajic
Delphi Programming Guide

Explore Delphi Programming
About.com Special Features

Stay connected and entertained with reviews on tips on the latest HDTVs, cellphones and more. More >

Easy ways to connect two computers for networking purposes. More >

  1. Home
  2. Computing & Technology
  3. Delphi Programming
  4. Using VCL Components
  5. TListView
  6. How to Implement the On Item Checked Event for the TListView Delphi control

©2009 About.com, a part of The New York Times Company.

All rights reserved.