Sub zu Funktion umschreiben

  • VB.NET

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

    Sub zu Funktion umschreiben

    Hallo Leute

    Ich arbeite gerade an einer Bibliothek zum Auslesen von Informationen. Ich hab aber zwei Probleme:

    1. Was stimmt an dem folgendem Code nicht?

    VB.NET-Quellcode

    1. Public Shared Function GetDriveName(ByVal drive As String) As String
    2. Dim drivename As String = My.Computer.FileSystem.Drives(drive).VolumeLabel.ToString
    3. Return drivename
    4. End Function


    Wenn ich dann beim Button-Event eingebe:

    VB.NET-Quellcode

    1. TextBox2.Text = GetDriveName(TextBox1.Text)


    Und 2. Ich mache das ja alles mit der Return-Anweisung aber wie kriege ich dass jetzt hin dass ich mit Return die ausgelesenen Info in eine Listbox einfüge? Hier mal ein Beispielcode:

    VB.NET-Quellcode

    1. Private Sub GetNetworkadapterswithMAC()
    2. Dim oInterface As NetworkInterface
    3. ListBox1.Items.Clear()
    4. For Each oInterface In NetworkInterface.GetAllNetworkInterfaces()
    5. With oInterface
    6. If .NetworkInterfaceType <> NetworkInterfaceType.Loopback AndAlso .NetworkInterfaceType <> NetworkInterfaceType.Tunnel Then
    7. ListBox1.Items.Add(.Name.ToString & " Status: " & .OperationalStatus.ToString & " " & " [" & .GetPhysicalAddress.ToString & "]")
    8. End If
    9. End With
    10. Next
    11. End Sub


    wie kriege ich das hin?

    Danke im Voraus

    Glubschi43

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Glubschi43“ ()

    Hey,

    zunächst: "Problem mit Code" ist keine adäquate Überschrift, schließlich kann man in einem Forum wie diesem davon ausgehen, dass jedes Thema ein Code-Problem behandelt.

    Zu Problem eins: die Funktion "My.Computer.FileSystem.Drives" erwartet keinen String, sondern den Index des abzurufenden Elements:

    VB.NET-Quellcode

    1. Public Shared Function GetDriveName(ByVal DriveIndex As Integer) As String
    2. Dim drivename As String = My.Computer.FileSystem.Drives(DriveIndex).VolumeLabel
    3. Return drivename
    4. End Function


    Zu Problem zwo: Eine Sub hat keine Rückgabe. Verwende also eine Funktion mit einem passenden Rückgabewert (1:1 übertragen auf dein Beispiel wäre das eine Listbox. Eine List (of T) wäre aber vermutlich besser...) oder deine Sub trägt die Werte direkt in die passende Listbox ein. Ich sehe keine spezifische Frage...

    Gruß, Manschula
    Ah Danke das erste problem wurde dadurch schonmal gelöst aber beim 2.problem weiss ich noch nicht weiter

    Das Codebeispiel was ich gepostet hab ist ja in der form wie ich es in meinem normalen Programm ohne DLL auslese.

    Aber wie soll ich das umschreiben sodass ich das mit einer Return-Anweisung machen kann?
    Hey,

    Glubschi43 schrieb:

    Aber wie soll ich das umschreiben sodass ich das mit einer Return-Anweisung machen kann?

    hab ich doch ober schon beschrieben. Wenn dein Code funktioniert und bisher alles brav in deine Listbox eingetragen hat, dann kannst du die Sub ja jetzt als Funktion umschreiben. So wie du es im ersten Problem auch hattest. Als Rückgabewert kannst du hier z.B eine List (of String) nehmen.

    Gruß, Manschula
    Hey,

    du hast doch oben (selbst?) auch schon eine Funktion erstellt :huh: Mal ein ziemlich sinnfreies Beispiel:

    VB.NET-Quellcode

    1. Public Shared Function bla() As List(Of String)
    2. Dim nListe As New List(Of String)
    3. nListe.Add("Ein neuer Eintrag #1")
    4. nListe.Add("Ein neuer Eintrag #2")
    5. Return nListe
    6. End Function
    7. Private Sub Button2Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    8. ' Neue Liste in Funktion erstellen und zweiten Eintrag hier anzeigen
    9. Dim meineListe As List(Of String) = bla()
    10. MessageBox.Show(meineListe(1))
    11. End Sub

    Gruß, Manschula
    Ich habe jetzt mal nen code gebastelt aber der funzt nich:

    VB.NET-Quellcode

    1. Public Shared Function GetNetworkadapterswithMAC() As String
    2. Dim oInterface As NetworkInterface
    3. Dim list As New List(Of String)
    4. For Each oInterface In NetworkInterface.GetAllNetworkInterfaces()
    5. With oInterface
    6. If .NetworkInterfaceType <> NetworkInterfaceType.Loopback AndAlso .NetworkInterfaceType <> NetworkInterfaceType.Tunnel Then
    7. list.Add(.Name.ToString & " Status: " & .OperationalStatus.ToString & " " & " [" & .GetPhysicalAddress.ToString & "]")
    8. Return list
    9. End If
    10. End With
    11. Next
    12. End Function


    Bei Return list unterstreicht er list und sagt system.collections. ... oder so kann nicht in ein string konvertiert werden

    Keine ahnung warum das nich funzt
    Danke hab das nich gewusst

    funktoniert aber immernoch nich. ich habe das mal in form load event eingefügt:

    VB.NET-Quellcode

    1. ListBox1.Items.Add(GetNetworkadapterswithMAC)


    bei der ausführung fügt das programm der listbox nur den eintrag "(Auflistung)" hinzu
    Hey,

    ich glaube, du schaust dir meine Beispiele gar nicht an :huh: Deine Funktion hat als Rückgabewert eine Liste. Du kannst dementsprechend einer Liste keine Liste hinzufügen. Also schau dir mein Beispiel oben noch einmal an. Dort findet sich folgende Zeile:

    VB.NET-Quellcode

    1. Dim meineListe As List(Of String) = bla()

    Ich erstelle eine neue Liste "meineListe", die ich der Liste gleichsetze, die mir die Funktion "bla" zurück gibt... Also auf deine Listbox angewendet mal ganz krux:

    VB.NET-Quellcode

    1. Dim meineListe As List(Of String) = bla()
    2. ListBox1.Items.AddRange(meineListe.ToArray)

    Gruß, Manschula

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manschula“ ()

    So

    VB.NET-Quellcode

    1. Public Shared Function bla() As List(Of String)
    2. Dim nListe As New List(Of String)
    3. nListe.Add("Ein neuer Eintrag")
    4. Return nListe
    5. End Function
    6. Public Shared Function GetNetworkadapterswithMAC()
    7. Dim oInterface As NetworkInterface
    8. For Each oInterface In NetworkInterface.GetAllNetworkInterfaces()
    9. With oInterface
    10. If .NetworkInterfaceType <> NetworkInterfaceType.Loopback AndAlso .NetworkInterfaceType <> NetworkInterfaceType.Tunnel Then
    11. bla.Add(.Name.ToString & " Status: " & .OperationalStatus.ToString & " " & " [" & .GetPhysicalAddress.ToString & "]")
    12. Return bla()
    13. End If
    14. End With
    15. Next
    16. End Function


    und im form load event so:

    VB.NET-Quellcode

    1. ListBox1.Items.AddRange(GetNetworkadapterswithMAC())
    Hey,

    wie kommst du denn jetzt auf diesen Code? 8| Da ist ja jetzt einfach mal alles zusammengewürfelt, ohne Hand und Fuß...

    VB.NET-Quellcode

    1. Public Shared Function GetNetworkadapterswithMAC() As List(Of String)
    2. Dim oInterface As NetworkInterface
    3. Dim nListe As New List(Of String) ' Neue Liste erstellen
    4. For Each oInterface In NetworkInterface.GetAllNetworkInterfaces()
    5. With oInterface
    6. If .NetworkInterfaceType <> NetworkInterfaceType.Loopback AndAlso .NetworkInterfaceType <> NetworkInterfaceType.Tunnel Then
    7. ' Liste mit Wert befüllen, wenn Bedingungen zutreffen:
    8. nListe.Add(.Name.ToString & " Status: " & .OperationalStatus.ToString & " " & " [" & .GetPhysicalAddress.ToString & "]")
    9. End If
    10. End With
    11. Next
    12. ' Liste als Rückgabewert
    13. Return nListe
    14. End Function

    Aufruf der Funktion und befüllen der Listbox mit:

    VB.NET-Quellcode

    1. ' Die Inhalte der Liste, die die Funktion zurückgibt, werden in einer Listbox angezeigt
    2. Dim meineListe As List(Of String) = GetNetworkadapterswithMAC()
    3. ListBox1.Items.AddRange(meineListe.ToArray)

    So, das ist jetzt ungetestet und auf die schnelle, ich habe kein VB zur Hand. Wichtig ist, dass du den logischen Ablauf verstehst...

    Gruß, Manschula