Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

17.6.1 Anzeige der Module

17.6.2 Anzeige der Prozedurliste

Die Anzeige der Prozeduren ist um einiges komplizierter, da Sie nicht per Auflistung auf diese zugreifen können. Das ist aber nicht weiter schlimm, da Sie auf diese Weise einige Methoden und Eigenschaften des CodeModule-Objekts im Praxiseinsatz kennen lernen. Das Füllen des Kombinationsfeldes zur Anzeige der Prozeduren erfolgt beim Auslösen des Ereignisses Nach Aktualisieren des Kombinationsfeldes cboModule, also nach der Auswahl eines Moduls.

Private Sub cboModules_AfterUpdate()

    Dim strProcedures As String
    Dim objVBE As clsVBE
    Set objVBE = New clsVBE

    'Einlesen der Prozeduren
    strProcedures = objVBE.GetProceduresCSV(Me.cboModules)

    'Zuweisen der Prozedurliste und Leeren des Kombinationsfelds
    With Me.cboProcedures
        .RowSourceType = "Value List"
        .RowSource = strProcedures
        .Value = Null
    End With
    'Leeren des Codefensters
    Me.txtCode = Null

    Set objVBE = Nothing

End Sub

Listing 17.12: Aktualisieren des Kombinationsfeldes zur Anzeige der Prozeduren

Das Einlesen der Prozeduren des ausgewählten Moduls erfolgt wiederum über eine Funktion der Klasse clsVBE. Die Funktion heißt GetProceduresCSV und erwartet den Index des auszuwertenden Moduls als Parameter. Die aufrufende Prozedur hält den Indexwert in der gebundenen Spalte des Kombinationsfeldes cboModule vor und übergibt ihn mit dem Aufruf an die Funktion GetProceduresCSV.

Die Funktion erstellt zunächst einen Objektverweis auf das CodeModule-Objekt des Moduls mit dem übergebenen Index. Dann ermittelt es mit der Eigenschaft CountOfLines die Gesamtanzahl der Zeilen dieses Moduls. Die folgende For Next-Schleife durchläuft alle Zeilen des Moduls - mit folgender Ausnahme: Die Funktion überprüft mit der ProcOfLine-Funktion, ob die aktuelle Zeile zu einer Prozedur gehört. Ist das der Fall, liest sie aus der Eigenschaft ProcCountLines die Zeilenanzahl dieser Prozedur und erhöht nach der Ermittlung der gewünschten Informationen die Laufvariable so, dass im nächsten Durchlauf der For Next-Schleife die erste Zeile nach der aktuellen Prozedur geprüft wird.

Dazwischen liest die Funktion die Informationen zu jeder einzelnen Prozedur ein. Der Prozedurname stammt dabei aus der Funktion ProcOfLine, die als Parameter die zu untersuchende Zeilennummer und eine Variable für die Rückgabe des Prozedurtyps erwartet. Diese müssen Sie unbedingt vorher als Long-Variable deklarieren.

Die Funktion ProcCountLines enthält den gleichen Parameter zur Angabe des Prozedurtyps. Hier muss dieser allerdings konkret angegeben werden und mit dem tatsächlichen Typ der Prozedur mit dem angegebenen Namen übereinstimmen. Das ist hier gegeben, denn die Variable lngProcType wird in der Funktion ProcOfLine mit der entsprechenden Typkonstante belegt und kann diesen Wert in der Funktion ProcCountLines bereitstellen.

