Private Sub eines Events aufrufen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von JLH.

    Private Sub eines Events aufrufen

    Ich konvertiere alte VB6 Programme und bin bei meinem aktuellen Projekt auf folgendes gestoßen:

    Visual Basic-Quellcode

    1. ​Private Sub txtRlg_LostFocus()
    2. code
    3. End Sub


    Auf einem Button habe ich

    Visual Basic-Quellcode

    1. ​Private Sub cmdEingabeende_Click()
    2. txtRlg_LostFocus
    3. Pruefen
    4. End Sub


    Das ganze in .NET

    VB.NET-Quellcode

    1. ​Private Sub txtRlg_LostFocus(sender As Object, e As EventArgs) Handles txtRlg.LostFocus
    2. Code
    3. End Sub


    Und der Button

    VB.NET-Quellcode

    1. ​Private Sub cmdEingabeende_Click(sender As Object, e As EventArgs) Handles cmdEingabeende.Click
    2. txtRlg_LostFocus()
    3. Pruefen()
    4. End Sub


    In VB6 klappt der Aufruf ​txtRlg_LostFocus wunderbar aber in .NET bei mir (noch) nicht. VS 2022 schlägt mir folgende Lösung vor, aber die klappt nicht. "Die Methode oder der Vorgang ist nicht implementiert." Weiß jemand was falsch ist?

    VB.NET-Quellcode

    1. ​Private Sub txtRlg_LostFocus()
    2. Throw New NotImplementedException()
    3. End Sub
    Throw New NotImplementedException() - allein die Übersetzung sollte klar machen: hier ist nix, bitte selber mit Code auffüllen, sonst kracht es - von Haus aus.

    Die Lösung scheint einfach.
    Aus

    VB.NET-Quellcode

    1. Private Sub txtRlg_LostFocus(sender As Object, e As EventArgs) Handles txtRlg.LostFocus
    2. Code
    3. End Sub

    und

    VB.NET-Quellcode

    1. Private Sub cmdEingabeende_Click(sender As Object, e As EventArgs) Handles cmdEingabeende.Click
    2. txtRlg_LostFocus()
    3. Pruefen()
    4. End Sub

    mach

    VB.NET-Quellcode

    1. Private Sub txtRlg_LostFocus(sender As Object, e As EventArgs) Handles txtRlg.LostFocus
    2. Methode
    3. End Sub
    4. Private Sub cmdEingabeende_Click(sender As Object, e As EventArgs) Handles cmdEingabeende.Click
    5. Methode
    6. Pruefen()
    7. End Sub
    8. Private Sub Methode()
    9. Code
    10. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja…. dachte ich auch, hat ähnlichkeit mit einer anderen Anfrage von mir wegen Events fremd auslösen.
    Dachte wenn diese „simple“ Anweisung in VB6 funktionierte müsste das doch irgendwie auch in .NET möglich sein.
    Da ich dieses Mal erst anfange kann ich es aber so umsetzen. Es sei denn jemand weis wie es geht.
    Achso, Du willst nicht wissen, wie man es richtig programmiert, sondern wie man den Altkram unsinnigerweise übersetzt.
    Da der neue EventHandler zwei Parameter will, musst Du auch zwei mitgeben:

    VB.NET-Quellcode

    1. Private Sub cmdEingabeende_Click(sender As Object, e As EventArgs) Handles cmdEingabeende.Click
    2. txtRlg_LostFocus(Me, EventArgs.Empty)
    3. Pruefen()
    4. End Sub

    Ist zwar sinnfrei, aber möglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Um den EventHandler regulär als Methode aufzurufen, kommst Du nicht drumherum die Parameter mitzugeben, die er verlangt, daher txtRlg_LostFocus(Me, EventArgs.Empty).
    Da VB/der Compiler aber auch an dieser Stelle tricksen kann, kannst Du auch den EventHandler parameterlos machen und dann so aufrufen wie in VB6.

    VB.NET-Quellcode

    1. Private Sub txtRlg_LostFocus() Handles txtRlg.LostFocus
    2. Code
    3. End Sub
    4. Private Sub cmdEingabeende_Click(sender As Object, e As EventArgs) Handles cmdEingabeende.Click
    5. txtRlg_LostFocus()
    6. Pruefen()
    7. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    JLH schrieb:

    Aber ich muss sagen, es wird richtig etwas unübersichtlich und natürlich sind es einige Zeilen mehr Code.
    Einen Methodenrumpf musst du dir wegdenken, was Zeilen angeht. Und dann kommt da genau keine Zeile extra.
    Es ist in der Regel genau andersrum, Codebestandteile in Methoden zu verpacken, reduziert das Zeilenaufkommen, nämlich immer dann wenn bestimmte Zeilenabfolgen mehrfach auftauchen.
    Und hilft generell der Übersichtlichkeit.

    Ich verzichte manchmal drauf, denn der ausgeführte Code wird dadurch nicht weniger. Und wenn man dafür eine kleine Erinnerungsstütze hat, dann fällt einem vielleicht auch irgendwas ein wie man den ausgeführten Code reduzieren kann.
    Ich sag mal alleine vom Ablauf ist es aber trotzdem ein Umdenken. Lege ich einen Event an habe ich mir vorher überlegt was bei diesem Event passieren soll und fülle den Handler mit Code. Irgendwann im laufe der Programmierung möchte ich diesen Code vielleicht wieder verwenden und gehe wie oben beschrieben vor… das kostet Zeit und ein paar Zeilen mehr. Ich mach doch jetzt nicht jedes Mal eine Methode für den Fall ich könnte es mal vielleicht wieder brauchen. Da finde ich den VB6 „Ansatz“ besser.

    @VaporiZed: Danke. Ich mach es jetzt „richtig“. Der Trick scheint aber die Lösung zu meinem post „zünden von Events“ zu sein. Das Probier ich kommende Woche mal aus.

    JLH schrieb:

    Irgendwann im laufe der Programmierung möchte ich diesen Code vielleicht wieder verwenden
    Wenn ich in dieser Situation bin, markiere ich den Code und klick links auf "Methode extrahieren". Fertig

    Dass dafür sogar n Hotkey gibt, der einem ein paar Tastendrücke und vier Mausklicks erspart sollte eigentlich dafür sprechen, dass es ziemlich viele Leute machen
    Hotkey ist Strg+R, danach Strg+M. Aber es erzeugt Dir eben eine eigene, neue Methode. Also "mehr Code" im Programm.
    Bilder
    • Extract method.gif

      64,19 kB, 384×192, 47 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.