vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 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.10.01
Ressourcen in DLLs auslagern

Erstellen einer mehrsprachigen Anwendung unter Verwendung verschiedener eigens erstellter Sprach-DLLs (ActiveX-DLLs).

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

Wie schafft man es eine eigene "mehrsprachige Anwendung" zu erstellen, ohne dass alle Texte, Bilder usw. doppelt und dreifach in der kompilierten EXE-Datei vorhanden sein müssen?

Am einfachsten mit unterschiedlichen Ressourcen-Dateien. Leider lässt sich pro Anwendung aber nur eine einzige RES-Datei hinzufügen. Also doch alle Texte in einer einzigen RES-Datei speichern - NEIN!

Warum nicht für jede Sprache eine eigene Resourcen-Datei erstellen und diese wiederum nicht in die EXE selbst, sondern in eine DLL-Datei auslagern? Die DLL wird dann wiederum nicht direkt als Verweis in die Anwendung eingebunden, sondern bei Bedarf ganz gezielt "angesprochen". Somit wird erreicht, dass sich JEDERZEIT die gerade "gewünschte" Sprache einstellen lässt - und wenn man will sogar während der Laufzeit wechseln lässt.

Das hört sich gut an; besser noch - das ist es!!!

Was ist eine Ressourcen-Datei
Unter Ressourcen versteht man Programmelemente, die nicht direkt in Verbindung mit dem Programmcode bzw. der Programmlogik stehen. Beispiele hierfür sind Texte, Menüs, Sounds oder auch Bilder, welche Sie zwar in Ihrem Programm benutzen, sich aber nicht direkt auf den Programmablauf auswirken - sozusagen vorhanden sind, um mit dem Anwender zu interagieren.

Aufbau einer Ressourcen-Datei
Ressourcen-Datei lassen sich mit einem beliebigen Editor erstellen, also auch mit dem Windows-Editor. Diese Datei (auch Ressourcen-Skript genannt) wird mit Hilfe des Ressourcen-Compiler zu einer Ressourcen-Datei (.RES) erstellt. Der Ressourcen-Compiler ist Bestandteil von Visual Basic - muss jedoch ggf. manuell installiert (kopiert) werden. Sie finden diesen im Verzeichnis \COMMON\TOOLS\VB\RESOURCE auf der Visual Basic CD (VB6).

Beispiel für eine Ressourcen-Datei
Jede Ressource wird innerhalb der Definitionsdatei (Skript) durch eine eindeutige Zahl (ID) gekennzeichnet. Man spricht hier auch von Resourcen-IDs. Über diese ID lässt sich dann gezielt in der eigenen Anwendung auf die Ressource zugreifen. Ressourcen-Dateien sind folgendermassen aufgebaut:

// String Table (Texte)
STRINGTABLE DISCARDABLE
BEGIN
    1000     "Herzlich Willkommen"
    1010     "Beenden"
    9000     "Wirklich beenden?"
END
 
// BITMAPS
3000 ICON myBitmap.bmp
 
// ICONS
5000 ICON myIcon.ico

Da es jedoch nicht Ziel unseres Extra-Tipps ist, den Aufbau einer Ressourcen-Datei zu erläutern, sondern vielmehr, wie sich Ressourcen zur Laufzeit dynamisch aus DLL-Dateien laden lassen, möchten wir die Erläuterungen zu Ressourcen-Dateien hiermit auch beenden.

Sprach-DLLs erstellen
Beginnen wir zunächst mit dem Erstellen der Sprach-DLLs. Starten Sie hierzu die Visual Basic Entwicklungsumgebung und wählen "Neues Projekt" - ActiveX-DLL. Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf Projekt1 und wählen den Befehl "Eigenschaften von Projekt1". Tragen Sie in die Eingabezeile "Projektname" MyAppGermanDLL ein und beenden den Dialog mit OK. Klicken Sie anschließend mit der rechten Maustaste auf Class1 (wiederum im Projekt-Explorer) und wählen den Befehl "Eigenschaften". Tragen Sie im "Eigenschaften-Dialog" in der Zeile "(Name)" LanguageRes ein.

Doppelklicken Sie im Projekt-Explorer auf LanguageRes und fügen nachfolgenden Quellcode ein:

Option Explicit
 
Public Function LoadText(ByVal ResID As Long) As String
  ' Text aus der Ressourcen-Datei laden
  LoadText = LoadResString(ResID)
End Function
 
Public Function LoadPicture(ByVal ResID As Long) As Picture
  ' Bitmap-Bild aus Ressourcen-Datei laden
  Set LoadPicture = LoadResPicture(ResID, 0)
End Function
 
Public Function LoadIcon(ByVal ResID As Long) As Picture
  ' ICON aus Ressourcen-Datei laden
  Set LoadIcon = LoadResPicture(ResID, 1)
End Function
 
Public Function LoadCursor(ByVal ResID As Long) As Picture
  ' Cursor aus Ressource-Datei laden
  Set LoadCursor = LoadResPicture(ResID, 2)
End Function

Mehr Codezeilen benötigt unsere Sparach-DLL nicht. Über diese öffentlichen Funktionen kann dann später in der Hauptanwendung auf die einzelnen Ressourcen zugegriffen werden.

Speichern Sie nun das Projekt unter den Namen GermanDLL.vbp - es handelt sich hierbei um die Sprach-DLL für "Deutsch". Nun brauchen wir noch eine englische Sprach-DLL. Wählen Sie im Menü "Datei" den Befehl Neues Projekt und dann ActiveX-DLL. Klicken Sie im Projekt-Explorer auf Projekt1, wählen "Eigenschaften von Projekt1" und geben als neuen Projektnamen MyAppEnglischDLL an. Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf Class1 und geben für "(Name)" LanguageRes ein. Fügen Sie ebenfalls wieder den gesamten oben abgedruckten Code in das Klassenmodul, wählen dann den Befehl Datei -Projekt speichern und geben als neuen Projektnamen EnglischDLL ein.

Jetzt benötigen wir ja noch die Ressourcen-Dateien selbst. Für unser Beispiel erstellen wir eine ganz einfache Ressourcen-Datei. Öffnen Sie hierzu den Windows-Editor und geben folgende Zeilen ein:

// String Table: Deutsch
STRINGTABLE DISCARDABLE
BEGIN
    1000     "Herzlich Willkommen"
    1010     "Beenden"
    9000     "Wirklich beenden?"
END
 
// ICONS
5000 ICON FLGGERM.ICO

Speichern Sie die Datei unter dem Namen GERMAN.RC ab. Nun fehlt noch die englische Ressourcen-Datei. Also wieder den Windows-Editor starten und folgende Zeilen einfügen:

// String Table: Englisch
STRINGTABLE DISCARDABLE
BEGIN
    1000     "Welcome"
    1010     "Exit"
    9000     "Are you sure?"
END
 
// ICONS
5000 ICON FLGUSA02.ico

Speichern Sie die Datei unter dem Namen ENGLISCH.RC ab. Bevor Sie nun die beiden Ressourcen-Dateien mit dem Ressourcen-Compiler erstellen, müssen Sie noch die beiden angegebenen Icons (FLGGERM.ICO und FLGUSA02.ICO) in das Projektverzeichnis kopieren. Die beiden Icons finden Sie in der "Icon-Gallerie", welche bei der Installation von Visual Basic in aller Regel mit-installiert wurden. Die beiden eben erstellten Skript-Dateien kompilieren Sie nun mit dem Ressourcen-Compiler (RC.EXE).

Hinzufügen der Ressourcen-Dateien zu den Sprach-DLLs
Wechseln Sie wieder in die VB-Entwicklungsumgebung und laden zunächst die "deutsche" Sprach-DLL (GermanDLL.vbp). Wählen Sie aus dem Menü "Projekt" den Befehl "Datei hinzufügen" und fügen so die Datei GERMAN.RC hinzu. Wählen Sie aus dem Menü "Datei" den Befehl GermanDLL.dll erstellen, geben aber im sich öffnenden Dateidialog die Bezeichnung german.dll ein und klicken dann auf OK, um die DLL zu erstellen.

