Element einer Form aus einer Klasse heraus beeinflussen

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Element einer Form aus einer Klasse heraus beeinflussen

    Hallo Forumer,

    ich bins mal wieder. Diesmal stehe ich vor folgendem Problem: Ich habe eine Form und diese beinhaltet eine Progressbar und eine Textbox. Des weiteren befindet sich ein Button auf der Form, welcher bei Betätigung eine von mir erstellte Klasse aufruft. In der Klasse durchlaufe ich mehrere Elemente und schreibe diese in eine PDF. Dies funktioniert soweit echt gut. Bevor ich die Elemente durchlaufe, hole ich mir die Anzahl der Elemente und sete meinen Progressbar Maximum Wert gleich der Anzahl. Außerdem sage ich noch dass der Wert der Progressbar 0 ist.

    VB.NET-Quellcode

    1. Form1.ProgressBar1.Maximum = dt_Elemente.Rows.Count
    2. Form1.ProgressBar1.Minimum = 0
    3. Form1.ProgressBar1.Value = 0



    Nach jedem Elemente erhöhe ich den momentanen Value der ProgressBar um 1. Jedoch tut sich in der Progressbar nichts. Zur besseren Kontrolle habe ich noch eine Textbox eingebaut, die nach jedem Element die Anzahl der Elemente in das Textfeld übergeben bekommt. Auch hier wird nichts hinein geschrieben.



    VB.NET-Quellcode

    1. Form1.ProgressBar1.Value = Form1.ProgressBar1.Value + 1
    2. Form1.TextBox1.Text = srowcount


    Habe schon versucht die Form zu refreshen jedoch hat dies auch nichts bewirkt. Ist es überhaupt möglich Elemente einer Form aus einer Klasse heraus anzusteuern? Wenn ja, was mache ich falsch? Bitte um Hilfe!



    Euer Steak
    Dein Fehler ist, dass du eine Klasse gleich wie eine Instanz behandelst, bedeutet du benutzt einen Bauplan so als wäre er bereits ein Haus. Das funktioniert natürlich nicht bzw in VB.Net funktioniert das leider teilweise. Du brauchst eine Instanz um auf die Form zuzugreifen.
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Außerdem solltest du unbedingt Option Strict On stellen, denn du kannst einen Integer nicht einfach als String behandeln, geschweige denn umgekehrt.

    LG
    Okay war mir so nicht bewusst. Vielen Dank erstmal:) Ich werde mich etwas mit diesem Thema beschäftigen.



    Edit: Hab mich nun etwas eingelesen und einen groben Überblick bekommen. Jedoch weis ich immer noch nicht wie ich dieses Problem lösen soll. Gibt es eine elegante Lösung oder einen Workaround dafür?






    Edit: Konnte das Problem folgendermaßen lösen:
    1. Ich impliziere die Form in einem Modul folgendermaßen:

    VB.NET-Quellcode

    1. Public frm1 As New Form1



    2. In der Form selbst befindet sich folgender Code:

    VB.NET-Quellcode

    1. Public Property pgBar As Integer
    2. Get
    3. pgBar = ProgressBar1.Value
    4. End Get
    5. Set(value As Integer)
    6. ProgressBar1.Value = value
    7. End Set
    8. End Property



    3. Von meiner Klasse steuere ich die Progressbar folgendermaßen an:

    VB.NET-Quellcode

    1. frm1.ProgressBar1.Maximum = dt_Elemente.Rows.Count
    2. frm1.ProgressBar1.Minimum = 0
    3. frm1.ProgressBar1.Value = 0
    4. Dim i = frm_ControllEepaPrint.pgBar
    5. frm_ControllEepaPrint.pgBar = i + 1




    Ich hoffe euch blutet nicht das Programmierer-Herz davon. Ich weis nicht ob es korrekt ist oder ob ich es so machen darf, aber es funktioniert. Bin natürlich offen für bessere Vorschläge.



    Grüße

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „T-BoneSteak“ ()

    Du hast generell ein Fehldesign deiner Klasse. Du hast eine fixe Koppelung zw. der Form und deiner Klasse.
    Eine Klasse darf von der Form gar nichts wissen. Um jedoch trotzdem mit einer Form (oder Konsolenanwendung, oder andere Klasse, ...) kommunizieren zu können, kann deine Klasse Ereignisse (Events) bereitstellen welche das Objekt deiner Klasse dann auslösen kann. Das kann dann vom Objekt, welches diese Klasse instanziert hat, abonniert und bearbeitet werden.

    Ich habe dir mal ein kleines (sinnloses) Beispiel erstellt:
    Form mit Button:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _MeineKlasse As MeineKlasse
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. _MeineKlasse.AendereWert()
    5. End Sub
    6. Private Sub MeinEvent(sender As Object, e As MyEventArgs)
    7. Debug.Print(e.Value.ToString())
    8. End Sub
    9. Public Sub New()
    10. InitializeComponent()
    11. _MeineKlasse = New MeineKlasse(10)
    12. AddHandler _MeineKlasse.MeinEvent, AddressOf MeinEvent
    13. End Sub
    14. End Class


    Klasse:

    VB.NET-Quellcode

    1. Public Class MeineKlasse
    2. Public Event MeinEvent As EventHandler(Of MyEventArgs)
    3. Public Property Wert As Integer
    4. Public Sub New(ByVal wert As Integer)
    5. Me.Wert = wert
    6. End Sub
    7. Public Sub AendereWert()
    8. For i = 0 To 10
    9. Wert += i
    10. Dim e As New MyEventArgs(Wert)
    11. RaiseEvent MeinEvent(Me, e)
    12. Next
    13. End Sub
    14. End Class
    15. Public Class MyEventArgs
    16. Inherits EventArgs
    17. Private _Value As Integer
    18. Public ReadOnly Property Value As Integer
    19. Get
    20. Return _Value
    21. End Get
    22. End Property
    23. Public Sub New(ByVal value As Integer)
    24. Me._Value = value
    25. End Sub
    26. End Class

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Das Fehlverhalten müsste doch sein, dass nicht nur die Progressbar nix tut, sondern dass die Form total einfriert, oder?

    Also da bring mal wie gesagt die Grundlagen in Ordnung 1) Option Strict On, 2) nicht ins Form grabschen, 3) Microsoft.VisualBasic - Namespace entfernen, und danach kann man erst anfangen, mit Threading einzusteigen.

    zu 2) und 3): Visual Studio - Empfohlene Einstellungen
    Jungs danke für die hilfe.

    @ErfinderDesRade habe deine Einstellungen übernommen.

    @fichz Ich habe dein Beispiel um eine Progressbar auf der Form ergenzt und den Code folgendermaßen abgeändert.

    Form mit Button und Progressbar:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private _MeineKlasse As MeineKlasse
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. _MeineKlasse.AendereWert()
    5. End Sub
    6. Private Sub MeinEvent(sender As Object, e As MyEventArgs)
    7. ProgressBar1.Value = e.Value
    8. End Sub
    9. Public Sub New()
    10. InitializeComponent()
    11. _MeineKlasse = New MeineKlasse(10)
    12. AddHandler _MeineKlasse.MeinEvent, AddressOf MeinEvent
    13. End Sub
    14. End Class



    Klasse:

    VB.NET-Quellcode

    1. Public Class MeineKlasse
    2. Public Event MeinEvent As EventHandler(Of MyEventArgs)
    3. Public Property Wert As Integer
    4. Public Sub New(ByVal wert As Integer)
    5. Me.Wert = wert
    6. End Sub
    7. Public Sub AendereWert()
    8. For i = 1 To 100
    9. Dim e As New MyEventArgs(i)
    10. RaiseEvent MeinEvent(Me, e)
    11. Next
    12. End Sub
    13. End Class
    14. Public Class MyEventArgs
    15. Inherits EventArgs
    16. Private _Value As Integer
    17. Public ReadOnly Property Value As Integer
    18. Get
    19. Return _Value
    20. End Get
    21. End Property
    22. Public Sub New(ByVal value As Integer)
    23. Me._Value = value
    24. End Sub
    25. End Class



    Das ganze funktioniert einwandfrei. Könntest du mir trotzdem nochmal kurz erklären was an meiner obrigen Lösung nicht passt. Ich steig da noch nicht durch.
    Wozu

    T-BoneSteak schrieb:

    Form mit Button und Progressbar
    ?
    Eine Form mit Button, eine weitere Form mit Progressbar. Ansonsten ist Dein Code Overhead pur.
    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!

    T-BoneSteak schrieb:

    erklären was an meiner obrigen Lösung nicht passt.
    Sehr problematisch war, dass du im Modul eine Public Form1 - Instanz hattest.
    Ich weiß jetzt nicht das Fehlverhalten, da der Code unvollständig ist, und du das Fehlverhalten auch nirgends beschreibst.
    Aber da kannst du allen möglichen Code-Horror drauf aufgebaut haben.

    Etwa kannst du versäumt haben, das Form überhaupt anzuzeigen.
    Dann bestünde das Fehlverhalten darin, dass man es gar nicht sieht.
    Sondern man sieht ein anderes Form, auf welches aber die Änderungen sich nicht auswirken, denn geändert wird ja das Form, was garnet angezeigt ist.

    Solche Sachen resultieren zB aus sowas.