Ist es möglich RadioButtongruppen aus 2 Instanzen einer UserControl zu "verknüpfen"

  • VB.NET
  • .NET 4.5

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

    @VaporiZed

    Ja Du hast vollkommen recht. Ich hatte da einen Fehler in meinem Denken (hatte ja oben schon geschrieben, dass das mit dem OOP Denken nicht so klappt // siehe auch die anderen Threads von mir ;)).

    Erstmal keine Fragen von mir, für den interessierten Leser -> so hab ich das bis jetzt gemacht:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub CbxTasterActiv(sender As Object, e As EventArgs) Handles UcMp3Player1.CbxTasterActiv, UcMp3Player2.CbxTasterActiv
    2. If CType(sender, UcMp3Player).CbTrkBVolMp3.Checked Then
    3. For Each chkbox As CheckBox In lstCheckBoxes
    4. If chkbox.Checked AndAlso CType(sender, UcMp3Player).CbTrkBVolMp3 IsNot chkbox Then
    5. chkbox.Checked = False
    6. End If
    7. Next
    8. End If
    9. 'Activ Trackbar gets the input of the usb RotaryEncoder; because of the checked Checkbox
    10. If CType(sender, UcMp3Player).CbTrkBVolMp3.Checked Then
    11. trackBarChkBoxFocus = CType(sender, UcMp3Player).TrkBVolMp3
    12. ActivUC = CType(sender, UcMp3Player)
    13. End If
    14. If CType(sender, UcMp3Player).CbTrkBVolMp3.Checked = False Then
    15. trackBarChkBoxFocus = Nothing
    16. ActivUC = Nothing
    17. End If
    18. End Sub
    19. Public Sub TasterIsMoved()
    20. Dim tasterWirkung As Int32 = 10
    21. If trackBarChkBoxFocus IsNot Nothing And ActivUC IsNot Nothing Then
    22. If tasterRichtung = "up" And trackBarChkBoxFocus.Value < trackBarChkBoxFocus.Maximum Then
    23. If trackBarChkBoxFocus.Value + tasterWirkung > trackBarChkBoxFocus.Maximum Then
    24. trackBarChkBoxFocus.Value = trackBarChkBoxFocus.Maximum
    25. Else
    26. trackBarChkBoxFocus.Value += tasterWirkung
    27. End If
    28. End If
    29. If tasterRichtung = "down" And trackBarChkBoxFocus.Value > 0 Then
    30. If trackBarChkBoxFocus.Value - tasterWirkung < 0 Then
    31. trackBarChkBoxFocus.Value = 0
    32. Else
    33. trackBarChkBoxFocus.Value -= tasterWirkung
    34. End If
    35. End If
    36. 'ensprechend Update Vol Bass_dll
    37. Dim VolumeSlider As Single
    38. VolumeSlider = Convert.ToSingle(trackBarChkBoxFocus.Value / 100)
    39. Bass.BASS_ChannelSetAttribute(ActivUC.Chan, BASSAttribute.BASS_ATTRIB_VOL, VolumeSlider)
    40. End If
    41. End Sub


    Das mit keine Frage nehme ich Zurück. Ist das Okay, dass ich da trackBarChkBoxFocus = Nothing und ActivUC = Nothing setze?

    Eine 0 ist ein "Object" Integer mit dem Wert 0. Nothing ist noch nicht mal ein "Object"?
    Nothing ist also das fürs Programmieren was die Null für Mathe ist?
    Laaangsam. Eine Null ist ein definitiver Wert für einen Integer. Dieser Wert ist größer als -1 und kleiner als 1. Es ist Teil der natürlichen Zahlen. Soweit so klar.
    Nothing ist für Objekte aber etwas anderes. Eine Variable kann auf ein Objekt zeigen bzw. dieses repräsentieren. Oder man weist einer Objekt-Variablen Nothing zu. Dann verweist/repräsentiert sie eben nichts. Also gar nichts. Mit diesem Nothing kann man dann auch nichts machen. Mit einer Null kann man was machen, z.B. +1 rechnen. Das Nothing kann man nur durch ein variablenpassendes Objekt ersetzen, sodass die Variable wieder auf ein Objekt verweist. Also: große Unterschiede. Dass ein Integer aus einem Nothing eine Null macht, ist eine Integerbesonderheit. Über nullable-Variablen red ich jetzt erstmal nicht, das wird zu kompliziert. Nach dem Essen kommen noch ein paar Codeanmerkungen.

    ##########

    @nogood:

    Essen beendet :P
    Ersetze die Zeilen#13-#15 durch Else.
    Z#25, #33: Der Unterschied zwischen And und AndAlso/Or und OrElse
    Z#25-#31: If tasterRichtung = "up" Then trackBarChkBoxFocus.Value = Math.Min(trackBarChkBoxFocus.Value + tasterWirkung, trackBarChkBoxFocus.Maximum)
    Z#33-#39: analog mit Math.Max
    Z#41-43: Solltest Du im jetzigen Zustand zu einer Zeile zusammenfassen. Z#41 und #42 lassen sich jetzt schon zusammenfassen, aber da der Variablenname mir einen anderen Inhalt suggeriert (und zwar lässt es ein Slider-Objekt vermuten, obwohl es um einen Lautstärkenwert geht), wäre eine all-in-one-Zeile besser.

    ergänzend:
    CType würde ich gegen DirectCast eintauschen, habe mich aber noch nicht so intensiv damit beschäftigt, dass ich sagen könnte, was besser wäre.
    Convert.ToSingle würd ich wieder in CSng umtauschen. Da frag einer mal nach meiner Logik :S
    Z#23: Int32 -> Integer
    Vielleicht will jemand anderes da seinen Input geben

    Z#24: Ggf. If trackBarChkBoxFocus Is Nothing orelse ActivUC Is Nothing Then Return - verkleinert die Verschachtelungstiefe um 1.
    allgemein: deutsch-englisch-Sprachmischmasch ist änderungsbedürftig, aber es ist Dein Code

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

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

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

    @VaporiZed
    Ersetze die Zeilen#13-#15 durch Else.
    -> Klar

    Z#25-#31: If tasterRichtung = "up" Then trackBarChkBoxFocus.Value = Math.Min(trackBarChkBoxFocus.Value + tasterWirkung, trackBarChkBoxFocus.Maximum)Z#33-#39: analog mit Math.Max

    Krass kannte ich nicht. Muss ich nochmal googlen wie das genau arbeitet. Es funktioniert und sieht gut aus ;) (Min(UInt64, UInt64)Returns the smaller of two 64-bit unsigned integers.

    Min(UInt32, UInt32)Returns the smaller of two 32-bit unsigned integers. War ja gar nicht kompliziert)


    Z#41-43: Solltest Du im jetzigen Zustand zu einer Zeile zusammenfassen. Z#41 und #42 lassen sich jetzt schon zusammenfassen, aber da der Variablenname mir einen anderen Inhalt suggeriert (und zwar lässt es ein Slider-Objekt vermuten, obwohl es um einen Lautstärkenwert geht), wäre eine all-in-one-Zeile besser.
    -> Klar ... Tomaten auf den Augen

    CType würde ich gegen DirectCast eintauschen, ...
    -> übernehme ich mal ohne da näheres zu wissen

    Z#23: Int32 -> Integer
    Ich dachte bis jetzt das wäre das Gleiche (Int32 wäre so zu sagen der Standardwert).

    Z#24: Ggf. If trackBarChkBoxFocus Is Nothing orelse ActivUC Is Nothing Then Return
    Hat10 Minuten gedauert aber jetzt ist es mir klar. Hab ich auch so übernommen.

    So macht man also aus 19 Zeilen Code -> 9 Zeilen. Sehr schön bis auf das Math.Min Max hab ich auch alles verstanden. Die Zusammenfassung AndAlso hab ich auch gelesen und hoffe das ich die Gewohnheit And zu nehmen ablegen kann.

    Danke auch für die tolle Zusammenfassung über "Nothing"!!!

    -------------
    P. S. : bin gerade etwas gefrusted/ am grübel, ob ich das ganz Programm doch hätte anders aufbauen sollen. Eher mit nur 1x Trackbar und dann über ComboBoxen die Funktion dieser Trackbar ändern. Würde vom Programmmieraufwand wohl deutlich einfacher sein

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

    nogood schrieb:

    VB.NET-Quellcode

    1. If CType(sender, UcMp3Player).CbTrkBVolMp3.Checked Then
    Du castest 3 Mal in der Prozedur CbxTasterActiv().
    Mach Dir ne Variable mit dem Check-Zustand und verwende die.
    Das ist übersichtlicher und lässt sich leichter debugen.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Dass ein Integer aus einem Nothing eine Null macht, ist eine Integerbesonderheit.
    Nein, ist es nicht.
    Für Structures hat Nothing eine andere Bedeutung als für Classes ('Objekte').
    Wenn man einer Structure Nothing zuweist, so entsteht ein Speicherbereich, mit '0' ausgefüllt.
    Bei Integer sind das 4 Nullen, ergibt als Integer 0.
    Bei Point sinds 8 Nullen (weil die Point-Structure 2 Integers enthält - ergibt den Point {0. 0}
    Bei DateTime ergibt das auch iwas, ich glaub, Christi Geburt, bin aber nicht sicher.

    Also gewissermassen wird das Wort Nothing in vb.net für 2 verschiedene Sachen verwendet:
    Bei Class-Variablen setzt es diese auf Nothing - garnichts.

    Bei Structure-Variablen (die nicht 'nichts' sein können) weist es einen Speicherbereich zu, gefüllt mit '0'.
    Dieser Speicherbereich bedeutet dann je nach Datentyp was anneres.

    In c# gibts dafür eine sinnigere Bezeichung: default(<structName>)
    @ErfinderDesRades Jou.
    @nogood Du musst Dich dazu mal mit Wert-Typen und Referenz-Typen befassen.
    Wert-Typen füllen einen Speicherbereich, der ihrer Größe entspricht, mit entsprechenden Werten. Strukturen sind Wert-Typen, Integer, Long, DateTime usw. ebenfalls.
    Ein mit Nullen befüllter Speicherbereich entspricht dem Default-Wert, der beim Anlegen einer Variable dieses Typs zugewiesen ist. Damit kann gearbeitet werden.
    Referenz-Typen müssen mit New instanziiert werden: Form, Button, Streams usw.
    Ein mit Null befüllter Speicherbereich beim Anlegen einer Referenz-Typ-Variable führt zu einer NullReferenceException, weil noch keine entsprechende Instanz erstellt wurde:

    VB.NET-Quellcode

    1. Dim dlg As Form
    2. dlg.ShowDialog()
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ja, hab ich unzureichend ausgedrückt, danke für die Klarstellung. In diesem obigen Kontext hatte ich - weil es da um Nothing-Zuweisung an ein Objekt oder an eine Integer-Variable ging, von Besonderheit geredet.

    VaporiZed schrieb:

    Nothing ist für Objekte aber etwas anderes. [...] Dass ein Integer aus einem Nothing eine Null macht, ist eine Integerbesonderheit.
    Dass diese Besonderheit dadurch entsteht, weil es sich bei einem Integer um einen Werttypen handelt, hatte ich zwar im Hinterkopf, aber durch Deinen Post ist das jetzt nochmal genau mit Hintergrund erklärt. Nochmals danke dafür.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.