I need to have a check box in a column header of a TListView:
I have tried the following code:
with CheckBox1 do
begin
Parent := ListView1;
Top := 0;
Left := 4;
end;
but the check box doesn't always work as expected. How can I properly create a check box in TListView header column ?
The following code will add the check box to the list view's header and shows how to handle the click event for it.
Please note, that the following code is supported since Windows Vista.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, CommCtrl;
type
TForm1 = class(TForm)
ListView1: TListView;
procedure FormCreate(Sender: TObject);
private
HeaderID: Integer;
procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMNotify(var AMessage: TWMNotify);
begin
if AMessage.NMHdr^.idFrom = HeaderID then
if AMessage.NMHdr^.code = HDN_ITEMSTATEICONCLICK then
ShowMessage('You have clicked the header check box');
inherited;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
HeaderHandle: HWND;
HeaderItem: HD_ITEM;
HeaderStyle: Integer;
begin
ListView_SetExtendedListViewStyle(ListView1.Handle, LVS_EX_CHECKBOXES or LVS_EX_FULLROWSELECT);
HeaderHandle := ListView_GetHeader(ListView1.Handle);
HeaderStyle := GetWindowLong(HeaderHandle, GWL_STYLE);
HeaderStyle := HeaderStyle or HDS_CHECKBOXES;
SetWindowLong(HeaderHandle, GWL_STYLE, HeaderStyle);
HeaderItem.Mask := HDI_FORMAT;
Header_GetItem(HeaderHandle, 0, HeaderItem);
HeaderItem.fmt := HeaderItem.fmt or HDF_CHECKBOX or HDF_FIXEDWIDTH;
Header_SetItem(HeaderHandle, 0, HeaderItem);
HeaderID := GetDlgCtrlID(HeaderHandle);
end;
end.