Die Community zu .NET und Classic VB.
Menü

Addin-Programmierung - Seite 5

 von 

Ereignisse abfangen
Nächste Seite >>
Projekte und Komponenten
<< Vorherige Seite

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
Nächste Seite >>
Ereignisse abfangen
<< Vorherige Seite
Projekte und Komponenten