Re: Strukturiertes Programm
From: Peter Götz (gssg_nospam_at_t-online.de)
Date: 09/09/04
- Next message: Schmidt: "Re: schnellere Dateisuche"
- Previous message: Thomas Hase: "Re: Strukturiertes Programm"
- In reply to: Thomas Hase: "Strukturiertes Programm"
- Next in thread: Thomas Hase: "Re: Strukturiertes Programm"
- Reply: Thomas Hase: "Re: Strukturiertes Programm"
- Messages sorted by: [ date ] [ thread ]
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)
- Next message: Schmidt: "Re: schnellere Dateisuche"
- Previous message: Thomas Hase: "Re: Strukturiertes Programm"
- In reply to: Thomas Hase: "Strukturiertes Programm"
- Next in thread: Thomas Hase: "Re: Strukturiertes Programm"
- Reply: Thomas Hase: "Re: Strukturiertes Programm"
- Messages sorted by: [ date ] [ thread ]
Relevant Pages
|