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 Aufbau einer Ressourcen-Datei // 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 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 Analog verfahren Sie jetz mit der "englischen" Sprach-DLL:
Somit wären unsere beiden Sprach-DLLs erstellt und "einsatzbereit". Fehlt nur noch die Hauptanwendung. Die Hauptanwendung 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. |