Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bilder aus einer externen Datei laden (https://www.delphipraxis.net/144156-bilder-aus-einer-externen-datei-laden.html)

Whatever 1. Dez 2009 13:14


Bilder aus einer externen Datei laden
 
Hallo!

Ich habe vor ein kleines Spiel zu schreiben in welchem ich circa 60 Bilddateien benötige. Ich möchte diese nicht unbedingt in einem Ordner im Spielverzeichnes liegen haben, sondern eben in einer externen Datei. Das Problem was sich hierbei stellt ist, dass ich damit noch keine Erfahrungen habe. Also habe ich ein wenig das Netz durchforstet und bin auf Themen wie z.B. Ressourcen-DLLs gestossen. Verwirrend waren allerdings Einträge über .res Dateien, die wohl den selben Zweck erfüllen. Meine Frage ist nun, was wohl für mein Problem am sinnvollsten ist.

Grüße

himitsu 1. Dez 2009 13:51

Re: Bilder aus einer externen Datei laden
 
du kannst:

die Dateien einfach in einen Stream packen und in 'ner Datei speichern

eine ZIP-Komponente verwenden und alles in einer ZIP verpacken

Resourcen (in der EXE oder einer DLL)

TImageList

...


Was für dich am Sinnfollsten ist, kannst du nur selber beantworten, da wir ja nicht alle deine Bedürfnisse kennen.

DeddyH 1. Dez 2009 14:03

Re: Bilder aus einer externen Datei laden
 
Eine *.res-Datei ist eine Datei, die Deine Ressourcen enthält. Diese kannst Du nun direkt in Deine Exe oder in eine DLL linken, welche Du dann mitliefern müsstest. Dazu musst Du nur im Quellcode Deiner Anwendung bzw. DLL die Zeile
Delphi-Quellcode:
{$R Datei.res} //"Datei" steht natürlich für den Dateinamen
einfügen, sofern die *.res im Projektordner liegt.

Whatever 1. Dez 2009 14:20

Re: Bilder aus einer externen Datei laden
 
Vielen Dank erstmal :thumb:
Ich habe mich jetzt für die DLL entschieden und auch gleich mit dem XN Resource Editor eine .res Datei erstellt und diese in eine DLL compiliert. Jetzt möchte ich gern eine dieser Grafiken aufrufen, was in einer Funktion geschehen soll, die ein TBitmap zurückgibt. Das einzige Problem was ich jetzt noch habe ist, dass die aufgerufene Ressource nicht gefunden wird. Ich vermute, dass ich die Grafik unter einem falschen "Pfad" versuche aufzurufen.

Delphi-Quellcode:
r := TResourceStream.Create(h,Datei,'Bitmap');
Grüße

DeddyH 1. Dez 2009 14:27

Re: Bilder aus einer externen Datei laden
 
Schau einmal hier: http://delphi.about.com/library/weekly/aa010405a.htm

himitsu 1. Dez 2009 14:32

Re: Bilder aus einer externen Datei laden
 
es kommt jetzt darauf an, wie du deine Resourcen-Datei erstellt und wie du die DLL eingebunden/geladen hast.

.CreateFromID mit DLL-Handle und ID-des-Bildes
.Create mit DLL-Handle und Name-des-Bildes

Whatever 1. Dez 2009 14:48

Re: Bilder aus einer externen Datei laden
 
Also hiermit möchte ich die Bilder aufrufen:

Delphi-Quellcode:
function GetCard(CardIndex:String):TBitmap;
  var
    h: Cardinal;
    r: TResourceStream;
    b: TBitmap;
  begin
    h:= LoadLibrary('CardsDLL.dll');
    if h <> 0 then
      begin
        r := TResourceStream.Create(h,CardIndex,'Bitmap');
        b := TBitmap.Create;
          try
            b.LoadFromStream(r);
            result:= b;
          finally
            b.Free;
            r.Free;
            FreeLibrary(h)
          end;
      end
    else
      RaiseLastOSError();
  end;
Von der Struktur her sieht meine DLL so aus:
Bitmap-1 -1.bmp
-2 -2.bmp
-3 -3.bmp
usw.
Falls das gemeint war :)

Hab mir das Tutorial mal angesehen, finde darin aber nicht unbedingt die Lösung für mein Problem... aber Danke trotzdem :)

himitsu 1. Dez 2009 15:04

Re: Bilder aus einer externen Datei laden
 
b.Free gibt übrigens dein Bitmap frei und der Wert in Result wäre somit ungültig/fehlerhaft

und bei einem fehler wärend der Restelltung des Bitmaps und des Resourcestreams, wäre die DLL nicht wieder entladen wurden.

und da du anscheinend Indize in der RES verwendest, würden sich diese auch beim Laden gut machen
Delphi-Quellcode:
function GetCard(CardIndex: Integer): TBitmap;
  var
    h: THandle;
    r: TResourceStream;
  begin
    h := LoadLibrary('CardsDLL.dll');
    if h <> 0 then
      try
        r := TResourceStream.CreateFromID(h, CardIndex, 'Bitmap');
        result := TBitmap.Create;
        try
          result.LoadFromStream(r);
        finally
          r.Free;
        end;
      finally
        FreeLibrary(h);
      end;
    else
      RaiseLastOSError;
  end;
Da Objekte als Result oftmals als genzwertig böse angesehn werden, könnte man es auch so machen
Delphi-Quellcode:
procedure GetCard(CardIndex: Integer; Var Bitmap: TBitmap);
  var
    h: THandle;
    r: TStream;
  begin
    h := LoadLibrary('CardsDLL.dll');
    if h <> 0 then
      try
        r := TResourceStream.CreateFromID(h, CardIndex, 'Bitmap');
        try
          if not Assigned(Bitmap) then
            Bitmap := TBitmap.Create;
          Bitmap.LoadFromStream(r);
        finally
          r.Free;
        end;
      finally
        FreeLibrary(h);
      end;
    else
      RaiseLastOSError;
  end;

Whatever 1. Dez 2009 15:24

Re: Bilder aus einer externen Datei laden
 
Macht Sinn! :-D
Dankeschön!
Ich bekomme allerdings beim Aufrufen eine Zugriffsverletzung....

Andreas L. 1. Dez 2009 15:43

Re: Bilder aus einer externen Datei laden
 
Hast du die res-Datei über ein Resourcenscript (.rc) erzeugt? Wenn ja, hast du einen Fehler in deiner Struktur:

Zitat:

Bitmap-1 -1.bmp
-2 -2.bmp
-3 -3.bmp
erste Name, dann Typ, dann Dateiname:

Code:
1 BITMAP 1.bmp
2 BITMAP 2.bmp
etc...
EDIT: Hab überlesen das du XN Resource Editor verwendest...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:05 Uhr.
Seite 1 von 4  1 23     Letzte »    

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