Ressourcefile/de
Dieser Artikel behandelt ausschließlich Windows.
Siehe auch: Multiplatform Programming Guide/de
│
Deutsch (de) │
Zurück zu den Zusätzlichen Informationen.
Dieser Artikel bezieht sich auf Lazarus Version 1.0.6 und höher.
Dieser Artikel beschäftigt sich mit den Grundlagen von Ressourcen-Dateien.
Einleitung
Dieser Artikel beschreibt die Erstellung und Verwendung von Ressourcendateien speziell für die Programmierung unter Windows.
Als Beispiel dient das Einfügen von mehreren Ressourcen in das eigene Windowsprogramm.
Möglichkeiten eine Ressourcendatei einzubinden
Eine Ressourcendatei kann auf zwei Wegen in das eigene Programm eingebunden werden:
- als Textdatei (*.rc)
- vorcompiliert als Binärdatei (*.res)
Kommentare in einer Ressourcendatei
In Recourcendateien sind Kommentare grundsätzlich möglich und auch erlaubt.
Es gibt zwei Arten von Kommentaren Einzelkommentare und Blockkommentare.
Einzelkommentarzeichen // kennzeichnen nur eine einzelne Zeile oder das Ende einer Zeile als Kommentar.
Blockkommentarzeichen /* */ kennzeichnen eine einzelne oder mehrere Zeilen als Kommentar.
Beispiel für einen Einzelkommentar:
NeuesIcon ICON Neu.ico // ein zusätzliches Icon für das Programm.
Beispiel für einen Blockkommentar:
/* In dieser Datei (test.rc) sind alle Recourcen für das Programm enthalten. */
Schritt 1: Erstellen der Ressourcendatei als Textdatei
Zuerst müssen Sie sich die einzubindenden Ressourcen (Icons, Bitmaps, usw.) erstellen oder beschaffen.
Dann erstellen Sie mit einem Texteditor (z. B. Notepad) eine Datei mit der Endung .rc. Eine Ressourcendatei muss immer die Dateiendung .rc haben.
In diese Ressourcendatei tragen Sie die einzelnen Recourcen (Icon, Bitmap, JPEG) nach folgendem Schema ein:
[Der Name unter dem die Recource (Icon, Bitmap, JPEG, usw.) in Ihrem Programm verwendet werden soll] [Ressourcentyp] [Name der einzubindenden Datei]
Beispiel für den Aufbau der Ressourcendatei:
/* ICONS */ MAINICON ICON "Bubble.ico" ZWEITES ICON "Buy.ico" DRITTES ICON "Calendar.ico" VIERTES ICON "Clipboard.ico" /* Grafiken */ HINTERGRUNDBMP BITMAP "Hintergrund.bmp" HINTERGRUNDJPG RCDATA "Hintergrund.jpg" HINTERGRUNDGIF RCDATA "Hintergrund.gif" HINTERGRUNDPNG RCDATA "Hintergrund.png" /* Cursors */ FarbCursorNormal CURSOR FarbCursorNormal.cur FarbCursorAlternativ CURSOR FarbCursorAlternativ.cur /* Klaenge */ TON WAVE "Ton.wav"
Vergessen Sie das Speichern der Ressourcendatei nicht.
In diesem Beispiel heisst die Ressourcendatei test.rc.
Schritt 2: Einbinden der Ressourcendatei in das eigene Programm
Möglichkeit 1: Verwenden der Ressourcendatei als Textdatei
Einbinden der Ressourcendatei als Textdatei
Die Ressourcendatei (test.rc) wird mit der Compilerdirektive $R in das Programm eingebunden.
unit ...;
{$mode objfpc}{$H+}
{$R test.rc}
...
interface
Möglichkeit 2: Verwenden der Ressourcendatei als Binärdatei
Dies ist nur unter Windows 32 Bit möglich, da nur dort der Ressourcen-Compiler windres.exe zum Lieferumfang gehört.
Compilieren der Ressourcendatei zur Binärdatei
Das Programm windres.exe gehört zum Lieferumfang von FreePascal.
Das Programm windres.exe ist ein Konsolenprogramm. Das heisst, das Programm windres hat keine grafische Oberfläche und wird an der Konsole bedient.
Das Programm windres.exe findet sich im Binärverzeichnis von Free Pascal.
Das Programm windres.exe findet sich evtl. unter folgendem Pfad %ProgramFiles%\lazarus\fpc\2.6.0\bin\i386-win32.
Syntax:
windres -i [Eingabedatei] -o [Ausgabedatei]
Beispiel:
windres -i test.rc -o test.res
Einbinden der Ressourcendatei als Binärdatei
Die compilierte Ressourcendatei (test.res) wird mit der Compilerdirektive $R in das Programm eingebunden.
unit ...;
{$mode objfpc}{$H+}
{$R test.res}
...
interface
Verwenden der Ressource im eigenen Programmcode
Verwenden eines Icons
Im Beispiel wird das Icon haus.ico über seinen Alias ZWEITES dem Formular als Icon zugewiesen.
Form1.Icon.LoadFromResourceName(hInstance,'ZWEITES');
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft ein anderes Icon anzeigen.
Verwenden einer Bitmap
Im Beispiel wird die Bitmap Hintergrund.bmp über ihren Alias HINTERGRUNDBMP einem TImage als Bild zugewiesen.
...
var
// deklarieren der Hilfsvariable
Bmp: TBitmap;
begin
...
// erstellt die Hilfsvariable
Bmp := TBitmap.Create;
try
// weist der Hilfsvariablen die Ressource zu
Bmp.LoadFromResourceName(HInstance, 'HINTERGRUNDBMP');
// weist den Inhalt der Hilfsvariablen dem Image zu
Form1.Image1.Picture.Assign(Bmp);
finally
// Freigabe der Hilfsvariable
FreeAndNil(Bmp);
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft ein anderes Bild anzeigen.
Verwenden einer JPG-Datei (selbstdefinierte Resource)
Für die Konstante RT_RCDATA wird die Unit Windows benötigt.
Im Beispiel wird die Datei Hintergrund.jpg über ihren Alias HINTERGRUNDJPG einem TJPEGImage als Bild zugewiesen.
...
uses
Windows, ...
...
var
// deklarieren der Hilfsvariablen
JPGImage: TJPEGImage; // Hilfsvariable 1
RS: TResourceStream; // Hilfsvariable 2
begin
...
// erstellt die Hilfsvariable 1
JPGImage := TJPEGImage.Create;
try
// erstellt die Hilfsvariable 2 und weist ihr die Ressource zu
RS := TResourceStream.Create(hInstance, 'HINTERGRUNDJPG', RT_RCDATA);
try
// weist der Hilfsvariablen 1 den Inhalt der Hilfsvariablen 2 zu
JPGImage.LoadFromStream(RS);
// weist den Inhalt der Hilfsvariablen 1 dem Image zu
Form1.Image1.Picture.Assign(JPGImage);
finally
// Freigabe der Hilfsvariablen 2
FreeAndNil(RS);
end;
finally
// Freigabe der Hilfsvariablen 1
FreeAndNil(JPGImage);
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft ein anderes Bild anzeigen.
Verwenden einer Gif-Datei (selbstdefinierte Resource)
Für die Konstante RT_RCDATA wird die Unit Windows benötigt.
Im Beispiel wird die Datei Hintergrund.jpg über ihren Alias HINTERGRUNDJPG einem TJPEGImage als Bild zugewiesen.
...
uses
Windows, ...
...
var
// deklarieren der Hilfsvariablen
GifImage: TGifImage; // Hilfsvariable 1
RS: TResourceStream; // Hilfsvariable 2
begin
...
// erstellt die Hilfsvariable 1
GifImage := TGifImage.Create;
try
// erstellt die Hilfsvariable 2 und weist ihr die Ressource zu
RS := TResourceStream.Create(hInstance, 'HINTERGRUNDGIF', RT_RCDATA);
try
// weist der Hilfsvariablen 1 den Inhalt der Hilfsvariablen 2 zu
GifImage.LoadFromStream(RS);
// weist den Inhalt der Hilfsvariablen 1 dem Image zu
Form1.Image1.Picture.Assign(GifImage);
finally
// Freigabe der Hilfsvariablen 2
FreeAndNil(RS);
end;
finally
// Freigabe der Hilfsvariablen 1
FreeAndNil(GifImage);
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft ein anderes Bild anzeigen.
Verwenden einer PNG-Datei (selbstdefinierte Resource)
Für die Konstante RT_RCDATA wird die Unit Windows benötigt.
Im Beispiel wird die Datei Hintergrund.jpg über ihren Alias HINTERGRUNDJPG einem TJPEGImage als Bild zugewiesen.
...
uses
Windows, Graphics, Classes, ...
...
var
// deklarieren der Hilfsvariablen
PNGImage: TPicture; // Hilfsvariable 1
RS: TResourceStream; // Hilfsvariable 2
begin
...
// erstellt die Hilfsvariable 1
PNGImage := TPicture.Create;
try
// erstellt die Hilfsvariable 2 und weist ihr die Ressource zu
RS := TResourceStream.Create(hInstance, 'HINTERGRUNDPNG', RT_RCDATA);
try
// weist der Hilfsvariablen 1 den Inhalt der Hilfsvariablen 2 zu
PNGImage.LoadFromStream(RS);
// weist den Inhalt der Hilfsvariablen 1 dem Image zu
Form1.Image1.Picture.Assign(PNGImage);
finally
// Freigabe der Hilfsvariablen 2
FreeAndNil(RS);
end;
finally
// Freigabe der Hilfsvariablen 1
FreeAndNil(PNGImage);
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft ein anderes Bild anzeigen.
Verwenden eines Mauszeigers
...
var
// deklarieren der Hilfsvariable
MausCursor: TCursorImage;
begin
...
// erstellt die Hilfsvariable
MausCursor := TCursorImage.Create;
try
// weist der Hilfsvariablen die Ressource zu
MausCursor.LoadFromResourceName(HInstance, 'FarbCursorNormal');
// weist den Handle der Hilfsvariablen dem Standardcursor zu
Screen.Cursors[1] := MausCursor.ReleaseHandle;
// aktiviert den Standardcursor
Screen.Cursor := 1;
finally
// Freigabe der Hilfsvariable
FreeAndNil(MausCursor);
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft einen anderen Mauszeiger anzeigen.
Verwenden einer Wave-Datei
...
Uses
MMSystem, ...
...
// deklarieren der Variablen
hFind: THandle;
hRes: THandle;
wavLied: PChar;
begin
...
// ermittelt den Zeiger auf die Recource
hFind := FindResource(HInstance, 'TON', 'WAVE');
// prüft, ob die Ressource gefunden wurde
if hFind > 0 then
begin
// lädt die Recource
hRes := LoadResource(HInstance, hFind);
// prüft, ob die WAVE-Ressource geladen wurde
if hRes > 0 then
begin
// sperrt die WAVE-Ressource für andere Unterprogramme
// und weist ihren Inhalt dem Datentyp PChar zu
wavLied := LockResource(hRes);
try
// prüft, ob die WAVE-Ressource zugewiesen wurde
if Assigned(wavLied) then
// spielt die WAVE-Ressource ab
SndPlaySound(wavLied, snd_ASync or snd_Memory);
finally
// entsperrt die WAVE-Ressource
UnlockResource(hRes);
// gibt den Speicher der WAVE-Ressource frei
FreeResource(hRes);
end;
end;
end;
...
end;
Mit dieser Vorgehensweise kann das Programm während der Programmlaufzeit beliebig oft eine andere WAV-Ressource ausführen.