Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   ImageName statt ImageIndex (https://www.delphipraxis.net/198212-imagename-statt-imageindex.html)

Uwe Raabe 13. Okt 2018 15:42

ImageName statt ImageIndex
 
Liste der Anhänge anzeigen (Anzahl: 1)
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 :stupid: - 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

DieDolly 13. Okt 2018 18:33

AW: ImageName statt ImageIndex
 
Kleiner Fehler wenn man die Datei PngComponentsGroup.groupproj öffnet

Zitat:

[Window Title]
Fehler

[Content]
Projekt C:\Users\Uwe\Documents\Embarcadero\Studio\Projekte \Project352.dproj kann nicht gefunden werden. Der Verweis auf das Projekt wurde aus der Projektgruppe entfernt.

[OK]
In Zeile 496 der PngFunctions.pas
Zitat:

[dcc32 Hinweis] PngFunctions.pas(496): H2443 Inline-Funktion 'TObjectList.Add' wurde nicht expandiert, weil Unit 'System.Classes' in der USES-Liste nicht angegeben ist
Beim Installieren von ImageIndexMapperPng.dproj
Zitat:

[dcc32 Fehler] ImageIndexMapper.PngImageLists.pas(22): E2037 Deklaration von 'CreateInterface' unterscheidet sich von vorheriger Deklaration

Uwe Raabe 13. Okt 2018 19:07

AW: ImageName statt ImageIndex
 
Zitat:

Zitat von DieDolly (Beitrag 1415707)
Beim Installieren von ImageIndexMapperPng.dproj
Zitat:

[dcc32 Fehler] ImageIndexMapper.PngImageLists.pas(22): E2037 Deklaration von 'CreateInterface' unterscheidet sich von vorheriger Deklaration

Dann hast du vermutlich schon die neue Version 1.5.0 der PngComponents installiert - in dem Fall wäre dieses Package gar nicht nötig. Damit es trotzdem compiliert, kannst du mal versuchen, die uses-Anweisung im interface Teil von ImageIndexMapper.PngImageLists durch folgende zu ersetzen (PngImageList muss vor ImageIndexMapper.Types kommen):
Delphi-Quellcode:
uses
  System.Classes,
  Vcl.ImgList,
  PngImageList,
  ImageIndexMapper.Types;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz