Hej! ;-)

ListView w D2009 i nowszych zyskał możliwość grupowania. Wszystko byłoby super, gdyby nie fakt, że nie widzę żadnej możliwości pobrania ID grupy na podstawie jej Headera. W efekcie stworzyłem poniższą procedurę, która grupuje itemy już na gotowej liście:

procedure TForm1.Button4Click(Sender: TObject);
var
  i: integer;
  i2: integer;
begin
  ListView1.Items.BeginUpdate;
  ListView1.GroupView := True;
  for i := 0 to ListView1.Items.Count - 1 do
    begin
      if ListView1.Groups.Count = 0 then
      begin
        // jeśli nie ma żadnej grupy - stwórz pierwszą
        ListView1.Groups.Add.Header := ListView1.Items.Item[i].Caption;
        ListView1.Groups.Items[0].State := [lgsCollapsible];
        ListView1.Items.Item[i].GroupID := 0;
      end
      else
      begin
      for i2 := 0 to ListView1.Groups.Count - 1 do
        begin
          if ListView1.Groups.Items[i2].Header = ListView1.Items.Item[i].Caption then
          begin
          // jeśli grupa/grupy już są - przeleć wszystkie i sprawdź, czy jakaś nie pasuje, żeby itema do niej przypisać
          ListView1.Items.Item[i].GroupID := i2;
          end
        else
        end;
      end;
      if ListView1.Items.Item[i].GroupID = -1 then
        begin
          // jeśli żadna z istniejących grup nie pasuje - stwórz nową na końcu
          ListView1.Groups.Add.Header := ListView1.Items.Item[i].Caption;
          ListView1.Groups.Items[ListView1.Groups.Count -1].State := [lgsCollapsible];
          ListView1.Items.Item[i].GroupID := ListView1.Groups.Count -1;
        end;
    end;
    ListView1.Items.EndUpdate;
end;

Niestety mieli ona bardzo wolno - na pogrupowanie ok. 2500 itemów potrzebuje 20 sekund.

Pytania:

  1. Czy da się pobrać ID grupy na podstawie jego Headera tak, żeby móc przypisać grupy już przy dodawaniu elementów?
  2. Czy da się załatwić grupowanie w jakikolwiek szybki sposób?

PS: Nie wiedziałem, czy do Newbie, czy tu, ale wydaje mi się, że to grubszy problem. W sieci na ten temat nie ma wiele - wujek Google nie podpowiedział nic :-(