In Ressourcen-Dateien lassen sich bekanntlich Texte, Bitmaps, Icons und Cursor speichern. Das steht zumindest in der Visual Basic Online-Hilfe - und dem ist auch so Über die entsprechenden in VB integrierten Befehle, wie LoadResString und LoadResPicture lassen sich Texte, Icons und Bitmaps auch schnell aus der Ressourcen-Datei auslesen und in der Anwendung verwenden bzw. anzeigen. Was aber, wenn es sich um umfagreiche Texte handelt? Und vielleicht auch noch RTF-formatierten Text? Hmm... Keine Ahnung, werden sich viele jetzt denken. Direkt unterstützt wird diese Art von "Daten" ja nicht Aber keine Bange - hierfür gibt es ja uns Unser heutiger Extra-Tipp entstammte einer Forums-Anfrage, die da lautete: "Ich habe viele RTF-Dokumente, welche ich in einer Ressourcen-Datei speichern möchte. Wie macht man das?" Kurz überlegt - kurz in der MSDN nachgelesen - kein entsprechender Befehl verfügbar - aber: Und genau, mit diesem Befehl wird's auch gemacht! Zunächst muss die Ressourcen-Datei aber erst einmal erstellt werden. Hierzu vergibt man pro Ressource eine eindeutige ID, den Typ der Ressource und den entsprechenden Dateinamen. Also sieht die "rohe" Ressourcen-Datei folgendermassen aus: // RTF-Dokumente 1000 RTF DISCARDABLE "Text1.rtf" // JPG-Bilder 2000 JPG DISCARDABLE "cd.jpg" // GIF-Bilder 3000 GIF DISCARDABLE "logo.gif" Diese Datei wird mit dem "Ressourcen-Compiler" compiliert, um so die compilierte Version (.rc-Datei) dem Projekt hinzufügen zu können (Menü Projekt - Datei hinzufügen). Und hier der Code, um diese "neuen" Arten von Daten aus der Ressourcen-Datei auslesen und anzeigen zu können. RTF-Texte Die LoadResData-Funktion erwartet im ersten Paramter die eindeutige Ressourcen-ID, und im zweiten Parameter den Typ der Ressource. Als Ergebnis liefert die Funktion immer ein Byte-Datenfeld (Array). Das Umwandeln des Byte-Arrays in einen String erfolgt über die StrConv-Funktion. ' RTF-Daten aus der Ressourcen-Datei Public Function LoadRTFFromRes(ByVal ResID As Long) As String Dim bRTF() As Byte Dim strRTF As String ' Ressource lesen: Rückgabe Byte-Array bRTF = LoadResData(ResID, "RTF") ' Umwandeln des ByteArrays in einen String LoadRTFFromRes = StrConv(bRTF(), vbUnicode) End Function Mit nachfolgendem Code lässt sich nun ein RTF-Text aus der Ressourcen-Datei einem RTF-Control zuweisen: RichTextBox1.TextRTF = LoadRTFFromRes(1000) JPG- und GIF-Bilder Das temporäre Zwischenspeichern sollte am besten im TEMP-Verzeichnis von Windows erfolgen. Ebenfalls entscheiden wir uns, den Dateinamen nicht selbst, sondern vom Betriebssystem ermitteln zu lassen. Hierzu benötigen wir folgende API-Deklarationen: ' Temporäre Dateinamen Private Declare Function GetTempFileName Lib "kernel32" _ Alias "GetTempFileNameA" ( _ ByVal lpszPath As String, _ ByVal lpPrefixString As String, _ ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long Private Declare Function GetTempPath Lib "kernel32.dll" _ Alias "GetTempPathA" ( _ ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long Die nachfolgende Funktion speichert ein als Parameter übergebenes Byte-Array in eine temporär erstellte Datei und gibt anschliessend den temporären Dateinamen inkl. Pfadangabe als Rückgabewert zurück. ' Byte-Array temporär speichern ' hierfür wird im TEMP-verzeichnis eine TMP-Datei ' erzeugt, deren Pfad und Namen von der Funktion ' zurückgegeben wird Public Function resSaveDataTemp(ByRef bData() As Byte) As String Dim F As Integer Dim sTempPath As String Dim sTempFile As String Dim lngResult As Long ' Temporäres Verzeichnis ermitteln sTempPath = Space$(256) lngResult = GetTempPath(Len(sTempPath), sTempPath) sTempPath = Left$(sTempPath, lngResult) ' Temporären Dateinamen ermitteln sTempFile = Space$(256) Call GetTempFileName(sTempPath, "~RES", 0&, sTempFile) sTempFile = Left$(sTempFile, InStr(sTempFile, Chr$(0)) - 1) ' Byte-Array in temporäre Datei speichern F = FreeFile Open sTempFile For Binary As #F Put #F, , bData() Close #F ' Pfad+Namen der TEMP-Datei zurückgeben resSaveDataTemp = sTempFile End Function Anzeigen einer JPG-Grafik Dim bJPG() As Byte Dim ResID As Long Dim sTempFile As String ResID = 2000 bJPG = LoadResData(ResID, "JPG") ' Bild temporär speichern sTempFile = resSaveDataTemp(bJPG()) ' Bild anzeigen Set Image1.Picture = LoadPicture(sTempFile) ' Temporäre Bilddatei löschen Kill sTempFile Anzeigen einer GIF-Grafik Dim bGIF() As Byte Dim ResID As Long Dim sTempFile As String ResID = 3000 bGIF = LoadResData(ResID, "GIF") ' Bild temporär speichern sTempFile = resSaveDataTemp(bGIF()) ' Bild anzeigen Set Image2.Picture = LoadPicture(sTempFile) ' Temporäre Bilddatei löschen Kill sTempFile Fazit: |