« ■GIS・・・。 | トップページ | ■Apr08 Hotfix for CodeGear RAD Studio 2007 »

☆ListViewでのグループ表示

ListViewのアイテムをグループ表示させるサンプルを見つけたので試してみました。

Listviewgroup


uses commctrl;

type
  TLVGROUP = record
    cbSize: UINT;
    mask: UINT;
    pszHeader: LPWSTR;
    cchHeader: Integer;
    pszFooter: LPWSTR;
    cchFooter: Integer;
    iGroupIdL: Integer;
    stateMask: UINT;
    state: UINT;
    uAlign: UINT;
  end;

  tagLVITEMA = packed record
    mask: UINT;
    iItem: Integer;
    iSubItem: Integer;
    state: UINT;
    stateMask: UINT;
    pszText: PAnsiChar;
    cchTextMax: Integer;
    iImage: Integer;
    lParam: lParam;
    iIndent: Integer;
    iGroupId: Integer;
    cColumns: UINT;
    puColumns: PUINT;
  end;
  TLVITEMA = tagLVITEMA;

const
  LVM_ENABLEGROUPVIEW = LVM_FIRST + 157;
  LVM_INSERTGROUP = LVM_FIRST + 145;
  LVIF_GROUPID = $0100;
  LVGF_HEADER = $00000001;
  LVGF_ALIGN = $00000008;
  LVGF_GROUPID = $00000010;
  LVGA_HEADER_LEFT = $00000001;


procedure TForm1.FormCreate(Sender: TObject);
var
  LvGroup: TLVGROUP;
  LvItemA: TLVITEMA;
  LI: TListItem;
  I: Integer;
  S: PWideChar;
begin
  ListView1.Items.BeginUpdate;
  try
    // 初期設定
    ListView1.ViewStyle := vsReport;
    ListView1.Columns.Add.Caption := 'Musician';
    ListView1.Columns[0].Width := 250;

    // 項目
    LI := ListView1.Items.Add;
    LI.Caption := 'Deep Purple';
    LI := ListView1.Items.Add;
    LI.Caption := 'The Beatles';
    LI := ListView1.Items.Add;
    LI.Caption := 'Yngwie J. Malmsteen';
    LI := ListView1.Items.Add;
    LI.Caption := 'Sarah Vaughan';
    LI := ListView1.Items.Add;
    LI.Caption := 'Miles Davis';
    SendMessage(ListView1.Handle, LVM_ENABLEGROUPVIEW, 1, 0);

    // グループ
    for I := 0 to 1 do
    begin
      FillChar(LvGroup, SizeOf(TLVGROUP), 0);
      LvGroup.cbSize := SizeOf(TLVGROUP);
      LvGroup.mask := LVGF_HEADER or LVGF_ALIGN or LVGF_GROUPID;
      if I = 0 then
        S := 'Jazz'
      else
        S := 'Rock';
      LvGroup.pszHeader := S;
      LvGroup.cchHeader := Length(LvGroup.pszHeader);
      LvGroup.iGroupIdL := I;
      LvGroup.uAlign := LVGA_HEADER_LEFT;
      SendMessage(ListView1.Handle, LVM_INSERTGROUP, 0, Longint(@LvGroup));
    end;

    // グループの設定
    for I := 0 to ListView1.Items.Count - 1 do
    begin
      FillChar(LvItemA, SizeOf(TLvItemA), 0);
      LvItemA.mask := LVIF_GROUPID;
      LvItemA.iItem := I;
      if I < 3 then
        LvItemA.iGroupId := 1
      else if I < 5 then
        LvItemA.iGroupId := 0;
      SendMessage(ListView1.Handle, LVM_SETITEM, 0, Longint(@LvItemA))
    end;
  finally
    ListView1.Items.EndUpdate;
  end;
end;


Vistaでは更に拡張機能が使えそうです。下記のMSDNのリンクをご覧下さい。

SwissDelphiCenter.ch
...display the items in a listview control display as a group (XP)?
http://www.swissdelphicenter.ch/en/showcode.php?id=1782

MSDN
Windows と C++
Windows Vista コントロールの拡張
http://msdn2.microsoft.com/ja-jp/magazine/cc163384.aspx

|

« ■GIS・・・。 | トップページ | ■Apr08 Hotfix for CodeGear RAD Studio 2007 »