Delphi-Quellcode:
LV.SmallImages.Free;
// Free prüft auch nochmal auf nil
LV.Clear;
// Erstelle ImageList
IL := TImageList.Create(Self);
// wer gibt das frei, wenn die Form geschlossen wird?
Warum immer neu erstellen?
Einfacher wäre es, wenn du eine ImageList auf die Form legst, da auch gleich mit dem ListView verbindest und im Code die Liste nur noch leerst (ein kleiner Clear-Befehl).
Und es is eine echt blöde Idee, parallel mitzählen zu wollen.
- erstmal hat man dann die Daten/Positionen doppelt und wenn die mal nicht syncron laufen, dann steht alles schief
- und dann liefern viele Funktionen extra das zurück, was sie sind (der eigenen Index oder die Instanz)
Delphi-Quellcode:
procedure Plot_Listview(CSet : TCountrySet; LV : TListView;
IL: TImageList=nil);
var z : TCountries;
begin
if not Assigned(
IL)
then
IL := LV.SmallImages;
LV.Clear;
IL.Clear;
IL.Width := 16;
IL.Height := 11;
// Lese alle Laender in der Menge CSet ein und fuege sie der Liste hinzu
for z
in CSet
do
with LV.Items.Add
do // verwende die Eigenschaten des "wirklich" neuen Eintrags (kann man auch gern in einer Variable zwischenspeichern)
begin
Caption := Get_Country(z);
ImageIndex :=
IL.Add(Get_Flag_BMP(z),
nil);
// weise den Index zu, welcher "wirklich" dem neuen Bild entspricht
end;
LV.SortType := stboth;
end;
Es kann auch sein, daß der Index vom Add zurückgegeben wird ... Dann natürlich als Index behandeln und nicht als Instanz.
30% weniger Codezeilen und dazu noch viel weniger Fehlerpotential (praktisch Keines).