Analog verfahren Sie jetz mit der "englischen" Sprach-DLL:

  1. Projekt "EnglischDLL.vbp" laden
  2. Hinzufügen der Datei ENGLISCH.RC
  3. Kompilieren als englisch.dll

Somit wären unsere beiden Sprach-DLLs erstellt und "einsatzbereit". Fehlt nur noch die Hauptanwendung.

Die Hauptanwendung
Starten Sie die VB Entwicklungsumgebung und erstellen ein neues Projekt "Standard EXE". Fügen Sie der "Form1" zwei Optionsfelder (Option1 und Option2) mit den Bezeichnungen "Deutsch" und "Englisch", darunter ein Label-Element (Label1), darunter eine ImageBox (Image1) in der Größe 480x480 Twips und abschliessend noch einen CommandButton (Command1) hinzu.

Im Allgemein-Teil der Form1 benötigen wir folgenden Code:

' Aktuelle Sprachauswahl
Dim iLanguage As Integer
 
' Verweis auf aktuelle Sprach-DLL
Dim lngDLL As Object
 
' Ressourcen-IDs
Const RES_TEXT_WILLKOMMEN = 1000
Const RES_TEXT_BEENDEN = 1010
Const RES_MSG_EXIT = 9000
Const RES_ICON_FLAGGE = 5000

Beim Laden der Form, soll "Deutsch" als Standard-Vorgabe gewählt werden, also:

Private Sub Form_Load()
  ' Standard-Vorgabe: Deutsch
  Option1.Value = True
End Sub

Beim Ändern der Sprach-Auswahl (Optionsfelder) müssen die Ressourcen ja aus den entsprechende Sprach-DLLs geladen und angezeigt werden. Hierbei wird ein dynamischer Verweis auf die entsprechende Sprach-DLL erstellt - also nicht wie sonst üblich über Projekt - Verweise. Dies hat den Vorteil, dass Sie Ihre Anwendung jederzeit mit weiteren Sprach-DLLs austatten können, ohne die Anwendung selbst neu erstellen bzw. kompilieren zu müssen.

' Sprache: Deutsch
Private Sub Option1_Click()
  iLanguage = 0
  InitRessources
End Sub
 
' Sprache: Englisch
Private Sub Option2_Click()
  iLanguage = 1
  InitRessources
End Sub
 
' Ressourcen aus Sprach-DLL laden und anzeigen
Private Sub InitRessources()
  Dim clsName As String
 
  ' Projekt+Klassennamen der Sprach-DLL
  If iLanguage = 0 Then
    ' Deutsch
    clsName = "MyAppGermanDLL"
  Else
    ' Englisch
    clsName = "MyAppEnglischDLL"
  End If
 
  clsName = clsName & ".LanguageRes"
 
  ' Ggf. bisherigen Verweis zurücksetzen
  Set lngDLL = Nothing
 
  ' Verweis auf Sprach-DLL
  Set lngDLL = CreateObject(clsName)
  With lngDLL
    Label2.Caption = .LoadText(RES_TEXT_WILLKOMMEN)
    cmdExit.Caption = .LoadText(RES_TEXT_BEENDEN)
    Image1.Picture = .LoadIcon(RES_ICON_FLAGGE)
  End With
End Sub

Beim Klicken auf den CommandButton soll nun noch eine sprachabhängige Meldung erscheinen, in der Art: "Wirklich beenden?". Auch diese "Ressource" ist ja in der Ressourcen-Datei gespeichert, also:

Private Sub Command1_Click()
  ' Frage, ob wirklich beenden
  If MsgBox(lngDLL.LoadText(RES_MSG_EXIT), 292) = vbYes Then
    Unload Me
    End
  End If
End Sub

Und beim Beenden der Anwendung, sollte der Verweis auf die aktuelle Sprach-DLL entfernt werden:

Private Sub Form_Unload(Cancel As Integer)
  ' Verweis auf Sprach-DLL entfernen
  Set lngDLL = Nothing
End Sub

Das war dann auch schon alles. Neue Sprach-DLLs lassen sich nun jederzeit erstellen bzw. vorhandene entsprechend erweitern.