Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - ImageList kaputt?


zuma - Di 29.11.11 07:38
Titel: ImageList kaputt?
Moin,
ich benutze mehrere ImageLists zur verwaltung der Grafiken im Programm.
Diese sind in einem Global Data Modul.
Eine der Listen hat neuerdings einen Fehler, den ich mir nicht erklären kann und den ich auch nicht behoben bekomme, auf die Images greife ich per Konstanten zu.
Die Icons sind 16*16 Bitmaps.
Der Fehler:
Komischerweise werden aus einer Imagelist (94 Icons drin) die ersten 15 Icons nicht richtig angezeigt. Und das auch nur in einem Programm, in einem anderen Programm funktionieren die.
Der Fehler äußert sich folgendermaßen:
Es wird bei den ersten 15 Icons immer das erste in der Imagelist angezeigt
ab dem 16ten kommt immer das richtige Icon. In einem anderen Programm mit dem selben GDM funktioniert aber alles richtig.

Fehlerbehebungsversuche:
- dcu's löschen
- die betroffenen Icons entfernen / neu einfügen
- konstanten geprüft (inkl. debug)
jeweils natürlich mit neu erzeugen direkt danach

füge ich ein weiteres icon (z.B. das 10te) nochmal hinten ein und drehe die entsprechende Konstante, wird alles korrekt angezeigt.

Für Tipps, was ich noch prüfen/machen könnte, wäre ich dankbar

Zuma


Nersgatt - Di 29.11.11 07:46

*.res mal neu erzeugen lassen?


Martok - Di 29.11.11 08:23

Was passier wenn du irgendwelche Dummy-Bilder hinten anhängst?

Kann mich da an eine seltsame Fallunterscheidung nach Länge in TCustomImageList erinnern.


zuma - Di 29.11.11 08:38

werde beides mal ausprobieren,
danke schon mal für die anregungen.

Zuma


Nersgatt - Di 29.11.11 08:42

Schau auch mal, ob Du in verschiednen Unterordnern *.res-Dateien mit dem selben Namen hast. Irgendwie hab ich dunkel im Hinterkopf, dass ich sowas schon mal hatte.


bummi - Di 29.11.11 10:22

bei der Zahl 15 klingelt es bei mir, Du hast die Images nicht aus versehen in einem Treeview an Stateimages statt an Images angehängt?


zuma - Di 29.11.11 10:35

Hallo bummi,
der Fehler tritt tatsächlich in ner Treeview auf

binde die imagelist so an

Delphi-Quelltext
1:
TreeviewName.Images := GDM.ImageListName;                    


in der getImageIndex wird dann dem var-Prameter 'ImageIndex' die entsprechende Konstante zugeordnet

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
...
if Assigned(PTreeDataBenutzer(Sender.GetNodeData(Node)).Gruppe) then
  ImageIndex := cIconGruppe
 else
  ImageIndex := cIconPerson;
...


hab bereits ne zusätzliche imagelist nochmal neu aufgebaut (sch...s-Arbeit ;) ),
in der Treeview tritt der Fehler weiterhin auf.
Scheint also doch eher in der TreeView der Fehler zu sein ... nur wo :gruebel:

Ideen ?


Martok - Di 29.11.11 11:01

Genau, DAS war das was ich meinte. Ist nicht wirklich dokumentiert, aber wenn man sowas tut werden die indizes 0-15 als OverlayImages verwendet (mehr geht nicht) und danach irgendwie anders weiter gezählt. Such mal in der Dokumentation zu den Properties und ggf. auch im Source vom TreeView. Das Problem hatte ich in MLib auch, war irgendwie extrem undurchsichtig.


jaenicke - Di 29.11.11 11:27

Nimm einfach die VirtualTrees [http://www.soft-gems.net/index.php?option=com_content&task=view&id=12&Itemid=38], die sind sowieso schneller und können mehr. :nixweiss:


zuma - Di 29.11.11 12:07

Jaenicke, genau die benutze ich ;)


Delphi-Quelltext
1:
 TVirtualStringTree.Create(aOwner);                    


zuma - Di 29.11.11 14:03

so, hab zwar den eigentlichen Fehler nicht gefunden, ihn aber ?geschickt? umgangen:

Hab in dem Formular mit TreeView eine


Delphi-Quelltext
1:
FImageList : TImageList;                    


angelegt

und im Formcreate dann


Delphi-Quelltext
1:
2:
 FImageListe := TImageList.Create(Self);
 FImageListe.AddImages(GDM.NameDerImageList);


und siehe da, dann läuft es wieder richtig ...

Naja, besser nen Workaround als ne Fehlerhafte Darstellung ;)

Zuma


jaenicke - Di 29.11.11 14:38

Also ich habe hier auch eine TImageList, die direkt im Objektinspektor an Images der TVirtualStringTree zugeordnet ist, da tritt das Problem nicht auf. Und ich hatte das Problem auch noch nie. :gruebel:


zuma - Di 29.11.11 15:25

Hallo Jaenicke,
also, ObjektInspektor is nich,
da alles dynamisch erzeugt wird ;)
Brauche mehrere der Treeviews, da gibts ne Methode, die die erzeugt.
Die einzelnen Treeviews zeigen zwar jeweils andere Datenteile meiner Objekte an,
die Icons sind aber bei allen gleich.
Daher gibts eine Imagelist für alle Icons, die dann im erzeugen der TreeViews an deren Eigenschaft Images gehängt wird.
Komisch ist ja eben, das ich in einem anderem Programm dieselbe ImageList aus dem selben Datamodul verwende (aber dort nicht an Treeview gebunden) und dort alles einwandfrei geht.

Zuma


jaenicke - Mo 26.12.11 23:03

Ich habe hier gerade auch eine VirtualStringTree mit Images und habe mich bei dem Anblick meines jetzt fertigen Quelltextes an den Thread hier erinnert. Ich schätze nämlich bei dir fehlt schlicht die Unterscheidung des Bildtyps. ;-)

Bei dir reicht vermutlich:

Delphi-Quelltext
1:
2:
if Kind <> ikOverlay then
  ImageIndex := ...
Denn wenn du immer den ImageIndex setzt, setzt du den auch als Overlay und nicht nur als normales Bild. ;-)