![]() |
Bilder von DLL in ImageList
Hi
ich habe Bilder zu einer Ressource einer DLL hinzugefügt ( ![]() Nun möchte ich die Bilder in eine Imagelist laden. Das mache ich bisher so:
Delphi-Quellcode:
Blöderweise kommt nach der Procedur eine AV.
procedure TForm1.LoadImages;
var h :HINST; r :TResourceStream; j :TJpegImage; im: TImage; begin h := LoadLibrary('pBilder.dll'); if h <> 0 then begin r := TResourceStream.Create(h, 'Bild1', 'Jpeg'); j := TJpegImage.Create; im := TImage.create(self); try j.LoadFromStream(r); Im.Picture.Bitmap.Assign(j); test.Add(im.Picture.Bitmap, im.Picture.Bitmap); // test ist die ImageList finally j.Free; r.Free; im.free; end; end; FreeLibrary(h); end; Also wenn ich Schritt-für-Schritt Debugging mache klappt die Prozedur ohne Probleme, dannach kommen ein paar Assembleranweisungen und dann die AV. Ohne die Procedur kommt die AV nicht. Meine Frage also: Was mach ich falsch bzw gibt es einen "professionelleren" Weg als meinen? mfg.Dominik |
Re: Bilder von DLL in ImageList
Delphi-Quellcode:
(1) Du lädst ein JPEG in ein Bitmap, das klappt ja nun nicht.
try
j.LoadFromStream(r); Im.Picture.Bitmap.Assign(j); // <--<< (1) test.Add(im.Picture.Bitmap, im.Picture.Bitmap); // <--<< (2) Bitte so:
Delphi-Quellcode:
(2) Da du nun ein JPEG und kein Bitmap hast musst du das Image noch zu einem Bitmap wandeln:
Im.Picture.Assign(j);
Delphi-Quellcode:
/////////////////////////////////////////////////////
// Convert a JPEG / PNG / GIF etc to Bitmap // Attention: not for Icons and Metaliles procedure ImageToBitmap(Img: TImage); var Pic: TPicture; begin Pic := TPicture.Create; try Pic.Assign(Img.Picture); Img.Picture.Bitmap.Assign(Pic.Graphic); finally FreeAndNil(Pic); end; end; procedure TForm1.LoadImages; //... ImageToBitmap(Im); test.Add(im.Picture.Bitmap, im.Picture.Bitmap); //... |
Re: Bilder von DLL in ImageList
ok, hab mir das mal zu herzen genommen^^
jetzt sieht das ganze so aus:
Delphi-Quellcode:
leider kommt immernoch die AV.
procedure ImageToBitmap(Img: TImage);
var Pic: TPicture; begin Pic := TPicture.Create; try Pic.Assign(Img.Picture); Img.Picture.Bitmap.Assign(Pic.Graphic); finally FreeAndNil(Pic); end; end; procedure TForm1.LoadImages; var h :HINST; r :TResourceStream; j :TJpegImage; im: TImage; I: Integer; Namen: TStringList; begin Namen := TStringList.Create; Namen.Add('bWdhTrackp'); Namen.Add('bWdhTrack'); Namen.Add('bWdhp'); Namen.Add('bWdhNonep'); Namen.Add('bWdhNone'); h := LoadLibrary('pBilder.dll'); if h <> 0 then for I := 0 to 4 do begin r := TResourceStream.Create(h, Namen[I], 'Jpeg'); j := TJpegImage.Create; im := TImage.create(self); try j.LoadFromStream(r); Im.Picture.Assign(j); ImageToBitmap(Im); test.Add(im.Picture.Bitmap, im.Picture.Bitmap); finally j.Free; r.Free; im.free; end; end; FreeLibrary(h); Namen.free; end; Ich hab aber etwas interessantes festgestellt: er führt nur die erste schleife aus, dann beim
Delphi-Quellcode:
springt er in die Unit System zu
im.free
Delphi-Quellcode:
nach so ca 100 befehlen kommt dann die AV.
CALL SysInit.@GetTLS
MOV ECX,[EAX].RaiseListPtr MOV EDX,[ECX].TRaiseFrame.NextRaise MOV [EAX].RaiseListPtr,EDX ADD ESP,5*4 { Remove local RaiseList } [...] |
Re: Bilder von DLL in ImageList
ok, den code hatte ich nach dem create meiner forms ausgeführt.
ich hab mir jetzt mal nen button draufgeklatscht und dann über den button die procedur eingbunden, jetzt kommt die AV unmittelbar nach dieser Zeile:
Delphi-Quellcode:
ist das die richtige art ein bild in eine ImageList zu adden?
test.Add(im.Picture.Bitmap, im.Picture.Bitmap);
|
Re: Bilder von DLL in ImageList
Zitat:
Delphi-Quellcode:
(nur mal so ins blaue getippt)
procedure TForm1.LoadImages;
var h :HINST; r :TResourceStream; j :TJpegImage; im: TImage; I: Integer; Namen: TStringList; begin Namen := TStringList.Create; Namen.Add('bWdhTrackp'); Namen.Add('bWdhTrack'); Namen.Add('bWdhp'); Namen.Add('bWdhNonep'); Namen.Add('bWdhNone'); h := LoadLibrary('pBilder.dll'); if h <> 0 then begin j := TJpegImage.Create; im := TImage.create(self); try for i := 0 to Namen.Count - 1 do begin r := TResourceStream.Create(h, Namen[I], 'Jpeg'); try j.LoadFromStream(r); Im.Picture.Assign(j); ImageToBitmap(Im); test.Add(im.Picture.Bitmap, im.Picture.Bitmap); finally r.Free; end; end; finally j.Free; im.free; end; end; FreeLibrary(h); Namen.free; end; Hänge doch mal das Projekt als Zip an ,dann könnte man mal nachgucken. |
Re: Bilder von DLL in ImageList
haha...mein Delphi verarscht sich selbst... :wall:
Wenn ich eine ImageList auf meine Form ziehe trägt er diese automatsch in die public-section meiner Form statt direkt unter dem namen ein...
Delphi-Quellcode:
Folge: die ImageList wird nicht erzeugt und gibt daher ne AV beim Adden...
type
TfSoFi = class(TForm, IDropSource) // hier hin sollte die deklaration private public test: TImageList; // und hier ist sie end; Das komische daran ist das das nur bei dieser einen Form passiert... mit anderen Forms hatte ich das Problem noch nie. Und auch Ereignis-Routinen (zB Button1Click) die ich aus dem OI erstelle landen im public-Teil. Aber ich würd sagen ich mache wegen der Frage nen neuen Thread auf, da die alte Frage ja jetzt geklärt ist... Danke nochmal an turboPASCAL wegen dem richtigen umwandeln der Bilder und den Tipps... mfg.Dominik |
Re: Bilder von DLL in ImageList
noch eine klitzekleine Frage:
Als ich die Bilder zur Designtime hinzugefügt habe hab ich immer "Zentrieren" in der Imagelist ausgewählt. Wie kann ich das jetzt über den quellcode machen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 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