AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Bilder für TImage aus einer Resource-Datei laden
Thema durchsuchen
Ansicht
Themen-Optionen

Bilder für TImage aus einer Resource-Datei laden

Ein Thema von Ares · begonnen am 16. Aug 2006 · letzter Beitrag vom 21. Aug 2006
Antwort Antwort
Seite 1 von 2  1 2      
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

Bilder für TImage aus einer Resource-Datei laden

  Alt 16. Aug 2006, 13:28
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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

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

  Alt 16. Aug 2006, 13:30
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#3

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

  Alt 16. Aug 2006, 13:39
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
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#4

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

  Alt 16. Aug 2006, 13:40
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:
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.)
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#5

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

  Alt 16. Aug 2006, 14:07
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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 16. Aug 2006, 14:20
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;
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von ManuMF
ManuMF

Registriert seit: 11. Jul 2005
1.016 Beiträge
 
Delphi 6 Personal
 
#7

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

  Alt 17. Aug 2006, 11:48
@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;
Gruß,
ManuMF

Endlich hab ich was Positives an Vista entdeckt: Das mitgelieferte Mahjongg
  Mit Zitat antworten Zitat
Puhbaehr
(Gast)

n/a Beiträge
 
#8

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

  Alt 17. Aug 2006, 13:23
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.
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#9

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

  Alt 17. Aug 2006, 16:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Boombuler
Boombuler

Registriert seit: 14. Mär 2003
Ort: Osnabrück
244 Beiträge
 
Delphi 2009 Professional
 
#10

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

  Alt 17. Aug 2006, 16:47
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
"Look at you, Hacker. A pathetic creature of meat and bone, panting and sweating as you run through my corridors. How can you challenge a perfect, immortal machine?"
SwapIt Highscore:
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:33 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