vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik:    |   VB-Versionen: VB4, VB5, VB601.12.01
RTF-Docs, JPG und GIF-Files in der Resourcen-Datei

Wie lassen sich RTF-Dokumente, GIF- oder JPG-Bilder in eine Ressourcen-Datei auslagern? Hier die Antwort ;-)

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  1.861 
http://www.tools4vb.de/System:  Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt 

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?
Was weiter, wenn neben Bitmaps und Icons auch GIF- oder JPG-Bilder in der Ressourcen-Datei "abgelegt" werden sollen?

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:
LoadResData. Mit dieser Funktion müsste es doch möglich sein, auch RTF-Texte, GIF/JPG-Bilder oder sonstige Inhalte aus einer Ressourcen-Datei auszulesen.

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
Die Vorgehensweise ist hier zunächst mit der gerade eben bei der RTF-Variante beschriebene Methode identisch. Benötigt wird wiederum die Ressourcen-ID, der Ressourcen-Typ und als Rückgabe erhält man ebenfalls wieder ein Byte-Array. Das Byte-Array muss in diesem Fall jedoch temporär in eine Datei gespeichert werden, um so die GIF- oder JPG-Grafik per LoadPicture-Anweisung anzeigen zu können.

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:
Das Speichern von nicht direkt in VB unterstützten Ressourcen-Daten ist eigentlich kein grosses Problem. Das schwierigere ist wahrscheinlich das korrekte Umwandeln des Byte-Arrays in den geforderten Datentyp. Die obigen Beispiele sollten Ihnen hierbei aber schon einmal helfen.