![]() |
Bitmaps in DLL..
..oder sonst einer externen datei.
Hallo ihr! Ich hab da eine Frage: Ich bastel gerade an einem Spiel rum, welches sehr viele verschiedene Bitmaps (als Sprites) benutzt. Diese habe ich bis jetzt alle in einer ImageList-komponente direkt im Hauptprogramm mit eingebunden. Okay, das funktioniert ja auch.. aber so richtig gefallen tut es mir nicht.. Ich hätte die ganzen grafiken lieber in einer externen datei, z.B. in einer DLL datei, damit ich nicht immer das komplette Programm neu kompilieren muss, wenn ih mal eine Grafik ändern will.. Und da wollt ich halt mal fragen ob und vor allem wie das möglich ist. Ich muss dazu sagen, dass ich bisher noch nix mit DLLs gemacht hab, bin sozusagen ein DLL-Newbie ;) Bin für jede Hilfe dankbar! greetz, -movax- | ![]() |
Du erstellst ein neues DLL Projekt. Diesem fügst du die Zeile {$R MyImages.res} hinzu.
Danach erzeugst du eine neue Textdatei mit dem Namen MyImages.rc. Dort schreibst du dann z.B.
Code:
Diese Datei kompilierst du dann mit
ImageListBmp BITMAP "Bitmapdatei.bmp"
$(Delphi)\Bin\brcc32.exe MyImages.rc zu der Datei MyImages.res Eingelesen wird dann so:
Code:
var hLib: THandle;
begin hLib := LoadLibrary(PChar(DLLFileName)); if hLib <> 0 then try ImageList.ResInstLoad(hLib, rtBitmap, 'ImageListBmp', clFuchsia); finally FreeLibrary(hLib); end; end; |
Schau mal in die Code Bibliothek, da ist ein Beitrag zum Thema Ressource Dateien (RC). Da gibt es noch mehr Infos...
|
also, ich hab's jetzt so gemacht:
Code:
"Tiles.dll" ist halt die DLL mit den Bitmaps drin und ImageList1 soll die ImageList-Komponente sein, in der die Bilder geladen werden.
[b]procedure[/b] TForm1.FormCreate(Sender: TObject);
[b]var[/b] hLib: THandle; [b]begin[/b] hLib := LoadLibrary(PChar('Tiles.dll')); [b]if[/b] hLib <> 0 [b]then[/b] [b]try[/b] ImageList1.ResInstLoad(hLib, rtBitmap, 'StrasseOben', clFuchsia); [b]finally[/b] FreeLibrary(hLib); [b]end[/b]; [b]end[/b]; die .rc-datei sieht so aus:
Code:
die .rc-datei liess sich auch so kompillieren.
StrasseOben BITMAP "StrasseOben.bmp"
StrasseUnten BITMAP "StrasseUnten.bmp" Um das alles dann zu testen hab ich mir auf meine Form ein Image1 und einen Button gemacht, mit folgendem Code:
Code:
wenn ich das programm dann starte und auf den button klicke passiert.. überhaupt nichts. Ja, okay, Image1 wird weiss, wegen dem Canvas-Zugriff.. aber das Bitmap wird nicht angezeigt!
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]var[/b] bild: tbitmap; [b]begin[/b] bild := tbitmap.Create; Tiles.GetBitmap(0, bild); Image1.Canvas.Draw(0, 0, bild); [b]end[/b]; Was hab ich falsch gemacht? greetz, -movax- |
Moin movax,
TBitmaps haben die unangehme Eigenschaft, dass man erst einmal ihre Grösse setzen muss, bevor man sie erfolgreich füllen kann. Das müsste dann ungefähr so aussehen.
Code:
Ausserdem hab' ich das Objekt auch wieder freigegeben.
[b]procedure[/b] TForm1.Button1Click(Sender: TObject);
[b]var[/b] bild: tbitmap; [b]begin[/b] bild := tbitmap.Create; [b]try[/b] bild.Height := Tiles.Height; bild.Width := Tiles.Width; Tiles.GetBitmap(0, bild); Image1.Canvas.Draw(0, 0, bild); [b]finally[/b] FreeAndNil(bild); [b]end[/b]; [b]end[/b]; Da durch das Erzeugen eines Objektes Resourcen belegt werden, müssen diese auch, nach Gebrauch, wieder freigegeben werden, um Speicherlecks zu vermeiden. Dazu dient der try/finally Block. (sogenannter Resourcenschutzblock). Würde zwischen try und finally irgendetwas schiefgehen (Exception), würde finally in jedem Falle ausgeführt werden (hoffentlich ;-)), und somit die durch TBitmap.Create belegten Resourcen wieder freigegeben. |
Es lebt! ES LEBT! Ich habe eine Kreatur geschaffe, die.. ehem.. *hust*..
was ich damit sagen wollte: DANKE SEHR! Es funktioniert :D jaja, die bösen TBitmaps.. machen nur ärger *lol* also vielen Dank für die schnelle Hilfe jbg, sakura (danke für den hinweis, hab ich mir angesehen, wirklich interessant) und chris ;) greetz, -movax- |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:09 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 by Thomas Breitkreuz