Wie embed Icons, Cursor, animierte Cursor, Bitmaps, JPEG-Bilder, Wave-Dateien, Textdateien und anderen Dateien in einem ausführbaren Delphi.


Einbinden von Dateien als Ressourcen in einer ausführbaren Delphi


Es ist möglich, embed jede Art von Datei in eine ausführbare Datei mit Ressource-Dateien (*. RES). Bestimmte Arten von Ressourcen, werden durch die API und können direkt verwendet werden. Andere sind einfach nur als Binär-Daten und die an Ihnen, sie zu nutzen. In diesem Artikel werden wir sehen, Beispiele für beide Arten.

So erstellen Sie die Ressource-Datei beginnen wir mit der Source-Datei (*. RC), zum Beispiel den Namen RESOURCES.RC, das ist eine einfache Textdatei, in dem sich die Ressource-Einträge (Name, Klasse und-Datei):

   sample_bmp   BITMAP     sample.bmp 
  sample_ico ICON sample.ico
  sample_cur CURSOR sample.cur
  sample_ani ANICURSOR sample.ani
  sample_jpg JPEG sample.jpg
sample_wav WAVE sample.wav
sample_txt TEXT beispiel.txt


Die Namen der Ressourcen (sample_bmp, sample_ico, etc.) sind willkürlich. Die Art der Ressource kann eine Anerkennung durch die APIs (Bitmap, Icon, Cursor) oder willkürlich (JPEG, WAVE, Text). Die Dateinamen angeben, die Dateien, die in der. RES-Datei (und später in die. EXE).

Jetzt haben wir die zur Erstellung des. RC-Datei, um die. RES-Datei. Aus diesem können wir die Borland Resource Compiler (brcc32.exe), dass man wohl in der Delphi-Ordner "Bin". Es ist ein einfaches Befehlszeilen-Dienstprogramm, das erwartet, dass die Namen der Quell-Datei als Parameter:

   C:\DELPHI\P0025>brcc32 resources 
  Borland Resource Compiler Version 5.40
  Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved.

C: \ Delphi \ P0025> _


Linker, die die Einbettung der Ressource-Datei in die ausführbare Datei, verwenden wir die Ressource-Datei Richtlinie (R $ oder $ RESOURCE) in unserem Pascal Quelle-Code:

   {$R resources.res} 


Lade die Ressourcen in Ihrer Anwendung ist einfach für die "erkennen" Ressourcen wie Bitmap, ICON und CURSOR, da die Windows-API-Funktionen (LoadBitmap, LoadIcon und LoadCursor bzw.), um die Griffe für diese Elemente, zum Beispiel, dass wir können, um den Griff Eigentum der entsprechenden Objekt:

     Image1.Picture.Bitmap.Handle := 
      LoadBitmap(hInstance, 'sample_bmp');
Icon.Handle: = LoadIcon (hInstance, 'sample_ico');
Screen.Cursors [1]: = LoadCursor (hInstance, 'sample_cur');


Für weitere Alternativen beim Laden Bildmaterial finden Sie in der API LoadImage.

Weitere Ressourcen sind etwas schwieriger zu handhaben. Beginnen wir mit JPEG-Bildern. Die folgende Funktion verwendet TResourceStream, um die Ressource als Stream, die geladen werden zu einem Objekt TJPEGImage:

Stream.Free; 
end;
end;


Beispiel:

   var 
    Jpg: TJPEGImage;
  begin
    // ...
    Jpg := GetResourceAsJpeg('sample_jpg');
    Image2.Picture.Bitmap.Assign(Jpg);
    Jpg.Free;
    // ...
  end;


Bei WAV-Dateien müssen wir einen Verweis auf die Ressource in den Speicher geladen, und für eine Text-Datei benötigen wir, um eine Ressource in einen String. Wir können es mit TResourceStream, aber lassen Sie uns ein Beispiel mit Hilfe der API:

   function GetResourceAsPointer(ResName: pchar; ResType: pchar; 
die Größe: LongWord): pointer;
var
InfoBlock: HRSRC;
GlobalMemoryBlock: HGLOBAL;
beginnen
InfoBlock: = FindResource (hInstance, resname, restype);
wenn InfoBlock = 0, dann
erhöhen Exception.Create (SysErrorMessage (GetLastError));
Größe: = SizeofResource (hInstance, InfoBlock);
wenn size = 0 then
erhöhen Exception.Create (SysErrorMessage (GetLastError));
GlobalMemoryBlock: = LoadResource (hInstance, InfoBlock);
wenn GlobalMemoryBlock = 0, dann
erhöhen Exception.Create (SysErrorMessage (GetLastError));
Result: = LockResource (GlobalMemoryBlock);
Ergebnis = Null, wenn dann
erhöhen Exception.Create (SysErrorMessage (GetLastError));
end;

Funktion GetResourceAsString (ResName: PChar; ResType: PChar): string;
var
ResData: PChar;
ResSize: LongWord;
beginnen
ResData: = GetResourceAsPointer (resname, restype, ResSize);
SetString (Result, ResData, ResSize);
end;


Beispiel fordert:

   var 
    sample_wav: pointer;

  procedure TForm1.FormCreate(Sender: TObject);
  var
    size: longword;
  begin

...
sample_wav: = GetResourceAsPointer ( 'sample_wav "," Welle ", size);
Memo1.Lines.Text: = GetResourceAsString ( 'sample_txt', 'text');
end;


Nachdem wir die Wellen-Ressource in den Speicher geladen, können wir spielen es so oft wie wir wollen, dass durch die Verwendung der API sndPlaySound erklärt in der MMSystem Einheit:

   procedure TForm1.Button1Click(Sender: TObject); 
  begin

sndPlaySound (sample_wav, SND_MEMORY oder SND_NODEFAULT oder SND_ASYNC);
end;


Es gibt einige Mittel (wie zB Schriften und animierte Cursors), die nicht verwendet werden, aus dem Speicher. Wir müssen unbedingt, um diese Ressourcen zu einem temporären Festplatte Datei und laden Sie sie von dort aus. Die folgende Funktion speichert eine Ressource in einer Datei:

   procedure SaveResourceAsFile(const ResName: string; ResType: pchar; 
const FileName: string);
beginnen
mit TResourceStream.Create (hInstance, ResName, ResType) do
versuchen
SaveToFile (FileName);
Schließlich
Free;
end;
end;


Die folgende Funktion nutzt die vorherige, um eine Ressource in eine temporäre Datei:

   function SaveResourceAsTempFile(const ResName: string; 
    ResType: pchar): string;
  begin
    Result := CreateTempFile;
    SaveResourceAsFile(ResName, ResType, Result);
  end;


Die Diskussion über die Funktion CreateTempFile fällt würde den Rahmen dieses Artikels und seine Umsetzung kann man in dem Beispiel mit dem Newsletter.

Die folgende Funktion nutzt SaveResourceAsTempFile, um einen animierten Cursor-Ressource in eine temporäre Datei, dann lädt Sie den Cursor aus der Datei mit LoadImage und schließlich löscht die temporäre Datei. Die Funktion gibt das Handle zurück LoadImage:

Funktion GetResourceAsAniCursor (const ResName: string): HCursor; 
var
CursorFile: string;
beginnen
CursorFile: = SaveResourceAsTempFile (ResName, "ANICURSOR ');
Result: = LoadImage (0, PChar (CursorFile), IMAGE_CURSOR, 0,
0, LR_DEFAULTSIZE oder LR_LOADFROMFILE);
DeleteFile (CursorFile);
wenn Ergebnis = 0 then
erhöhen Exception.Create (SysErrorMessage (GetLastError));
end;


Beispiel nennen:

Screen.Cursors [1]: = GetResourceAsAniCursor ( 'sample_ani'); 
Form1.Cursor: = 1;


Nun, das war's. Ich hoffe, Sie finden es nützlich. Weitere Informationen finden Sie über die Ressource-Dateien in der MSDN-Bibliothek:

http://msdn.microsoft.com/library/en-us/winui/hh/winui/rc_6cs3.asp

Sie finden den vollständigen Quellcode dieser Artikel in derArchiv, welches mit dem Pascal-Newsletter # 25.

Average rating: