Ressourcefile/de

From Lazarus wiki
Jump to navigationJump to search
Windows logo - 2012.svg

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.