![]() |
PNG zur Laufzeit in ImageList einfügen
Hallo,
diesmal möchte ich eine PNG Datei einlesen lassen und sie dann in eine ImageList einfügen.
Delphi-Quellcode:
Ich habe mir das jetzt irgendwie so gedacht, kriege aber leider immer eine Fehlermeldung, dass eine Speicherverletzung auftritt. Was genau fehlt mir noch bzw. was ist richtig an dem, was ich gemacht habe?
procedure build_imagelist(ImageList:TImageList);
var image : TBitmap; PNG : TPNGOBject; i :Integer; begin png.Create; image.create; png.LoadFromFile('images\bild1.png'); image.Assign(png); Imagelist.Add(image,nil); png.Destroy; image.Destroy; end; Gruß Micha PS nochmal danke für eure bisherige Hilfe. |
Re: PNG zur Laufzeit in ImageList einfügen
In welcher (Code-)Zeile?
|
Re: PNG zur Laufzeit in ImageList einfügen
Hallo,
in garkeiner Zeile. Compilieren und erzeugen passt beides. Aber beim Starten kommt dann folgende Meldung: Zugriffsverletzung bei Adresse {blabla} im Modul start.exe. Lesen von Adresse {blabla}. Ich lasse die Funktion übrigens bei onShow starten. Gruß Micha |
Re: PNG zur Laufzeit in ImageList einfügen
Delphi-Quellcode:
//falsch
png.Create; image.create; //richtig png := TPNGObject.Create; image := TBitmap.create; |
Re: PNG zur Laufzeit in ImageList einfügen
png := TPngObject.Create;
image := TBitmap.create; png.LoadFromFile('images\bild1.png'); image.Assign(png); Imagelist.Add(image,nil); png.Free; image.Free; |
Re: PNG zur Laufzeit in ImageList einfügen
Hallo,
dankeschön :-) Funktioniert. Und wie sorge ich dafür, dass die Hintergründe Transparent bleiben? Gruß Micha |
Re: PNG zur Laufzeit in ImageList einfügen
Zitat:
Zitat:
|
Re: PNG zur Laufzeit in ImageList einfügen
Liste der Anhänge anzeigen (Anzahl: 1)
Jetzt frag ich nochmal: Welche Delphi-Version hast du? (Das kannst du auch in deinem Profil eintragen damit es jeder sehen kann)
Ab Delphi 2009 (oder ab 2007?) unterstützt die IDE von Haus aus PNG-Bilder. Es sollte also auch eine Möglichkeit geben der ImageList ein PNG hinzu zufügen ohne es vorher in ein Bitmap oder ähnliches umzuwandeln. Da ich aber auch schon jede Menge Probleme mit der ImageList hatte, verwende ich nur noch die X²GraphicList (siehe Anhang). Da kann man alles rein laden 8-) |
AW: PNG zur Laufzeit in ImageList einfügen
Wir haben auf Delphi XE umgestellt. Leider habe ich das Problem der Transparenz von PNGs in Imagelisten.
Folgende Situation: PNGs sind in einer ImageDLL gespeichert: Auszug auf der rc Datei:
Delphi-Quellcode:
cut RCDATA "cut.png"
Um diese Dll habe ich eine Klasse geschrieben die die Bilder dann als TPngImage zurückgibt:
Delphi-Quellcode:
Das wird dann wiederum in eine TImagelist gespeichert:
function TImageDll.GetPNG(Name: string): TPngImage;
var hLib : THandle; begin try hLib := LoadLibrary(PChar(fImageDll)); Result := TPngImage.Create; Result.LoadFromResourceName(hLib, Name); except end; end;
Delphi-Quellcode:
ilStandard ist eine von mir erweiterte TImagelist, die zusätzlich beim Add ein GrayscaleImage in die Imagelist für die deaktivierten Bilder packt.
ilStandard.Add(sImageDll.GetPNG('cut'), nil);
Delphi-Quellcode:
Ich habe schon mit Transparenz hin und her probiert, aber nichts funktioniert.
function TMyImageList.Add(Image, Mask: TBitmap): Integer;
begin Result := inherited Add(Image, Mask); if Assigned(FDisabledImages) then begin ConvertColors(Image); if Assigned(Mask) then ConvertColors(Mask); FDisabledImages.Add(Image, Mask); end; end; Bisher habe ich die PNGs gleich in Bitmaps umgewandelt, aber dabei geht ja die Transparenz verloren. Ich habe mich da mit TransperentColor = clBtnFace beholfen, aber das sieht im Menü leider nicht so gut aus. Die Bilder werden in TMainMenu und in TControlBar benutzt. Die TToolButtons sehen dann gut aus, aber leider ist im Menü der Hintergrund nicht (immer) clBtnFace.
Delphi-Quellcode:
Ich hoffe ich hab mich verständlich ausgedrückt. Hier nochmal eine kurze Zusammenfassung was ich machen will:
function TImageDll.LoadPNG(Name: string; TransperentColor : TColor): Graphics.TBitmap;
var hLib : THandle; PNGImage : TPngImage; begin Result := Graphics.TBitmap.Create; try hLib := LoadLibrary(PChar(fImageDll)); PNGImage := TPngImage.Create; PNGImage.LoadFromResourceName(hLib, Name); PNGImage.Transparent := true; Result.Canvas.Brush.Color := TransperentColor; Result.Width := PNGImage.Width; Result.Height := PNGImage.Height; Result.Canvas.StretchDraw(Rect(0, 0, PNGImage.Width, PNGImage.Height), PNGImage); PNGImage.Free; except On E : EPNGCouldNotLoadResource do ShowMessageFmt(rcDLLFailure, [sDLLPath + rcImgDll]); end; end; 1. PNGs als Resource in eine DLL 2. PNGs mit LoadFromResourceName laden 3. PNGs in einer TImageList speichern UND dabei nicht den Alphachannel verlieren 3b. möglicherweise gleich GrayscaleImage erstellen und in eine zweite TImageList speichern 4. Bilder korrekt in TMainMenu, TToolButtons, ... anzeigen MIT richtigem Alphachannel Mein Knackpunkt ist Nummer 3. Vielen dank schon mal für die Antworten David P.S.: Uwes Vorschlag hat leider nicht geklappt. |
AW: PNG zur Laufzeit in ImageList einfügen
Ganz spontan geantwortet: delphis TImageList kennt keine derartige Transparenz (Alpha-Kanal), wie sie im PNG verbaut ist.
TImageList kennt nur RGB-Bitmap mit zusätzlichem Schwarz/Weiß-Masken-Bitmap (wür ein ICON also ein Bitmap mit den Farben und Nocheines mit einer Maske für die volltranzparenten Pixel) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz