Hi zusammen,
ich würde gerne die PngImageList verwenden transparente Icons an verschiedenen Stellen (Images, Menüs, Tabellen, ...) anzeigen zu lassen. Hierzu verwende ich knapp 100 Icons jeweils in 2 Größen (16x16 und 32x32), welche ich wie folgt (abgeschaut bei
stz) lade:
Code:
PngList := TPngImageList.Create(nil);
PngItem := PngList.PngImages.Add ;
PngItem.PngImage.LoadFromFile(Filename);
Und dann beispielsweise wie folgt auf ein Image bringe
Code:
ImageFront.Picture.Assign(PngList.PngImages[I].PngImage);
Bei Laden konnte ich beobachten, wie folgende Methoden abgearbeitet werden:
PngList.PngImages.Add (PngImages ist vom Typ TPngImageCollectionItems)
-> TPngImageCollectionItem.Create
-> TCollectionItem.Create
-> TCollection.RemoveItem
-> TList.Remove
-> TList.IndexOf
Beim IndexOf rennt der dann natürlich im Worst-Case über die gesammte Liste und zwar für jedes Icon, so dass ich eine Laufzeit von irgendwas in 0(n²) je PngImageList bekomme. Da ich jetzt leider auch noch zwei Listen habe - jeweils eine pro Icongröße - dauert der Vorgang bei mir eine knappe Minute, bis das Programm gestartet ist.
Kann ich das irgendwie Beschleunigen ohne die Icon-Anzahl eingrenzen zu müssen?
Folgende Ideen kamen mir dabei:
- Irgendwie ein Array von TPngObjects auf die TPngList casten?
- Nur eine Liste anlegen und daraus dann die andere per Skalieren der PNGs erzeugen?
- Auf entweder die TCollection oder die TList verzichten (brauche ich wirklich beides?)?
Weiterhin habe ich versucht, die TPngImageCollectionItems zu entfernen und durch eine von TObjectList abgeleitete Liste zu ersetzen. Das Laden ging dann zwar fühlbar schneller, aber die 16x16-Icons wurden dann nicht mehr angezeigt (die 32er wohl - komisch).
Gibt es sonst vielleicht irgendwo ein Tutorial oder eine Anwendung in der ich mir die richtige Verwendung der PngImageList mal ansehen kann? (Google spuckt zur "PngImageList" bzw. "TPngImageList" jeweils lediglich drei Seiten aus und beim [ulr=http://www.delphipraxis.net/internal_redirect.php?t=111689&highlight=pngimagel ist]Secretizer[/
url] finde ich die Verwendung der PngImageLists ilTreeIcons und ilGlyphs nicht).