Zusätzlich zum Prozedurnamen soll die Funktion GetProceduresCSV den Prozedurtyp zurückgeben - und zwar in Form einer aussagekräftigen Zeichenkette und nicht als Konstante wie etwa vbext_pk_Proc. Dazu werden die Konstanten in einem Select Case-Statement ausgewertet und durch eine entsprechende Zeichenkette ersetzt. Damit lassen sich »normale« Prozeduren und Property Get-/Let-/Set-Prozeduren unterscheiden. Das ist etwas unbefriedigend; die Unterscheidung von Sub- und Function-Prozeduren wäre schon sinnvoll. Daher forscht die Funktion GetProceduresCSV im Falle einer »normalen« Prozedur noch etwas weiter. Ein erster Ansatz wäre, die erste Zeile der Prozedur nach dem Schlüsselwort »Sub« oder »Function« zu durchsuchen, doch ist erstens die Position dieser Schlüsselwörter nicht immer gleich, da noch die Wörter Private oder Public vorangestellt sein könnten, und zweitens könnten diese Schlüsselwörter auch noch im Prozedurnamen vorkommen. Doch warum mit verschieden ausgeprägten Ausdrücken herumplagen, wenn es auch einfacher geht? Die letzte Zeile einer Prozedur enthält garantiert einen der beiden Ausdrücke »End Sub« oder »End Function« - hier brauchen Sie also nur die letzte Zeile ausfindig zu machen und mit einem dieser beiden Ausdrücke zu vergleichen.

Den Namen, den Typ und den Zahlenwert der dem Typ entsprechenden Konstante der einzelnen Prozeduren setzt die Funktion schließlich in der String-Variablen strProcs zusammen und gibt deren Inhalt an die aufrufende Prozedur zurück. Die Liste sieht beispielsweise wie folgt aus:

'Beispiel1';'Sub-Prozedur';0;
'Beispiel2';'Property Get-Prozedur';3;
'Beispiel3';'Property Let-Prozedur';1;

Das Kombinationsfeld soll die ersten beiden Werte der Liste anzeigen und den dritten Wert verbergen. Daher stellen Sie die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 3 beziehungsweise 5cm;5cm;0cm ein.

Public Function GetProceduresCSV(intModuleID As Integer)

    Dim objCodeModule As CodeModule
    Dim intModLineCount As Integer
    Dim intProcLineCount As Integer
    Dim i As Integer
    Dim strProcName As String
    Dim strProcs As String
    Dim lngProcType As Long
    Dim strProcType As String
    Dim strLastLine As String

    Set objCodeModule = _
        VBE.ActiveVBProject.VBComponents.Item(intModuleID).CodeModule

    With objCodeModule

        'Zeilenanzahl des Moduls ermitteln
        intModLineCount = . CountOfLines

        'Alle Zeilen untersuchen
        For i = 1 To intModLineCount

            'Wenn die aktuelle Zeile nicht leer ist ...
            If Not . ProcOfLine(i, lngProcType) = "" Then
                'Prozedur der aktuellen Zeile ermitteln
                strProcName = . ProcOfLine(i, lngProcType)

                'Zeilen der aktuellen Prozedur ermitteln
                intProcLineCount = . ProcCountLines(strProcName, _
                    lngProcType)

                'Ermitteln des Prozedurtyps
                Select Case lngProcType
                    Case vbext_pk_Proc
                        'Prozedur: kann Sub oder Function sein,
                        'daher Untersuchung der letzten Zeile
                        strLastLine = . Lines(i + intProcLineCount - 1, 1)
                        If strLastLine = "End Sub" Then
                            strProcType = "Sub-Prozedur"
                        Else
                            strProcType = "Function-Prozedur"
                        End If
                    Case vbext_pk_Let
                        strProcType = "Property Let-Prozedur"
                    Case vbext_pk_Set
                        strProcType = "Property Set-Prozedur"
                    Case vbext_pk_Get
                        strProcType = "Property Get-Prozedur"
                End Select

                'Anfügen von Name, Typbezeichnung und Typkonstante
                'eine String-Variable
                strProcs = strProcs & "'" & strProcName & "';"
                strProcs = strProcs & "'" & strProcType & "';"
                strProcs = strProcs & lngProcType & ";"

                'Laufvariable auf erste Zeile hinter der
                'aktuellen Prozedur setzen
                i = i + intProcLineCount - 1

            End If
        Next i
    End With

    'Liste an Rückgabeparameter übergeben
    GetProceduresCSV = strProcs

    Set objCodeModule = Nothing

End Function

Listing 17.13: Einlesen von Name und Typ der Prozeduren eines Moduls

Nächster Abschnitt:

17.6.3 Anzeige des Codes einer Prozedur

© 2006-2008 André Minhorst Alle Rechte vorbehalten.