Sub und Funktion zusammenlegen zu einer einzigen Sub

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Sub und Funktion zusammenlegen zu einer einzigen Sub

    Hallo.

    Ich habe 2 Subs bzw eine Sub und eine Funktion, die als Boolean funzt. Wie kann man solche Subs zusammenlegen / umschreiben zu einer einzigen Sub, die trotzdem die Funktionalität hat, wie beide zusammen?
    Starten möchte ich die Sub dann mit der "Handles MyBase.Load"-Sub.




    Quellcode

    1. ​ Private Function Initialize() As Boolean
    2. Try
    3. Dim Kopfzeile As String
    4. Dim i, j As Integer
    5. Dim FileColumnNames() As String
    6. Dim InputName As String
    7. Dim NameCounter As Integer
    8. Call DR1.LoadDataRecApp(TextBox5.Text)
    9. ReDim InputParameter(DR1.ParameterCount)
    10. For i = 1 To DR1.ParameterCount
    11. With InputParameter(i)
    12. .Min = DR1.Parameters(i).Min
    13. .Max = DR1.Parameters(i).Max
    14. .RelError = DR1.RelativeModelAccuracy(i)
    15. .AbsError = DR1.AbsoluteModelAccuracy(i)
    16. End With
    17. Next
    18. If RecordNumber > 0 Then
    19. sr.Close()
    20. sw.Close()
    21. End If
    22. InputFileName = TextBox6.Text
    23. If InputFileName = "" Then InputFileName = DR1.Path & "\" & DR1.Application & ".pat"
    24. sr = New IO.StreamReader(InputFileName)
    25. LineString = sr.ReadLine
    26. FileColumnNames = LineString.Split(CChar(";"))
    27. ReDim ColumnPointer(DR1.ParameterCount)
    28. For i = 1 To DR1.ParameterCount
    29. InputName = DR1.Parameters(i).Name
    30. ColumnPointer(i) = -1
    31. NameCounter = 0
    32. For j = 0 To FileColumnNames.GetUpperBound(0)
    33. If FileColumnNames(j) = InputName Then
    34. ColumnPointer(i) = j
    35. NameCounter += 1
    36. End If
    37. Next
    38. If NameCounter > 1 Then
    39. MsgBox("Multiple occcurence of column name: " & InputName)
    40. Exit Function
    41. End If
    42. If ColumnPointer(i) < 0 Then
    43. MsgBox("Input not found in file: " & InputName)
    44. Exit Function
    45. End If
    46. Next
    47. For i = 1 To DR1.ParameterCount
    48. Debug.Print(CStr(i) & " " & ColumnPointer(i) & " " & DR1.Parameters(i).Name & " " & FileColumnNames(ColumnPointer(i)))
    49. Next
    50. OutputFilename = TextBox7.Text
    51. sw = New IO.StreamWriter(OutputFilename)
    52. Kopfzeile = "No.;"
    53. For i = 1 To DR1.ParameterCount
    54. Kopfzeile += DR1.Parameters(i).Name & "_meas;"
    55. Next
    56. sw.WriteLine(Kopfzeile)
    57. RecordNumber = 0
    58. Initialize = True
    59. Catch ex As Exception
    60. MsgBox(ex.Message)
    61. Initialize = False
    62. Exit Function
    63. End Try
    64. End Function
    65. Private Sub EvaluateRecord()
    66. Try
    67. Dim i As Integer
    68. Dim Zeile, hString As String
    69. Dim ActiveRecord, ARSplit() As String
    70. If Not sr.EndOfStream Then
    71. ActiveRecord = sr.ReadLine
    72. RecordNumber += 1
    73. ARSplit = ActiveRecord.Split(CChar(";"))
    74. For i = 1 To DR1.ParameterCount
    75. DR1.InPut(i) = ARSplit(ColumnPointer(i))
    76. Next
    77. DR1.EvalF()
    78. Zeile = CStr(RecordNumber) & ";"
    79. For i = 1 To DR1.ParameterCount
    80. hString = ""
    81. If IsNumeric(ARSplit(ColumnPointer(i))) Then hString = ARSplit(ColumnPointer(i))
    82. Zeile += hString & ";" & DR1.OutPut(i) & ";"
    83. Next
    84. Zeile += DR1.ValueIncompleteCount & ";" & DR1.Iterations & ";" & DR1.deltarel & ";" & DR1.PCA_MaximumNumberIterations & ";" & DR1.PCA_ReconstructionAccuracy
    85. sw.WriteLine(Zeile)
    86. TextBox1.Text = CStr(RecordNumber)
    87. Me.Refresh()
    88. Else
    89. sr.Close()
    90. sw.Close()
    91. End If
    92. Catch ex As Exception
    93. MsgBox(ex.Message)
    94. sr.Close()
    95. sw.Close()
    96. Exit Sub
    97. End Try
    98. End Sub
    Wenn du in einer Function ein Argument als ByRef(By reference) angibst, wird die referenzierte Variable verwendet.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Dim i As Integer = -1
    4. For counter As Integer = 0 To 10
    5. Debug.WriteLine(X(i) & " : " & i)
    6. Next
    7. End Sub
    8. Private Function X(ByRef var As Integer) As Boolean
    9. var += 1
    10. Return var < 10
    11. End Function
    12. End Class

    And i think to myself... what a wonderfuL World!
    Wie kann man 2 Funktionen zu einer machen?

    Man schreibt den Inhalt beider Funktionen in eine Funktion.

    Anhand deines Codes kann ich nicht mal einen direkten Zusammenhang zwischen beiden Funktionen sehen (da Sie sich nicht aufrufen). Ich sehe lediglich das beide Funktionen offenbar iwelche globalen Variablen verwenden und das der Code vermutlich aus VB6 stammt oder von jemanden der aus VB6 kommt geschrieben wurde.

    Also ändere ich meine Antwort doch noch mal.

    Als erstes muss man verstehen was die Funktionen eigentlich machen und auch Grundlagen zur Programmierung im Allgemeinen verstehen.
    Dann kann man Code von anderen auch umschreiben und anpassen.
    Das ist meine Signatur und sie wird wunderbar sein!
    @Sweet Dein Plan ist die Schaffung von Spagetticode, das solltest Du lassen. Solcher Code ist nicht oder nur schlecht pflegbar, und in einem halben Jahr weißt Du nicht mehr, was Du getan hast.
    Besser ist das Gegenteil, die Auslagerung von in sich geschlossenem Programmcode in einzelne Prozeduren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!