Отображать элементы TListView как группу XP

Материал из DRKB

Отображать элементы TListView как группу XP[править | править код]

// declarations from commctrl.h
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_MOVEITEMTOGROUP = LVM_FIRST + 154;
  LVM_INSERTGROUP     = LVM_FIRST + 145;

  LVIF_GROUPID = $0100;

  LVGF_HEADER  = $00000001;
  LVGF_ALIGN   = $00000008;
  LVGF_GROUPID = $00000010;

  LVGA_HEADER_LEFT   = $00000001;
  LVGA_HEADER_CENTER = $00000002;
  LVGA_HEADER_RIGHT  = $00000004;


procedure TForm1.Button1Click(Sender: TObject);
var
  LvGroup: TLVGROUP;
  LvItemA: TLVITEMA;
  ListItem: TListItem;
  I: Byte;
begin
  // Fill listview with random data
  Randomize;
  for i := 1 to 10 do
  begin
    ListItem := ListView1.Items.Add;
    ListItem.Caption := IntToStr(Random(100));
  end;

  SendMessage(ListView1.Handle, LVM_ENABLEGROUPVIEW, 1, 0);

  // Create Group1
  FillChar(LvGroup, SizeOf(TLVGROUP), 0);
  with LvGroup do
  begin
    cbSize := SizeOf(TLVGROUP);
    mask := LVGF_HEADER or LVGF_ALIGN or LVGF_GROUPID;
    pszHeader := 'Group 1';
    cchHeader := Length(LvGroup.pszHeader);
    iGroupIdL := 0;
    uAlign := LVGA_HEADER_CENTER;
  end;
  SendMessage(ListView1.Handle, LVM_INSERTGROUP, 0, Longint(@LvGroup));

  // Create Group2
  FillChar(LvGroup, SizeOf(LvGroup), 0);
  with LvGroup do
  begin
    cbSize := SizeOf(TLVGROUP);
    mask := LVGF_HEADER or LVGF_ALIGN or LVGF_GROUPID;
    pszHeader := 'Group 2';
    cchHeader := Length(LvGroup.pszHeader);
    iGroupIdL := 1;
    uAlign := LVGA_HEADER_LEFT
  end;
  SendMessage(ListView1.Handle, LVM_INSERTGROUP, 1, Longint(@LvGroup));

  // Assign items to the groups
  for I := 0 to ListView1.Items.Count - 1 do
  begin
    with LvItemA do
    begin
      FillChar(LvItemA, SizeOf(TLvItemA), 0);
      mask := LVIF_GROUPID;
      iItem := I;
      iGroupId := Random(2);
    end;
    SendMessage(ListView1.Handle, LVM_SETITEM, 0, Longint(@LvItemA))
  end;
end;

// XPManifest needed!


Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01137