Wer hat das nicht schon erlebt: Ein Haufen Controls und Actions sind über einen
ImageIndex mit einer ImageList verknüpft, aber kaum sortiert man diese ImageList nach sinnvollen Gesichtspunkten um, schon stimmen die Icons in den Controls nicht mehr.
Wäre es nicht schön, wenn man anstatt einer kryptischen Zahl als
ImageIndex einen sprechenden Namen bei dem Control angeben könnte? Dann wäre die Reihenfolge der Icons in der ImageList völlig egal.
Voraussetzung dafür ist natürlich, daß die ImageList überhaupt Namen unterstützt. Die
TPngImageList aus den
PngComponents tut das schon seit geraumer Zeit. Was spricht also gegen eine Implementierung auf Basis von
TPngImageList?
Kann ja so schwer nicht sein, dachte ich
- na ja, so ganz einfach war es denn auch wieder nicht. Dazu hatte ich meine Ziele auch arg hoch gesetzt. So sollte im Object-Inspector bei den
ImageIndex Properties natürlich auch eine Auswahl nach Namen möglich sein und somit auch der Name statt der reinen Zahl angezeigt werden. Weiterhin sollte das Ganze auch einfach auf andere Controls und insbesondere auch auf andere ImageLists, die ebenfalls Namen unterstützen, erweitert werden können.
Das Ergebnis ist nun der
ImageIndexMapper, eine nicht-visuelle Komponente, die einfach auf ein Form oder Datenmodul gesetzt und aktiviert, die Verwaltung der Image-Namen erledigt. Es ist lediglich bei Bedarf ein Aufruf einer Methode nötig, damit die Icons wieder anhand der Namen gefunden werden.
Die anhängende ZIP-Datei enthält alle Sourcen und benötige Dateien für die Komponente und die Designtime-Unterstützung sowie ein Beispielprojekt (aktuell nur für Delphi 10.2 Tokyo). Voraussetzung ist dafür aber der Einsatz der
PngComponents aus oben bereits genannter Quelle. Ich empfehle die aktuelle Version V1.5.0, da diese direkt den
ImageIndexMapper unterstützt. Für ältere Versionen muss das entsprechende PNG-Support
Package installiert werden. Beim Compilieren muss dann auch die entsprechende
Unit mit eingebunden werden (beides in der ZIP enthalten). Mit der V1.5.0 entfällt diese Notwendigkeit.
Es gibt sicher noch einiges zu verbessern. Wenn jemand Zeit und Lust hat, kann er das Ding ja mal ausprobieren. Die sicher noch vorhandenen Bugs bitte an mich melden.
Ein GIF vom Object-Inspector beim Wechsel von
TPngImageList zu
TImageList kann man sich hier anschauen:
https://www.screencast.com/t/4MbJkygjFR