Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bilder für TImage aus einer Resource-Datei laden (https://www.delphipraxis.net/75236-bilder-fuer-timage-aus-einer-resource-datei-laden.html)

Ares 16. Aug 2006 12:28


Bilder für TImage aus einer Resource-Datei laden
 
Hallo!

Ich habe ein kleines Tool geschrieben, dass in Deutsch und in Englisch genutzt werden kann. Der Benutzer soll die Sprache im Betrieb selbst wechseln können. Neben den Texten sind auch einige Bilder abhängig von der Sprache (z.B. grafische Buttons).

Natürlich könnte ich alle Texte und alle Bilder in beiden sprachen direkt in die EXE compilieren und dann bei der Benutzerauswahl der Sprache dynamisch zuordnen. Dadurch wird die EXE allerdings unnötig groß. Außderm soll es in Zukunft auch noch ein paar weitere Sprachen geben, die man sich dann separat nachladen können soll.

Jede Sprache soll daher in einzelne Dateien ausgelagert werden können, auf die die EXE dann zugreift. Für die Texte ist das ja gar kein Problem, hier würde eine einfache INI-Datei schon ausreichen. Aber was macht man mit den Bildern? Alle Bilder einzeln beizufügen finde ich nicht so gelungen.

Ich suche daher eine Möglichkeit alle Bilder einer Sprache in eine gemeinsame Datei zu packen aus der sich die EXE dann bedienen kann. Ideal wäre es natürlich wenn man die Texte auch noch in diese Datei packen könnte. Das ist aber nur optional.

Kennt jemand eine Möglichkeit, wie man so etwas machen könnte?

Herzlichen Dank für eure Hilfe!
Ares

3_of_8 16. Aug 2006 12:30

Re: Bilder für TImage aus einer Resource-Datei laden
 
Du könntest es so machen, dass du alle Bilder hintereinander in einem bestimmten Format abspeicherst.

Zuerst ein Integer mit der Größe, dann die Bilddaten, dann das nächste Bild genauso.

Das liest du dann mit nem TFileStream aus.

_frank_ 16. Aug 2006 12:39

Re: Bilder für TImage aus einer Resource-Datei laden
 
eine weitere möglichkeit wäre eine resourcen-dll.

einfach eine res-datei erstellen (z.B. mit http://rfe.sf.net ) und diese in eine "funktions-leere" dll einbinden.
im programm kannst du die dll dynamisch per loadlibrary einbinden und die daten laden (Tressourcestream,...).
strings definierst du als stringtable.

HTH Frank

ManuMF 16. Aug 2006 12:40

Re: Bilder für TImage aus einer Resource-Datei laden
 
Mein Vorschlag: Eine DLL-Datei, in der die Bilder liegen. In die Datei können dann auch noch z.B. Versionsinfos eingefügt werden. Dazu der Code für die DLL:

Delphi-Quellcode:
library Bilder_DE;

{$R 'Bilder_DE.res' 'Bilder_DE.rc'}

{$R *.res}

begin
end.
und die RC-Datei:
Delphi-Quellcode:
Name BITMAP "datei.bmp"
Und im Programm wird das ganze per
Delphi-Quellcode:
var DLLHandle: THandle;

begin
  DLLHandle := LoadLibrary('Bilder_DE.dll');
  TBitmap.LoadFromResourceName(DLLHandle, 'Name');
end;
Aber vor dem Laden würde ich z.B. eine Liste der verfügbaren DLLs erstellen.
Und es ist auch besser, dem Bild in der RC-Datei eine Nummer zuzuweisen und es dann per LoadFromResourceID zu laden.

(Ich habe es nicht geprüft, aber bei meiner "Uhr" (siehe Freeware) mit WAVEs so gemacht, es müsste also eigentlich funktionieren.)

Puhbaehr 16. Aug 2006 13:07

Re: Bilder für TImage aus einer Resource-Datei laden
 
Mmmh in dem Buch "DirectX9 in Delphi" von Martin Pyka (Herausgeber: Stefan Zerbst) wird dieses Thema angesprochen. Dabei wird in dem Thema Texturen aus Ressourcendateien folgendes beschrieben:

"...kann man die Texturen auch in eine Ressourcendatei laden, so dass die Bilddaten beim Kompilieren in die Exe-Datei mit eingebunden werden."

Das ist ja genau das was du NICHT willst. Aber vielleicht hilft dir das trotzdem. Weiter im Buch (Kurzfassung):

- Texteditor wie Windows-Editor auf und folgendes als Beispiel eintragen:
Code:
tex1 RCDATA "textur1.jpg"
tex2 RCDATA "textur2.jpg"
tex3 RCDATA "textur3.jpg"
- Datei speichern als *.rc Datei z.B. "daten.rc"
- tex1, text2 sind einfach nur Namen die "anstatt der Dateinamen verwendet werden"
- "textur1.jpg" gibt, so steht es hier etwas undeutlich, den relativen Pfad zur Datei an
- die EXE namens brcc32.exe im Ordner /Bin des Delphi-Verzeichnisses gibt eine Ressourendatei aus. Aufruf z.B.:
Code:
brcc32.exe daten.rc
- im Projekt selbst wird die daraus erzeugte Ressourcendatei mit
Code:
{$R daten.res}
eingebunden

Hier im Buch wird diese Ressourcendatei verwendet um damit, wie schon geschrieben, Texturen einzubinden und diese auf die DirectX-Funktionen anzuwenden. Ich bin mir sicher dieser Satz könnte dir ebenfalls weiter helfen:
"...ein Handle zu der Anwendung, in der sich die Textur befindet. Delphi bietet hierfür bereits vordefinierte Variable hInstance." Also könnte man davon ausgehen, dass man irgendwo im eigenen Handle auf die Ressourcendatei zugreifen kann. Ich denke die Delphihilfe zu den Ressourcendateien bringt auch noch einiges Wertvolles.

Aber mal etwas anderes dazu:
Schreib dir doch ein kleines Programm dass die von dir verwendeten Grafiken für die neue Sprache samt Texten in einer eigenen Datei auslagert die anschließend dein Programm mit selber umgekehrter Prozedure wieder ausliest.
Das könnte evtl. in records gespeichert werden. Der Record wird wiederrum samt Rohdaten der Grafiken in eine Datei abgespeichert.
Beim Wiederauslesen wird gleicher Record-Typ wieder auf die Datei angewandt. Wenn du für jede Sprache gleiche Buttons usw. verwendest sollte das funktionieren.

Gruß, Robert

3_of_8 16. Aug 2006 13:20

Re: Bilder für TImage aus einer Resource-Datei laden
 
Also ein Bild laden is nicht sonderlich schwer:

function LoadResourceBitmap(resourcename: String): TBitmap;
begin
if resourcename<>'' then
begin
result:=TBitmap.Create;
result.handle:=LoadBitmap(hinstance, @resourcename[1]);
end;
end;

ManuMF 17. Aug 2006 10:48

Re: Bilder für TImage aus einer Resource-Datei laden
 
@Puhbaehr: Das ist ja da, was ich vorgeschlagen habe. Allerdings geht es bei mir einfacher, denn der Text {$R 'Bilder_DE.res' 'Bilder_DE.rc'} erspart das separate kompilieren, so macht es Delphi automatisch. Und das Laden habe ich ja ebenfalls beschrieben ;-)

Und dann noch der Code von 3_of_8 passend für eine DLL:
Delphi-Quellcode:
function LoadResourceBitmap(Resourcename: String): TBitmap;
begin
  if (Resourcename <> '') then
  begin
    result := TBitmap.Create;
    result.Handle := LoadBitmap(DLLHandle, PChar(Resourcename));
    // DLLHandle ist das Handle, das von LoadLibrary übergeben wird
    // (siehe mein Beitrag weiter oben)
  end;
end;

Puhbaehr 17. Aug 2006 12:23

Re: Bilder für TImage aus einer Resource-Datei laden
 
Zitat:

Zitat von ManuMF
@Puhbaehr: Das ist ja da, was ich vorgeschlagen habe...

Jupp, du musst deinen Beitrag fast fertig gehabt haben als ich mit meinem anfing. Ich hatte nämlich rote Kästchen als ich meinen Absenden wollte.

Ares 17. Aug 2006 15:12

Re: Bilder für TImage aus einer Resource-Datei laden
 
Hallo!

Vielen Dank für die Zahlreichen Tipps! Ich denke die Lösung mit DLLs ist die praktischste. Ich habe allerdings noch nie DLLs selbst erstellt und daher noch eine Frage dazu:

Kann ich aus dem Programm heraus auch auf Konstanten zugreifen, die ich ein der DLL definiert habe? Dann könnte ich die Texte nämlich direkt mit dort einbinden...

Besten Dank!
Ares

Boombuler 17. Aug 2006 15:47

Re: Bilder für TImage aus einer Resource-Datei laden
 
Zitat:

Zitat von _frank_
eine weitere möglichkeit wäre eine resourcen-dll.

einfach eine res-datei erstellen (z.B. mit http://rfe.sf.net ) und diese in eine "funktions-leere" dll einbinden.
im programm kannst du die dll dynamisch per loadlibrary einbinden und die daten laden (Tressourcestream,...).
strings definierst du als stringtable.

HTH Frank

Da hätten wir die Möglichkeit eben jene StringTables zu benutzen (also in den Resourcen) oder du schreibst dir ne Funktion in der Dll die dir einen String aus einer ID zurück gibt!
z.B.
Delphi-Quellcode:
Function GetStringByID(aID: Integer): PChar; stdcall;
begin
  case aID of
    1: result := 'Blub';
    2: result := 'Foo';
    3: result := 'Bar';
  end;
end;
Allerdings sind die StringTables eigentlich die "richtigere" Lösung!

Greetz
Boombuler


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 Uhr.
Seite 1 von 2  1 2      

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