Diese Seite wurde zuletzt aktualisiert am 10.09.1999
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für VB, VBA und OfficeVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Zurück...


Anzeige

Teil 4

Wie werden nun die Positionierungen für die verschiedenen Modul-Fenster festgelegt und gespeichert? Irgendwie muss der Anwender seine Entscheidung ja dem AddIn bekannt geben können es ist eine Schnittstelle zum Anwender notwendig. Wie bereits erwähnt, werden dazu die Kontextmenüs der Module im Projekt-Explorer mit zusätzlichen Einträgen ausgestattet. Diese Kontextmenüs sind im Sinne der VBIDE ebenso CommandBar-Objekte, wie die übrigen Menüs und Toolbars. Die Namen der beiden benötigten Kontextmenüs (CommandBars) lauten "Project Window Form Folder" und " Project Window Module/Class Folder". Das Kontextmenü für den Form-Ordner (die IDE verwendet es für alle Komponenten mit Designer-Fenstern, z.B. ebenfallls für UserControls, PropertyPages usw., auch wenn diese in verschiedenen Ordnern erscheinen) erhält Einträge sowohl zum Festlegen als auch Restaurieren der Designer-Fenster-Positionen und ebenso zum Festlegen und Restaurieren der Code-Modul-Standardpositionierung. Das Kontextmenü für Module und Klassen hingegen wird nur für die Modul- und Klassen-Ordner verwendet. Insgesamt müssen für unseren Zweck sechs CommandBarControls mit entsprechenden Ereignisempfängern für die Click-Ereignisse eingefügt und installiert werden.

Private Sub AddinInstance_OnConnection(ByVal Application _
 As Object, ByVal ConnectMode As _
 AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst _
 As Object, custom() As Variant)
    Dim nCmdBarControl As CommandBarControl
    Dim nAddInCmdBar As CommandBar
    
    Const kCodeWindowCaption = _
     "Code-Fenster Position/-Größe als Standard speichern"
    Const kDesignerCaption = _
     "Designer-Fenster Position/-Größe als Standard speichern"
    Const kCodeWindowRestoreCaption = _
     "Code-Fenster Position/-Größe Standard wiederherstellen"
    Const kDesignerRestoreCaption = _
     "Designer-Fenster Position/-Größe Standard wiederherstellen"
    
    Set mVBE = Application
    With mVBE
        Set eProjectEvents = .Events.VBProjectsEvents
        On Error Resume Next
        Set nAddInCmdBar = .CommandBars _
         ("Project Window Form Folder")
        On Error Resume Next
        If Not (nAddInCmdBar Is Nothing) Then
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kCodeWindowCaption
                .BeginGroup = True
            End With
            Set ePjFCodeWindowCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kCodeWindowRestoreCaption
                .BeginGroup = False
            End With
            Set ePjFRestoreCodeWindowCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kDesignerCaption
                .BeginGroup = True
            End With
            Set ePjFDesignerCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kDesignerRestoreCaption
                .BeginGroup = False
            End With
            Set ePjFRestoreDesignerCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
        End If
        On Error Resume Next
        Set nAddInCmdBar = .CommandBars _
         ("Project Window Module/Class Folder")
        On Error Resume Next
        If Not (nAddInCmdBar Is Nothing) Then
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kCodeWindowCaption
                .BeginGroup = True
            End With
            Set ePjMCodeWindowCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
            Set nCmdBarControl = nAddInCmdBar.Controls.Add _
             (msoControlButton, , , , True)
            With nCmdBarControl
                .Caption = kCodeWindowRestoreCaption
                .BeginGroup = False
            End With
            Set ePjMRestoreCodeWindowCmdButtonEvent = _
             .Events.CommandBarEvents(nCmdBarControl)
        End If
    End With
End Sub

Die Click-Ereignisse der sechs Kontextmenü-Einträge werden je nach Funktionalität an die eine oder die andere von zwei privaten Prozeduren weitergeleitet, versehen mit der Kennung "C" für Code-Modul-Fenster und "D" für Desginer-Fenster. Die mit den Ereignissen übergebenen Parameter interessieren uns nicht weiter.

Private Sub ePjFRestoreCodeWindowCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zRestoreCmdButtonClick "C"
End Sub

Private Sub ePjFRestoreDesignerCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zRestoreCmdButtonClick "D"
End Sub

Private Sub ePjMRestoreCodeWindowCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zRestoreCmdButtonClick "C"
End Sub

Private Sub ePjFCodeWindowCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zStoreCmdButtonClick "C"
End Sub

Private Sub ePjFDesignerCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zStoreCmdButtonClick "D"
End Sub

Private Sub ePjMCodeWindowCmdButtonEvent_Click _
 (ByVal CommandBarControl As Object, handled As Boolean, _
 CancelDefault As Boolean)
    zStoreCmdButtonClick "C"
End Sub

Das Festlegen der Fenster-Positionierung erfolgt in der Prozedur zStoreCmdButtonClick. In ihr wird sicherheitshalber geprüft, ob tatsächlich eine Komponente ausgewählt ist. Dann wird anhand der übergebenen Kennung zwischen Code-Modul ("C") und Designer ("D") unterschieden. Das Verfahren zum Ermitteln der Komponententyp-ID und zur Instanzierung bzw. Ermittlung einer Instanz der Positionierungs-Klasse clsPosSize ist im Prinzip wieder dasselbe wie beim Laden einer Komponente.

Private Sub zStoreCmdButtonClick(iType As String)
    Dim nWindow As Window
    Dim nVBComponent As VBComponent
    Dim nPosSize As clsPosSize
    Dim nID As String
    
    With mVBE
        On Error Resume Next
        Set nVBComponent = .SelectedVBComponent
        On Error GoTo 0
        If Not (nVBComponent Is Nothing) Then
            Select Case iType
                Case "C"
                    With nVBComponent
                        nID = kCodeWindow
                        Set nWindow = .CodeModule.CodePane.Window
                    End With
                    On Error Resume Next
                    Set nPosSize = mPosSizes(nID)
                    On Error GoTo 0
                    If nPosSize Is Nothing Then
                        Set nPosSize = New clsPosSize
                        nPosSize.Init nID
                        mPosSizes.Add nPosSize, nID
                    End If
                    nPosSize.Store nWindow
                Case "D"
                    With nVBComponent
                        nID = "D" & CStr(.Type) & .DesignerID
                        Set nWindow = .DesignerWindow
                    End With
                    On Error Resume Next
                    Set nPosSize = mPosSizes(nID)
                    On Error GoTo 0
                    If nPosSize Is Nothing Then
                        Set nPosSize = New clsPosSize
                        nPosSize.Init nID
                        mPosSizes.Add nPosSize, nID
                    End If
                    nPosSize.Store nWindow
            End Select
        End If
    End With
End Sub

Jedoch wird hier nicht die Move-Methode der Klasse aufgerufen, sondern die Store-Methode, mit der Übergabe des als Vorlage für die Positionierung dienenden Window-Objekts.

Public Sub Store(iWindow As Window)
    Dim nSection As String
    
    With iWindow
        pLeft = .Left
        pTop = .Top
        pWidth = .Width
        pHeight = .Height
    End With
    SaveSetting kVBEWindowControl, pID, "Width", pWidth
    SaveSetting kVBEWindowControl, pID, "Height", pHeight
    SaveSetting kVBEWindowControl, pID, "Left", pLeft
    SaveSetting kVBEWindowControl, pID, "Top", pTop
End Sub

Hier werden die Positionierungswerte zur weiteren Verwendung (z.B. beim Aufruf der Move-Methode) in Variablen abgelegt und danach in der Windows-Registrierung unter der beim Initialisieren festgelegten Komponenten-ID gespeichert.


Fensterplätze - Teil Teil 3    Teil 5 Fensterplätze - Teil 5


AddIn-Übersicht

Zum Seitenanfang

Copyright © 1999 - 2018 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer