Hi DP-ler,
es ist mal wieder soweit, dass ich ein neues FAQ erstellt habe. Dieses Mal geht es darum, neue Resourcen einer Delphi Anwendung hinzuzufügen. Eigentlich recht einfach, meistens jedoch nicht dokumentiert und dadurch etwas schwerer.
Also, am besten mal eine neue Anwedung in Delphi erstellen und probehalber mitmachen.
Folgende Komponenten auf im Designer auf das Form packen (Standardnamen beibehalten!) und das Form unter dem Namen
uSampleForm speichern!
.
Anschließend wählt Ihr im Menü unter
Datei|Neu den Typ
TEXT DATEI aus und speichert die Datei unter dem Namen
SampleRes.rc. RC Dateien sind unkompilierte Resourcedateien (RES). Fügt jetzt die RC Datei dem Projekt hinzu ([SHIFT]+[F11]). Dazu müsst ihr im "Hinzufügen Dialog" die Dateitypenbeschränkung aufheben (Alle Dateien|*.*).
Jetzt fehlt uns nur noch der Code für die RC Datei
Code:
SourceCode RCDATA "uSampleForm.pas"
CALogo BITMAP "CALogo.bmp"
Jede Zeile ist dabei in drei Abschnitte aufgeteilt
- Name der Resource (gleiche Bestimmung wir für Pascal Bezeichner)
- Resource Typ (CURSOR, BITMAP, ICON, MENU, DIALOG, STRING, FONTDIR, FONT, ACCELERATOR, RCDATA, MESSAGETABLE). Weitere sind frei wählbar, werden unter Umständen aber durch andere Programme nicht erkannt
- Datei welche als Resource genutzt wird. Relativer Pfad von der DPR Datei aus betrachtet, in doppelten Anführungszeichen.
RCDATA ist der flexibelste aller Resourcedatentypen und hier genutzt für eine Textdatei.
BITMAP nutze ich hier, um ein Bild als Resource einzubinden.
Hinweis: Delphi überprüft beim Kompilieren nicht, ob sich die Resourcen geändert haben. Wenn die RC Datei nicht geändert wurde, wird diese nur bei "Projekt neu erzeugen" kompiliert.
Das einbinden der Resourcen ist recht einfach. Für die Textdatei habe ich eine einfache Routine erstellt, welcher der Name (case-insensitiv) der Resource übergeben wird. Die Funktion liefert den Inhalt zurück.
Delphi-Quellcode:
function GetStringFromResource(Name: String): String;
begin
with TResourceStream.Create(HInstance, Name, RT_RCDATA) do
try
SetLength(Result, Size);
Read(Result[1], Size);
finally
Free;
end;
end;
Bei erstellen des Forms habe ich jetzt lediglich zwei Zeilen Code, um den Text in das Memo und das BMP ins Image zu laden.
Delphi-Quellcode:
Memo1.Text := GetStringFromResource('SourceCode');
Image1.Picture.Bitmap.LoadFromResourceName(HInstance, 'calogo');
Das wars.
Hier noch ein Beispiel zum Downloaden