Addin-Programmierung - Seite 5
von Frank Schüler
Manipulieren von Objekten
Fast alle Objekte in der VBIDE lassen sich auf irgend eine Weise manipulieren. Man kann Fenster der VB-Entwicklungsumgebung öffnen, schließen und die Position und Größe ändern. Man kann VB-Fenster einem Frame hinzufügen oder entfernen. Man kann den Status von Buttons in einer Toolbar auslesen, setzen und Befehle ausführen. Man kann Projekte, Komponenten und Controls hinzufügen, entfernen und deren Eigenschaften verändern. Eigentlich ist alles das möglich, was man mit der VB-Entwicklungsumgebung auch machen kann. Hier ein Beispiel, wie Controls zu einer Komponente hinzugefügt und entfernt werden können.
Private Sub Command4_Click() ' Bei Fehler zur Fehlerbehandlung On Error Goto error_handler Dim VBF As VBForm Dim VBCtrl As VBControl Dim VBCtrl2 As VBControl Set VBF = VBInstance.SelectedVBComponent.Designer ' neues Control hinzufügen MsgBox "Ein neues Control hinzufügen" Set VBCtrl = VBF.VBControls.Add("VB.CommandButton") ' Control löschen MsgBox "Neues Control löschen" VBF.VBControls.Remove VBCtrl ' vorhandenes Control kopieren und einfügen MsgBox "Vorhandenes Control kopieren und einfügen" Set VBCtrl = VBF.VBControls.Item("Text1") Set VBCtrl2 = VBF.VBControls.Add(VBCtrl.ProgId) ' Control löschen MsgBox "Control löschen" VBF.VBControls.Remove VBCtrl2 Set VBF = Nothing Set VBCtrl = Nothing Set VBCtrl2 = Nothing ' Wenn alles ok, dann Methode verlassen Exit Sub ' Fehlerbehandlung error_handler: ' Fehler anzeigen MsgBox Err.Description End Sub
Und noch ein Beispiel zum Manipulieren von Eigenschaften.
Private Sub Command5_Click() ' Bei Fehler zur Fehlerbehandlung On Error Goto error_handler Dim VBComp As VBComponent Dim VBF As VBForm Dim VBCtrl As VBControl Set VBComp = VBInstance.SelectedVBComponent Set VBF = VBComp.Designer Set VBCtrl = VBF.VBControls.Item("Text1") ' Designerfenster öffnen VBComp.DesignerWindow.Visible = True DoEvents ' ändern der Eigenschaft "Name" MsgBox "ändern der Eigenschaft: Name" VBComp.Properties("Name") = "NewName" ' ändern der Eigenschaft "Caption" MsgBox "ändern der Eigenschaft: Caption" VBComp.Properties("Caption") = "NewCaption" ' Diverse Eigenschaften der TextBox ändern MsgBox "Diverse Eigenschaften der TextBox ändern" VBCtrl.Properties("MultiLine") = "True" VBCtrl.Properties("Width") = "3000" VBCtrl.Properties("Height") = "2000" VBCtrl.Properties("ScrollBars") = "3" VBCtrl.Properties("Text") = "Neuer Text in der Textbox" Set VBComp = Nothing Set VBF = Nothing Set VBCtrl = Nothing ' Wenn alles ok, dann Methode verlassen Exit Sub ' Fehlerbehandlung error_handler: ' Fehler anzeigen MsgBox Err.Description End Sub
Das Manipulieren der CommandBars in der VB-Entwicklungsumgebung gestaltet sich etwas schwieriger da hier auf die Sprachversion von VB geachtet werden muss. Um ein bestimmtes Menü anzusprechen, muss man entweder den Index des Menüs kennen (dieser könnte sich aber ändern) oder man spricht das Menü über seinen Namen an und da liegt das Problem. Das Menü zum Starten eines Projektes (F5) heißt in der deutschen Version "Ausführen" und in der englischen Version "Run". Ebenso verhält es sich mit den Buttons in einem Menü. Hier ein Beispiel dazu.
Private Sub Command6_Click() ' Bei Fehler zur Fehlerbehandlung On Error Goto error_handler ' für engliche VB-Version ' IDE in den RunModus (F5) MsgBox "IDE in den RunModus (F5)" VBInstance.CommandBars("Run").Controls("Start").Execute DoEvents ' RunModus unterbrechen (Ctrl+Break) MsgBox "RunModus unterbrechen (Ctrl+Break)" VBInstance.CommandBars("Run").Controls("Break").Execute DoEvents ' RunModus nach Unterbrechung fortsetzen MsgBox "RunModus nach Unterbrechung fortsetzen" VBInstance.CommandBars("Run").Controls("Continue").Execute DoEvents ' IDE in den DesignModus MsgBox "RunModus beenden" VBInstance.CommandBars("Run").Controls("End").Execute DoEvents ' für deutsche VB-Version 'VBInstance.CommandBars("Ausführen").Controls("Starten").Execute 'VBInstance.CommandBars("Ausführen").Controls("Unterbrechen").Execute 'VBInstance.CommandBars("Ausführen").Controls("Fortsetzen").Execute 'VBInstance.CommandBars("Ausführen").Controls("Beenden").Execute ' Wenn alles ok, dann Methode verlassen Exit Sub ' Fehlerbehandlung error_handler: ' Fehler anzeigen MsgBox Err.Description End Sub
Wie aber nun herausfinden, unter welcher VB-Sprachversion das AddIn läuft oder wisst Ihr, wie die Menüs in französischer Sprache lauten? Der einfachste Weg ist wohl hier die entsprechende String-Ressourcen aus der VBxIDE.DLL auszulesen. Benötigt wird hier ein Zusatzprogramm (z.B. ResHacker) um die benötigten Ressourcennummern in der DLL zu finden. Hier ein Beispiel, wie man das Auslesen der Ressourcen realisieren kann.
' Code in der Form Private Sub Command7_Click() ' Bei Fehler zur Fehlerbehandlung On Error Goto error_handler ' Menünamen aus Ressource auslesen GetResStrings VBInstance.FullName Label1.Caption = "RunMenü Name: " & RunMenuName Label2.Caption = "RunMenü Start: " & RunMenuStart Label3.Caption = "RunMenü Unterbrechen: " & RunMenuBreak Label4.Caption = "RunMenü Fortsetzen: " & RunMenuContinue Label5.Caption = "RunMenü Beenden: " & RunMenuEnd ' Wenn alles ok, dann Methode verlassen Exit Sub ' Fehlerbehandlung error_handler: ' Fehler anzeigen MsgBox Err.Description End Sub ' Code in einem Modul Option Explicit ' API´s zum auslesen von Ressourcen Public Declare Function LoadLibrary Lib "kernel32" Alias _ "LoadLibraryA" (ByVal lpLibFileName As String) As Long Public Declare Function FreeLibrary Lib "kernel32" _ (ByVal hLibModule As Long) As Long Public Declare Function LoadString Lib "user32" Alias _ "LoadStringA" (ByVal hInstance As Long, ByVal wID As Long, _ ByVal lpBuffer As String, ByVal nBufferMax As Long) As Long ' Variablen zum zwischenspeichern Public RunMenuName As String Public RunMenuStart As String Public RunMenuBreak As String Public RunMenuContinue As String Public RunMenuEnd As String Public Sub GetResStrings(VBExePath As String) ' Diese Sub liest die entsprechenden Daten ' aus der VBxIDE.DLL aus ' Übergabeparameter: Pfad zur VB-EXE On Error Goto ExitSub ' Variablen zum zwischenspeichern Dim hInst As Long Dim VBPath As String Dim resString As String Dim lResult As Long ' VBx.EXE zu VBxIDE.DLL ' x=5 oder 6 ' für VB5 muss eine Replace-Funktion eingebaut ' werden da erst ab VB6 vorhanden VBPath = Replace(VBExePath, ".EXE", "IDE.DLL") ' Library VBxIDE.DLL laden ' normalerweise befindet sich die VBxIDE.DLL im ' gleichem Pfad wie die VB.EXE hInst = LoadLibrary(VBPath) ' Deutsch / Englisch <- VB-Sprachversion 'res: 19008 = Ausführen / Run <- Menü 'res: 13003 = Starten / Start <- RunMode 'res: 13004 = Fortsetzen / Continue <- RunMode after BreakMode 'res: 19337 = Unterbrechen / Break <- BreakMode 'res: 19338 = Beenden / End <- DesignMode ' Resourcen auslesen und in Variablen speichern resString = String$(255, Chr$(0)) lResult = LoadString(hInst, 19008, resString, 255) RunMenuName = TrimNullsAndClean(resString) resString = String$(255, Chr$(0)) lResult = LoadString(hInst, 13003, resString, 255) RunMenuStart = TrimNullsAndClean(resString) resString = String$(255, Chr$(0)) lResult = LoadString(hInst, 19337, resString, 255) RunMenuBreak = TrimNullsAndClean(resString) resString = String$(255, Chr$(0)) lResult = LoadString(hInst, 13004, resString, 255) RunMenuContinue = TrimNullsAndClean(resString) resString = String$(255, Chr$(0)) lResult = LoadString(hInst, 19338, resString, 255) RunMenuEnd = TrimNullsAndClean(resString) ' Library VBxIDE.DLL freigeben FreeLibrary hInst ExitSub: End Sub Private Function TrimNullsAndClean(InString As String) As String ' Diese Funktion entfernent eventuell vorhandene ' CHR$(0) und & Zeichen ' Variablen zum zwischenspeichern Dim lngChr As Long Dim lngCounter As Long Dim tempStr As String Dim strTmp As String Dim chrTmp As String * 1 ' entfernen von CHR$(0)-Zeichen lngChr = InStr(InString, Chr$(0)) If lngChr > 0 Then tempStr = Left$(InString, lngChr - 1) Else tempStr = InString End If ' entfernen von &-Zeichen For lngCounter = 1 To Len(tempStr) chrTmp = Mid$(tempStr, lngCounter) If chrTmp <> "&" Then strTmp = strTmp & chrTmp Else strTmp = strTmp End If Next lngCounter TrimNullsAndClean = strTmp End Function