AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bitmaps in DLL..

Ein Thema von movax · begonnen am 12. Jul 2002 · letzter Beitrag vom 12. Jul 2002
Antwort Antwort
Benutzerbild von movax
movax

Registriert seit: 12. Jul 2002
Ort: phobos
15 Beiträge
 
#1

Bitmaps in DLL..

  Alt 12. Jul 2002, 18:43
..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
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.478 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 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;
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.586 Beiträge
 
Delphi 10.4 Sydney
 
#3
  Alt 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...
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von movax
movax

Registriert seit: 12. Jul 2002
Ort: phobos
15 Beiträge
 
#4
  Alt 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-
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.262 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von movax
movax

Registriert seit: 12. Jul 2002
Ort: phobos
15 Beiträge
 
#6
  Alt 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
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-
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf