Home » Tipps & Tricks » Sonstiges » Sonstiges » Ressourcen erstellen

Ressourcen erstellen

Fast jedes Delphi-Programm, das ein Formular besitzt, benutzt Ressourcen, nur merkt der Programmierer oft nichts davon.Jedes verwendete Bitmap, das zur Entwurfszeit z.B. einem TImage zugewiesen wurde, speichert Delphi in der Ressourcen-Datei des jeweiligen Formulars. Diese Resourcen-Datei trägt den gleichen Namen wie das Projekt und wird automatisch erzeugt.Die Formular-Datei ist auch nur eine Ressource mit der Endung .dfm. Sie wird über

{$R *.dfm}

in die Unit eingebunden.Nun werden Sie sich fragen, für was Ressourcen selbst erstellen, wenn Delphi das alles selber macht?Wenn Sie die Bitmaps, Cursor, Wavefiles, usw.. in einer Ressource speichern, werden sie von Linker in die Exe-Compiliert und müssen nicht extra mit dem Programm ausgeliefert werden.Außerdem können sie nicht so einfach bearbeiten werden, und natürlich auch nicht gelöscht, womit Sie sich ein entsprechendes Fehler-Handling ersparen können.Ressourcen sollten auch verwendet werden, wenn ein Programm in mehrere Sprachen übersetzt werden soll. Sie speichern die Strings einfach in der Ressource. Beim Übersetzten in eine andere Sprache muss nun kein Quelltext geändert und kompiliert werden, sondern nur die Ressource.In Delphi 6 gibt es dazu übrigens den External Translation Manager, der einen ähnlichen Weg geht.Zum Erstellen von Ressourcen verwenden Sie am besten den Ressource-Workshop, der mit Delphi ausgeliefert ist.Die Bedienung erklärt sich von selbst. Über File/New Project erstellen Sie eine neue .Res Datei.Dieser können Sie dann über File/Add to Project neue Elemente hinzufügen.Sie sollten Ihren Elementen auch einen aussagekräftigen Namen geben (Rechtsklick, Rename).Ich werde Ihnen nun zeigen, wie Sie die Ressourcen in Delphi verwenden können.Binden Sie zuerst die Ressourcen-Datei ein:

{$R test.res}

Die Datei test.res muss im Projekt-Verzeichnis liegen!Um nun z.B. ein Bitmap aus der Ressource in Image1 anzuzeigen, verwenden Sie die Funktion LoadBitmap, die ein Handle zurückgibt:

Image1.picture.bitmap.handle := LoadBitMap(HInstance, 'MyBitmap');

Die Funktion benötigt den Namen der Ressource und als ersten Parameter das Windows-Handle zur Ressource im Speicher. Dieses stellt HInstance dar.Wenn Sie andere Ressourcen laden wollen, können Sie natürlich nicht LoadBitMap verwenden.Es gibt für jede Ressource eine eigene Funktion.So laden Sie z.B. einen eigenen Cursor:Deklarieren sie zuerst eine Konstante für den eignenen Cursor, 4711 ist willkürlich gewählt.

Const
  crMyCursor = 4711;

Dann laden sie den Cursor aus der Ressource:

 Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'Cursor_1');
 screen.cursor:=crMyCursor;

Nun müssen Sie ihn nur noch anzeigen:

 Screen.Cursor := crMyCursor;

Für mehrsprachige Programme fügen Sie mit dem Workshop eine String-Tabelle in Ihre Ressource ein. Vergeben Sie an jeden String eine eindeutige ID. Und so können Sie die Texte laden:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Button1.Text:=LoadStr(1001);  //Hier wird der String mit der ID 1001 geladen.  
end;

Etwas komplizierter wird es, wenn der Anwender die Sprache zur Laufzeit auswählen können soll. In diesem Fall schreiben Sie die Strings für alle Sprachen in eine Ressource und vergeben für jede Sprache einen Tausender Wert, z.B. Deutsch=1001+, Englisch=2001+, usw…Die Strings können Sie dann so ohne großen Aufwand laden:

var
 AddToId: integer

begin
  case sprache of
    0: AddtoId:=1000;  //Deutsch
    1: AddToId:=2000;  //Englisch
    2: AddtoId:=2000;  //meinetwegen Spanisch
  end;

  Button1.Caption:=LoadStr(AddtoId+1);
  Button2.Caption:=LoadStr(AddtoId+2);
  (*...*)
  Button3.Caption:=LoadStr(AddtoId+23);
end;