Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bitmaps in DLL.. (https://www.delphipraxis.net/392-bitmaps-dll.html)

movax 12. Jul 2002 18:43


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-

|movax.rult.de

jbg 12. Jul 2002 19:20

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:
ImageListBmp   BITMAP "Bitmapdatei.bmp"
Diese Datei kompilierst du dann mit
$(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;

sakura 12. Jul 2002 20:44

Schau mal in die Code Bibliothek, da ist ein Beitrag zum Thema Ressource Dateien (RC). Da gibt es noch mehr Infos...

movax 12. Jul 2002 22:11

also, ich hab's jetzt so gemacht:

Code:
[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];
"Tiles.dll" ist halt die DLL mit den Bitmaps drin und ImageList1 soll die ImageList-Komponente sein, in der die Bilder geladen werden.

die .rc-datei sieht so aus:
Code:
StrasseOben BITMAP "StrasseOben.bmp"
StrasseUnten BITMAP "StrasseUnten.bmp"
die .rc-datei liess sich auch so kompillieren.

Um das alles dann zu testen hab ich mir auf meine Form ein Image1 und einen Button gemacht, mit folgendem Code:
Code:
[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];
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!
Was hab ich falsch gemacht?

greetz,
-movax-

Christian Seehase 12. Jul 2002 22:30

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:
[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];
Ausserdem hab' ich das Objekt auch wieder freigegeben.
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.

movax 12. Jul 2002 22:47

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 07:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz