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:
- Czy da się pobrać ID grupy na podstawie jego Headera tak, żeby móc przypisać grupy już przy dodawaniu elementów?
- 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 :-(