Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TImage.Picture aus TImageList laden


Frankieboy - Do 29.04.10 13:45
Titel: TImage.Picture aus TImageList laden
Hallo,

ich habe ein TImage, dessen Bild (TPicture) aus einer TImagList mit 2 Bildern geladen werden soll...
Es klingt einfach, funktioniert aber komischerweise nicht richtig :nixweiss:.

Image List heißt: ImageList_Test
Image heißt: Image_Test
Das Image hat zur Designzeit noch kein Picture.

Zuerst habe ich es so gemacht:

Delphi-Quelltext
1:
ImageList_Test.GetBitmap(0,Image_Test.Picture.Bitmap);                    

Das hat aber nur geklappt, als ich den Befehl im OnCreate des Forms aufgerufen habe, später ging es nicht mehr.

Also Nummer 2:

Delphi-Quelltext
1:
2:
ImageList_Test.GetBitmap(0,Image_Test.Picture.Bitmap;
Image_Test.Refresh;

Hier klappt es während der ganzen Laufzeit, allerdings nicht mit Transparenz :evil:
Der Hintergrund des Bildes (im BMP weiß) wird leider nicht transparent dargestellt. Dabei habe ich im Image_Test die Transparenz auf "an" und in der ImageList Transparent auf "clWhite". Trotzdem wird der weiße Hintergrund mit gezeichnet.
Wenn ich das Picture von ImageTest direkt aus der BMP-Datei lade, funktioniert die Transparenz.

Hat jemand einen Tip?

Grüße,

Frank


Narses - Do 29.04.10 14:44

Moin!

Tja, die Anwendung von TImageList ist etwas tricky, da hab ich auch schon graue Haare bekommen... ;)

Es gibt da nach meiner Erfahrung zwei Knackpunkte:
  1. Du musst beim Füllen der ImageList bereits darauf achten, dass die Transparenz korrekt übernommen wird. Ich mache das immer so: alle Bilder so aufbereiten, dass die transparente Farbe gleich ist, sagen wir mal $FEFEFE. Jetzt alle Bilder auf einmal in die ImageList laden, die Auswahl nicht aufheben sondern direkt den Wert für die transparente Farbe im PropertyEditor auf $FEFEFE setzen und bestätigen. Dann sind alle Bilder bei mir immer korrekt in der Liste. :idea:
  2. Beim Holen der Bilder kannst du so vorgehen:

    Delphi-Quelltext
    1:
    2:
    3:
    4:
    5:
    procedure TForm1.RadioGroup1Click(Sender: TObject);
    begin
      Image1.Picture := NIL// vorhandenes Bild entfernen, spart auch den Redraw
      ImageList1.GetIcon(RadioGroup1.ItemIndex,Image1.Picture.Icon); // als Icon holen, behält Transparenz ;-)
    end;
cu
Narses