Re: Strukturiertes Programm

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance

From: Peter Götz (gssg_nospam_at_t-online.de)
Date: 09/09/04


Date: Thu, 9 Sep 2004 10:51:33 +0200

Hallo Thomas,

> ich würde gerne wissen, wie Ihr folgendes lösen würdet:
> (Die Sub ist schon vorhanden)
>
>
> /***********************************/
> sub start(strPara as string)
>
> 'in Abhängigkeit von 8 Parametern sollen nur
> 'bestimmte Funktionen durchlaufen werden

Ich sehe bei Deiner Sub aber nur einen Parameter.
Ich vermute deshalb mal, dass dieser eine Parameter max. 8 mögliche Werte
haben kann.

> 'bei strPara = "fkt2_fkt4" soll nur fkt2 bis fkt4 abgearbeitet werden

Das sind 3 von den 8 Möglichkeiten.

> 'bei strPara = "fkt6_fkt8" soll nur fkt6 bis fkt8 abgearbeitet werden

Das sind weitere 3 von den 8.

So ganz verstehe ich nicht, wie Deine Parameter wirklich aussehen.
Kann ein solcher auch so aussehen: "Fkt1" ?

> 'die Funktionen werden hintereinander (ohne Lücken) abgearbeitete
> 'nach der letzten Funktion soll die sub verlassen werden

... schnipp

> 'Code zur Auswertung der Rückgabe von Fkt..
>
> end sub
>
> /***********************************/
>
>
> Wenn ich das ganze mit Select Case machen will,
> dann bin ich gezwungen, jeden Funktionsaufruf mehrfach in den Code zu
> schreiben, was ich strikt ablehne,

Warum lehnst Du das strikt ab?
Programmierst Du um eine Aufgabe möglichst effizient zu lösen, oder um
irgendwelchen Prinzipien zu folgen?

> ausserdem stehen hinter jedem
> Funktionsaufruf auch noch 3 bis 4 Zeilen Code zur Rückgabebehandlung
> der Funktion.

Das muss nicht wirklich ein Problem sein.

>
> Mache ich es mit if then, dann bekomme ich ein caotisches Gerüst:
> IF (strPara = "fkt1_fkt4") or (strPara = "fkt2_fkt5") or (strPara =
> "fkt3_fkt6") or ... THEN
> intRet = fkt1(..)
> 'Code zur Auswertung der Rückgabe von Fkt..
> endif
>
> und werde nicht mehr froh, wenn später neue Parameter hinzukommen.

Ein Select Case-Konstrukt ist in diesem Fall schon das Richtige.

> Wie kann ich das ganze ohne redundanten Code lösen?

Dazu solltest Du zur Steuerung der Funktionsauswahl keine Strings als
Schalter übergeben, sondern numerische Ganzzahlwerte, bei denen Du jedes
darin enthaltene Bit als Schalter auswerten kannst.

>
> Mir fällt da nur ein Select Case strPara mit GOTO-Verzweiger ein, um
> den Code nicht unübersichtlich werden zu lassen.
> Das Problem dabei ist, das "GOTO", das zwar jeder VB-Programmierer in
> der Fehlerbehandlung verwendet, welches aber anderweitig verpönt ist.

Auch wieder etwas, was ich noch nie verstanden habe.
Nur weil irgendwelche selbsternannten Experten mal gesagt haben ein GoTo sei
nicht "schick" darf man es nicht verwenden? Wenn es denn so wäre, sollen
sich diese "Experten" einfach mal fragen, warum es diesen Sprungbefehl in VB
überhaupt gibt.

>
> Ich will hier auch keine GOTO-Diskussion wie irgendwann im Jahr 2000
> (>70 Beiträge in einem GOTO-Thread) heraufbeschwören.

In der Tat ist eine solche Diskussion reichlich albern und absolut
überflüssig.

Nun aber zurück zu Deinem Problem.
Dein Hauptproblem ist der Datentyp String Deines an die Sub übergebenen
Parameters.

Schau Dir mal das nachfolgende Beispiel an:

' /// Beginn Code
Option Explicit

    Private Enum FktEnum
        F1 = 1
        F2 = 2
        F3 = 4
        F4 = 8
        F5 = 16
        F6 = 32
        F7 = 64
        F8 = 128
    End Enum

Private Sub MySub(Fkt As FktEnum)
    Dim i As Long
    Dim strBuffer As String

    For i = 0 To 7
        If Fkt And 2 ^ i Then
            If Len(strBuffer) Then
                strBuffer = strBuffer & "; "
            End If
            Select Case i
                Case 0
                    strBuffer = strBuffer & Fkt1
                Case 1
                     strBuffer = strBuffer & Fkt2
               Case 2
                    strBuffer = strBuffer & Fkt3
                Case 3
                    strBuffer = strBuffer & Fkt4
                Case 4
                    strBuffer = strBuffer & Fkt5
                Case 5
                    strBuffer = strBuffer & Fkt6
                Case 6
                    strBuffer = strBuffer & Fkt7
                Case 7
                    strBuffer = strBuffer & Fkt8
            End Select
        End If
    Next i

    MsgBox strBuffer, vbInformation
End Sub

Private Function Fkt1() As String
    Fkt1 = "erste Funktion"
End Function

Private Function Fkt2() As String
    Fkt2 = "zweite Funktion"
End Function

Private Function Fkt3() As String
    Fkt3 = "dritte Funktion"
End Function

Private Function Fkt4() As String
    Fkt4 = "vierte Funktion"
End Function

Private Function Fkt5() As String
    Fkt5 = "fünfte Funktion"
End Function

Private Function Fkt6() As String
    Fkt6 = "sechste Funktion"
End Function

Private Function Fkt7() As String
    Fkt7 = "siebte Funktion"
End Function

Private Function Fkt8() As String
    Fkt8 = "achte Funktion"
End Function

Private Sub Form_Click()
    ' Aufruf der Sub MySub zur Abarbeitung der Funktionen Fkt1, Fkt4 u. Fkt7
    MySub F1 Or F4 Or F7

    ' Aufruf der Sub MySub zur Abarbeitung der Funkion Fkt2
    MySub F2
End Sub

' \\\ Ende Code

Hier hat der an MySub übergebene Parameter den Typ Long (FktEnum) und somit
ist es mit Hilfe einer simplen And-Verknüpfung möglich, herauszufinden
welche Bits im Parameter Fkt auf 1 gesetzt sind.
Zur Verdeutlichung: Die Enum FktEnum könnte eben so gut auch so aussehen:

    Private Enum FktEnum
        F1 = 2^0
        F2 = 2^1
        F3 = 2^2
        F4 = 2^3
        F5 = 2^4
        F6 = 2^5
        F7 = 2^6
        F8 = 2^7
    End Enum

Kommen noch weitere hinzu, kein Problem. Du hast 31 Bits zur Verfügung (Bit
2^0 ... 2^30). Beim Bit 2^31, welches in einem Wert vom Typ Long das
Vorzeichen darstellt, wird es allerdings ein bisschen schwieriger. Dieses
Bit musst Du so ausmaskieren:

    if Fkt And &h80000000 then
        ' das Vorzeichenbit (2^31) ist gesetzt
    end if

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tips u. Beispielprogrammen)



Relevant Pages

  • Re: Timer tickt nicht richtig
    ... 'wenn Datensatz in DataGrid selektiert ist, TabelleDG2 gefiltert ... Sub LoadDataset(ByVal OleDBConn As OleDb.OleDbConnection, ... ByVal Criteria2 As String, _ ... End If ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: access report to PDF
    ... Function EmailFormAsPDF(Email_adr As String) ... Dim objOutlook As Outlook.Application ... End Function ...
    (microsoft.public.de.access)
  • =?utf-8?Q?Re:_Tabellenverkn=C3=BCpfungen_per_OD?= =?utf-8?Q?BC-DSN_defekt?=
    ... Dim Instancename As String ... 'Function DatenMDBWechsel() - damit kann man das neuEinbinden "erzwingen" ... 'End If ...
    (microsoft.public.de.access)
  • Re: Strukturiertes Programm
    ... >> (Die Sub ist schon vorhanden) ... >Dein Hauptproblem ist der Datentyp String Deines an die Sub übergebenen ... > End Enum ... >Private Function Fkt1() As String ...
    (microsoft.public.de.vb)
  • Re: Endlosformular und O2007
    ... Private mbolFormStatus As Boolean ... Private Sub cmdImportieren_Click ... End Sub ... Private Function shKapitel1() As String ...
    (microsoft.public.de.access)