Zusammenspiel von Objekten von zwei verschiedenen UserControl Klassen

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Zusammenspiel von Objekten von zwei verschiedenen UserControl Klassen

    Hi Leute,

    in was für eine gedankliche Sackgasse hab ich mich jetzt wieder verrannt?
    Ich hab ja schon im anderen Thread (Ist es möglich RadioButtongruppen aus 2 Instanzen einer UserControl zu "verknüpfen") gesagt, dass ich das Projekt nochmal neu gestallten wollte.
    Folgende neue Hürde kam dabei raus:

    Einfaches Programm Mp3 Player: File-Open Dialog, um die Mp3 Datei zu öffnen und drei Buttons Play/Pause/Stop (mit der Bass.dll)

    Im ersten Versuch hab ich mir eine UserControl erstellt, die sowohl den FileDialog, als auch die Buttons Play,Pause,Stop beherbergte. Das fand ich nicht gut. Daher wollte ich es diesmal sauberer trennen und hab 2 UserControls benutzt. 1 Uc für den OpenFile Dialog und 1 Uc für Play,Pause,Stop.

    Mein Problem ist jetzt, wie sollen die mit einander arbeiten?


    Zwei UcKlassen FileDialog und PlayerControls in der MainForm mit je 2 Instanzen von beidem. Wenn ich jetzt Play-Button drücke müsste sowas passieren

    VB.NET-Quellcode

    1. Public Class UcControlMp3
    2. Public FilePath As String = Nothing
    3. Public chan As Int32
    4. Private Sub BtPlay_Click(sender As Object, e As EventArgs) Handles BtPlay.Click
    5. If FilePath IsNot Nothing Then
    6. chan = Bass.BASS_StreamCreateFile(FilePath, 0, 0, BASSFlag.BASS_SAMPLE_FLOAT Or BASSFlag.BASS_STREAM_AUTOFREE)
    7. End If
    8. End Sub
    9. End Class


    FilePath müsste immer das sein, was der User in der Instanz der anderen Klasse UcFile eingibt und dann in der Textbox ausgegeben wird.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class UcFileMp3
    2. Public soundFilePath As String = Nothing
    3. Private Sub BtOpenFile_Click(sender As Object, e As EventArgs) Handles BtOpenFile.Click
    4. Using openFileDialog1 As New OpenFileDialog()
    5. openFileDialog1.InitialDirectory = ""
    6. openFileDialog1.Filter = "Mp3 Dateien (*.mp3)|*.mp3|alle Dateien (*.*)|*.*"
    7. If openFileDialog1.ShowDialog() = DialogResult.OK Then
    8. soundFilePath = openFileDialog1.FileName
    9. TxbMp3File.Text = soundFilePath
    10. End If
    11. End Using
    12. End Sub
    13. Private Sub BtClearFile_Click(sender As Object, e As EventArgs) Handles BtClearFile.Click
    14. TxbMp3File.Clear()
    15. End Sub
    16. End Class


    Wie bekomme ich eine Saubere Zusammenarbeit hin. Das der Dateipfad der in der einen Uc eingegeben wird in der anderen Uc benutzt werden kann, wenn da der PlayButton gedrückt wird. Ist das wieder etwas für RasieEvent und Delegate ?? Ich versuche hiernach auch wirklich eine Woche lang keinen neuen Thread aufzumachen ;)

    Also Objekt UcControls1 von UcControls soll immer den Pfad von Objekt UcFile1 der Klasse UcFile nehmen.
    codewars.com Rank: 4 kyu
    Du schickst den Dateipfad vom FileDialog-UC ans Form, z.B. per Event. Und das Form schickt diesen Pdaf Pfad dann direkt weiter ans PlayPause-UC.
    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.

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

    @VaporiZed Ohh man was soll ich sagen mal wieder der Retter ...

    Ich hab das jetzt so gemacht. Es ist fast die selbe Lösung wie schon im anderen Thread, nur dass ich das nicht gesehen habe.

    In Uc Mp3Auswahl inkl. TextBox

    VB.NET-Quellcode

    1. Public Event Mp3FileChanged As EventHandler
    2. Private Sub TxbMp3File_TextChanged(sender As Object, e As EventArgs) Handles TxbMp3File.TextChanged
    3. RaiseEvent Mp3FileChanged(Me, Nothing)
    4. End Sub


    und dann in der MainForm

    VB.NET-Quellcode

    1. Public Sub Mp3FileChanged(sender As Object, e As EventArgs) Handles UcFileMp3A.Mp3FileChanged, UcFileMp3B.Mp3FileChanged
    2. Select Case DirectCast(sender, UcFileMp3).Name
    3. Case "UcFileMp3A"
    4. UcControlMp3A.FilePath = UcFileMp3A.soundFilePath
    5. Case "UcFileMp3B"
    6. UcControlMp3B.FilePath = UcFileMp3B.soundFilePath
    7. End Select
    8. End Sub


    Soweit alles i.O. ?

    @ErfinderDesRades Ist ja nicht nur das Anzeigen des Dialoges, ist ja auch noch die Textbox die die ausgewählte Datei anzeigt mit dabei ;) Ich möchte halt möglichst wenig Code in den jeweiligen Uc's haben (und auch möglichst Funktionalitäten: Open/Choose File und Play,Pause,Stop Mp3 getrennt haben)
    codewars.com Rank: 4 kyu
    Was Du auch für zukünftige Anwendungsfälle jener Art im Kopf behalten solltest: Du kannst den EventArgs auch noch was mitgeben:

    VB.NET-Quellcode

    1. Public Event Mp3FileChanged As EventHandler(Of Mp3FileChangedEventArgs)
    2. Private Sub TxbMp3File_TextChanged(sender As Object, e As EventArgs) Handles TxbMp3File.TextChanged
    3. RaiseEvent Mp3FileChanged(Me, New Mp3FileChangedEventArgs With {.FileName = soundFilePath})
    4. End Sub
    5. 'am besten in einer eigenen Datei
    6. Public Class Mp3FileChangedEventArgs : Inherits EventArgs
    7. Public FileName As String
    8. 'ggf. noch weitere Variablen oder auch ReadOnly Propertys, die dann über einen Konstruktor mit Daten befüllt werden
    9. End Class
    10. 'und dann in Main:
    11. Public Sub Mp3FileChanged(sender As Object, e As Mp3FileChangedEventArgs) Handles UcFileMp3A.Mp3FileChanged, UcFileMp3B.Mp3FileChanged
    12. Select Case True
    13. Case sender Is UcFileMp3A
    14. UcControlMp3A.FilePath = e.FileName
    15. Case sender Is UcFileMp3B
    16. UcControlMp3B.FilePath = e.FileName
    17. End Select
    18. End Sub

    Letzterer Teil nochmal das andere Thema: nicht Namen, sondern Objekte vergleichen
    Stellt sich natürlich gleich die Frage, ob Du nicht gleich die UcControl-Dinger mit den UcFileMp3-Teilen zu je einem Komplett-UC verbinden willst.
    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.
    @nogood Irgendwie hab ich das Gefühl, Du siehst den Wald vor lauter Bäumen nicht.
    Wozu überhaupt brauchst Du ein UserControl für einen Player?
    4-5 Button auf die GUI, eine Progressbar und ein paar Label und feddich.
    Was willst Du da trennen, auslagern und separieren, um es dann ggf. in welchem anderen Projekt nachzunutzen?
    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!
    @VaporiZed Danke für den Tipp mit der Mitgabe der EventArgs.

    und wahrscheinlich habt Ihr beide recht, dass ich diese mal in die andere Richtung zu extrem war. Erster Versuch zuviel in einem Uc diesmal zu wenig.

    Muss mich halt weiter reinfuchsen. Eure Unterstützung ist Gold wert ... Ich will mal versuchen die nächsten Tage das ganze geschriebene zu verdauen.

    ----------------------------
    nochmal zu
    ...nicht Namen, sondern Objekte vergleichen...​
    (Vaporized)

    Würde so was auch mit Select Case gehen?
    Wenn ich die "Objekte" vergleiche würde ich das so machen.

    VB.NET-Quellcode

    1. Public Sub Mp3FileChanged(sender As Object, e As EventArgs) Handles UcFileMp3A.Mp3FileChanged, UcFileMp3B.Mp3FileChanged
    2. 'Select Case DirectCast(sender, UcFileMp3).Name
    3. ' Case "UcFileMp3A"
    4. ' UcControlMp3A.FilePath = UcFileMp3A.soundFilePath
    5. ' Case "UcFileMp3B"
    6. ' UcControlMp3B.FilePath = UcFileMp3B.soundFilePath
    7. 'End Select
    8. If DirectCast(sender, UcFileMp3) Is UcFileMp3A Then
    9. UcControlMp3A.FilePath = UcFileMp3A.soundFilePath
    10. End If
    11. If DirectCast(sender, UcFileMp3) Is UcFileMp3B Then
    12. UcControlMp3B.FilePath = UcFileMp3B.soundFilePath
    13. End If
    14. End Sub
    codewars.com Rank: 4 kyu

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

    nogood schrieb:

    Select Case gehen?
    Nein, denn da müssen konstante Werte zum Vergleichen bereitgestellt werden.

    VB.NET-Quellcode

    1. If obj.Equals(C1) Then
    2. ' was tun
    3. Else If obj.Equals(C2) Then
    4. ' was tun
    5. Else If obj.Equals(C3) Then
    6. ' was tun
    7. End If
    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!
    ich sachma so:

    VB.NET-Quellcode

    1. Public Sub Mp3FileChanged(sender As Object, e As EventArgs) Handles UcFileMp3A.Mp3FileChanged, UcFileMp3B.Mp3FileChanged
    2. Select Case True
    3. Case sender Is UcFileMp3A
    4. UcControlMp3A.FilePath = UcFileMp3A.soundFilePath
    5. Case sender Is UcFileMp3B
    6. UcControlMp3B.FilePath = UcFileMp3B.soundFilePath
    7. End Select
    8. End Sub
    :?: Post#5, Zeile#15-20 nicht gelesen?
    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.