Unicode allgemein
Dieses Kapitel enthält eine Sammlung von VB6 Unicode Funktionen für die allgemeine Programmerstellung und die Programmoberfläche (GUI - Graphics User Interface). VB6 unterstützt zwar von Hause aus Unicode in Strings und String-Funktionen (Left$, Right$, Mid$, InStr, StrConv,etc.), nicht aber in den VBA Funktionen wie Command$ oder MsgBox.
Um die Unicode Implementierung so einfach wie möglich zu gestalten haben einige Funktionen den gleichen Namen, wie das VBA Original. Diese Funktionen sind im Titel mit "(VBA-Overwrite)" gekennzeichnet! Wenn Sie also die hier beschriebenen Funktionen in Ihren Code einfügen, so werden durch diese Technik die VBA Funktionen gewissermaßen überschrieben; d.h.:
Ihr Code muss nicht verändert werden und unterstützt ab sofort Unicode!
Übersicht
Vorbedingungen
Viele der folgenden Beispiele benutzen die globale, boolsche Variable isUnicode, sowie die Compiler Konstante #ANSISupport.
Beide sind in den folgenden Beispielen aus Platzgründen nicht enthalten und werden deshalb hier zentral beschrieben:
- Compiler Konstante #ANSISupport
hiermit wird projektweit entschieden, ob Ihre Anwendung auch auf Systmen vor Windows 2000 laufen soll (#ANSISupport <> 0).
Um die ANSI Unterstützung zu aktivieren gehen Sie folgendermaßen vor:
rufen Sie in der IDE den Dialog der Projekteigenschaften auf (Menü: "Projekt" -> "Eigenschaften von [Projektname]...")
Wechseln Sie auf die Registerkarte "Erstellen"
Geben Sie in das Feld "Argumente für bedingte Kompilierung" folgenden Text ein: ANSISupport = 1 - Globale Variable isUnicode
Wenn die Compiler Konstate #ANSISupport <> 0 ist: dann wird die ANSI Variante auf Nicht-NT-System benutzt,
anderenfalls die UNICODE Variante.
Deshalb muss diese Variable in einem Modul angelegt werden und über folgende Funktion vor allen weiteren Aufrufen initialisiert werden:
Option Explicit Public isUnicode As Boolean ' Deklaration: Private Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Long ' Typendefinition: Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Private Const VER_PLATFORM_WIN32_NT = 2 ' Funktion: ' Prüft auf NT-Betriebssysteme: True ab Windows NT/2000 und neuer, sonst False Public Function isSystemNT() As Boolean Dim info As OSVERSIONINFO info.dwOSVersionInfoSize = Len(info) GetVersionExA info isSystemNT = (info.dwPlatformId = VER_PLATFORM_WIN32_NT) End Function ' Initialisierungs-Aufruf: isUnicode = isSystemNT()
Übrigens: wenn Sie die Beispiele nicht einzelnd kopieren möchten, können Sie auch das fertige Modul vbzGlobal.bas herunterladen.
Darin ist (fast) alles enthalten, was hier zu finden ist. Benutzen Sie diese Tipp-Seite dann einfach als erweiterte Dokumentation...
0001 Command$ (VBA-Overwrite)
Arbeitet Ihr Programm mit Parameterübergabe, so ist die Auswertung der VBA Funktion Command$ wohl der erste Schritt in Ihrem Programmcode. Diese Funktion unterstützt leider kein Unicode, also werden wir sie überschreiben und um Unicode erweitern, denn Microsoft hält für uns VB-ler auch hier wieder die API-Lösung bereit:
' Context.Scope.Library command line parameters Private Declare Function GetCommandLineW Lib "kernel32" () As Long Private Declare Function PathGetArgsW Lib "shlwapi" (ByVal pszPath As Long) As Long Private Declare Function SysReAllocString Lib "oleaut32" (ByVal pbString As Long, _ ByVal pszStrPtr As Long) As Long Public Function command() As String If isSystemNT And Not isIDE Then SysReAllocString VarPtr(command), PathGetArgsW(GetCommandLineW) Else command = VBA.command$ End If End Function Public Function isIDE() As Boolean isIDE = (App.LogMode = 0) End Function
| |
Autor: ralf schlegel |
0002 Form-Caption - Unicode in der Titelzeile
Benutzen Sie diese Funktion, um in der Titelleiste eines Fensters oder Dialogs Unicodetext anzuzeigen. Der Funktion übergeben Sie das Handle der Form, sowie den gewünschten Text.
Private Declare Function SetWindowTextA Lib "user32" (ByVal hWnd As Long, _ ByVal lpString As String) As Long Private Declare Function DefWindowProcW Lib "user32" (ByVal hWnd As Long, _ ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Const WM_SETTEXT = &HC& Public Sub formCaption(ByRef hWnd As Long, ByVal UniCaption As String) #If ANSISupport Then If isUnicode Then ' if Unicode is available... DefWindowProcW hWnd, WM_SETTEXT, ByVal &H0&, ByVal StrPtr(UniCaption) Else ' no Unicode for us SetWindowTextA hWnd, UniCaption End If #Else DefWindowProcW hWnd, WM_SETTEXT, ByVal &H0&, ByVal StrPtr(UniCaption) #End If End Sub | |
Autor: ralf schlegel |
0003 isUnicodeString vs Microsofts "IsTextUnicode"
Bevor wir einen String weiterverarbeiten ist es manchmal erforderlich zu wissen, ob er Unicode Zeichen enthält oder nicht. Microsoft bietet dafür die API Funktion IsTextUnicode, die noch so einiges mehr kann, räumt aber gleichzeitig ein, dass diese Funktion "nicht sicher" ist und auch Fehlinterpretationen möglich sind. Eine sehr einfache Alternative stellt die unten beschriebene Funktion isUnicodeString dar: wir wissen, dass VB intern alle Strings im Unicodeformat speichert. Handelt es sich dennoch um reinen ANSI Code, so ist jedes 2. Byte im String "0". Diese Tatsache machen wir uns zu nutze... ' tests, if a string contains unicode chars Public Function isUnicodeString(ByVal uString As String) As Boolean Dim i As Long Dim b() As Byte If LenB(uString) Then b = uString For i = 1 To UBound(b) Step 2 ' check every 2nd byte If b(i) Then ' if not 0... isUnicodeString = True ' ... must be unicode Exit Function ' do not test anymore End If Next End If End Function | |
Autor: ralf schlegel |