Frage zu Klasse

  • VB.NET

Es gibt 40 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

    Frage zu Klasse

    Hei Com,
    Ist es machbar in einem Sub quasi nochmal ein Sub zu machen ? Z.b.
    Nehmen wir mal an, meine Klasse nennt sich Tresor und darunter sind Funktionen wie z.b. TresorAuf und TresorZu und eine Funktion die nennt sich Inhalt. Und darunter Befinden sich noch 2 Funktionen un zwar GeldRein und GeldRaus. So hat man beim Code dann Tresor.Inhalt.GeldRaus(50€). (Nur ein Beispiel). Das sollte doch gehen, immerhin gibt es das oft wie bei System.IO oder ?

    Mfg xd-franky-5

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „xd-franky-5“ ()

    Du willst also ein Event in der Klasse haben?
    Ich kann dir ein C# beispiel geben, sollte sich leicht nach vb übersetzen lassen.

    C-Quellcode

    1. public delegate void TextChanged ();
    2. event TextChanged OnTextChanged;


    Den handler fügst du dann ganz normal hinzu.
    Wie man in VB ein event aufruft weiß ich gerade nicht auswendig,
    ich glaube per RaiseEvent.

    Grüße
    @nafets3646
    Da finde ich viel aber irgentwie nicht das, das ich brauche. Weil ich ja garnicht weiß wie es aussieht

    @SplittyDev
    Nicht in der Klasse, in der Form und das Event soll reagieren wenn der Parameter eines Subs in der Klasse geändert wurde
    Mach doch das event in der klasse und ruf das event mit RaiseEvent in der sub auf.
    Den Handler für das event kannste ja in der form klasse machen.

    Form Klasse
    - Event handler

    Andere Klasse
    - Delegat + event
    - Sub
    - - Ruft event auf
    @xd-franky-5
    Du hast es doch nichtmal probiert, oder?
    5 Sekunden Googeln: msdn.microsoft.com/de-de/library/ms172877.aspx

    @SplittyDev
    Leider kann man das Eventsystem in C# nur schlecht mit dem in VB vergleichen.
    Das Eventsystem ist im Grunde genommen das selbe, oder?

    Er müsste doch nur in der Klasse das Event deklarieren und das in der Sub callen.

    Den Handler kann er doch irgendwie so in der form hinzufügen:
    Public Sub HandleTextChanged () Handles AndereKlasse.TextChanged
    Ist schon paar Jahre her dass ich VB programmiert hab..

    Mach ein Event in deiner Klasse:
    Event TextChanged()

    In der Sub, in der der text geändert wird, rufst du das event auf:
    RaiseEvent TextChanged()

    In der Form klasse behandelst du das event:

    VB.NET-Quellcode

    1. Public Sub OnTextChanged () Handles DeineKlasse.TextChanged
    2. ' Hier irgendwas machen
    3. End Sub


    Sollte einigermaßen stimmen ^^
    Grüße
    Danke aber ich bekomme noch den Fehler: Die Handles-Klausel erfordert eine WithEvents-Variable, die im enthaltenden Typ oder einem seiner Basistypen definiert wird. (hat sich erledigt)

    EDIT:\\ Und ist es auch möglich so etwas wie einen Backgroundworker in die Klasse zu stecken, sonst hängt sich meine Form manchmal auf ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „xd-franky-5“ ()

    Die Form sollte sich durch das Event nicht aufhängen.
    Wenn du einen codeteil im main-thread der form ausführst, der etwas länger dauert, solltest du das in nem neuen Thread tun.

    Grüße
    Als kurze Übersicht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents MyTest As Test ' Deklaration der Klasse
    3. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. MyTest = New Test ' Instanzierung der Klasse
    5. End Sub
    6. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    7. MyTest.DoIt() ' die Klasse etwas tun lassen
    8. End Sub
    9. Private Sub MyEventHandler(sender As System.Object, e As System.EventArgs) Handles MyTest.MyEvent
    10. MessageBox.Show("Event bekommen") ' Der Event-Handler
    11. End Sub
    12. End Class
    13. Class Test
    14. Public Event MyEvent(sender As System.Object, e As System.EventArgs) ' Das Event der Klasse
    15. Public Sub DoIt() ' etwas tun
    16. RaiseEvent MyEvent(Me, EventArgs.Empty) ' ein Event senden
    17. End Sub
    18. End Class

    Edit: siehe unterhalb von @SpaceyX: die korrekte Anwendung von Events...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VB1963“ ()

    Nein, korrekt werden Events so implementiert:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _test As New TestClass
    3. Private WithEvents _test1 As New TestClass1
    4. Private Sub _test_TestEvent(sender As Object, e As EventArgs) Handles _test.TestEvent
    5. MessageBox.Show("Event aus TestClass")
    6. End Sub
    7. Private Sub _test1_TestEvent(sender As Object, e As TestEventArgs) Handles _test1.TestEvent
    8. MessageBox.Show("Event aus TestClass1, Result=" & e.TestResult)
    9. End Sub
    10. End Class
    11. Public Class TestClass
    12. Public Event TestEvent As EventHandler
    13. Protected Overridable Sub OnTestEvent()
    14. RaiseEvent TestEvent(Me, EventArgs.Empty)
    15. End Sub
    16. End Class
    17. Public Class TestClass1
    18. Public Event TestEvent As EventHandler(Of TestEventArgs)
    19. Protected Overridable Sub OnTestEvent(result As String)
    20. RaiseEvent TestEvent(Me, New TestEventArgs(result))
    21. End Sub
    22. End Class
    23. Public Class TestEventArgs : Inherits EventArgs
    24. Private _testResult As String
    25. Public ReadOnly Property TestResult As String
    26. Get
    27. Return _testResult
    28. End Get
    29. End Property
    30. Public Sub New(result As String)
    31. _testResult = result
    32. End Sub
    33. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ok, das hat sich jetzt geklärt. Aber ich habe noch etwas: ich habe einen Thread in der Klasse und auf der Form kann ich drauf zugreifen aber es kommt immer der Fehler:

    Eine nicht behandelte Ausnahme des Typs "System.InvalidOperationException" ist in System.Windows.Forms.dll aufgetreten.
    Zusätzliche Informationen: Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement TextBox4 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

    Wenn ich über der Aktion, ein "CheckForIllegalCrossThreadCalls = false" mache funktioniert es aber das ist kein schönes Programmieren. Ich habe Delegate und etc. schon versucht aber entweder war ich zu dumm ( was ich denke ) oder die Codes gehen nicht mehr. Wisst ihr wie ich das beheben kann ?
    Nutze Task-Async. Dann besteht dieses Problem nicht.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _test1 As New TestClass1
    3. Private Sub _test1_TestEvent(sender As Object, e As TestEventArgs) Handles _test1.TestEvent
    4. Label1.Text = e.TestResult
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. _test1.DoWork()
    8. End Sub
    9. End Class
    10. Public Class TestClass1
    11. Public Event TestEvent As EventHandler(Of TestEventArgs)
    12. Public Async Sub DoWork()
    13. Dim result As Long = Await Task.Factory.StartNew(Function() As Long
    14. Dim l As Long = 0
    15. For i As Integer = 0 To 20000
    16. l += i
    17. Next
    18. Return l
    19. End Function)
    20. OnTestEvent(result.ToString())
    21. End Sub
    22. Protected Overridable Sub OnTestEvent(result As String)
    23. RaiseEvent TestEvent(Me, New TestEventArgs(result))
    24. End Sub
    25. End Class
    26. Public Class TestEventArgs : Inherits EventArgs
    27. Private _testResult As String
    28. Public ReadOnly Property TestResult As String
    29. Get
    30. Return _testResult
    31. End Get
    32. End Property
    33. Public Sub New(result As String)
    34. _testResult = result
    35. End Sub
    36. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Wie wende ich das bei mir an ? Ich blick da noch nicht ganz durch, hab erst Gestern mit Klassen angefangen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Event GetMessages(Text As String, Nutzername As String)
    2. Private Sub GetMsg()
    3. While client.Connected
    4. 'Nachricht erhalten
    5. Dim txt As String = streamr.ReadLine
    6. GetMsg_Nutzername = txt.Split("|")(0)
    7. MsgText = txt.Split("|")(1)
    8. RaiseEvent GetMessages(Text:=MsgText, Nutzername:=GetMsg_Nutzername)
    9. End While
    10. End Sub