Eigenschaft für alle Instanzen einer Klasse

  • VB.NET
  • .NET (FX) 4.0

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    Eigenschaft für alle Instanzen einer Klasse

    Hallo Leute,

    ich möchte mir eine eigne Textbox erstellen lassen.
    Ich brauche eine Eigenschaft die sowas wie ein BerbeitungsModus Farblich-Sichtbar macht.

    Mein Code:

    VB.NET-Quellcode

    1. Public Class OTextBox
    2. Inherits System.Windows.Forms.TextBox
    3. Public Shared Property BearbeitungsModus() As Boolean
    4. 'Private _bearbeitungsModus As Boolean
    5. 'Public Property BearbeitungsModus() As Boolean
    6. ' Get
    7. ' Return _bearbeitungsModus
    8. ' End Get
    9. ' Set(ByVal value As Boolean)
    10. ' _bearbeitungsModus = value
    11. ' End Set
    12. 'End Property
    13. Sub New()
    14. SetStyle(ControlStyles.ResizeRedraw Or
    15. ControlStyles.OptimizedDoubleBuffer, True)
    16. End Sub
    17. Protected Overrides Sub OnGotFocus(e As EventArgs)
    18. MyBase.OnGotFocus(e)
    19. If BearbeitungsModus Then
    20. Me.BackColor = Color.LightGoldenrodYellow
    21. End If
    22. End Sub
    23. '
    24. Protected Overrides Sub OnLostFocus(e As EventArgs)
    25. MyBase.OnLostFocus(e)
    26. If BearbeitungsModus Then
    27. Me.BackColor = SystemColors.Window
    28. End If
    29. End Sub
    30. End Class


    Zugriff:

    VB.NET-Quellcode

    1. OTextBox.Bearbeitungsmodus =True

    Meine Frage:
    Bin ich da auf den richtigen weg oder lieg ich total daneben :/?
    Wie ist euere meinung zu den Code?
    @Amro Da musst Du schon Getter und Setter ausprogrammieren und beim Setter ein Me.Invalidate() aufrufen, dann wird das Control neu gezeichnet.
    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!
    @Amro Alle Instanzen, die Du änderst, werden dann neu gezeichnet.
    Was ist das Problem?
    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!
    Ok, ich versuch es mal andersrum.
    Ich möchte eine eigenschaft der klasse ändern die sich auf alle Objekte diese klasse
    auswirkt.
    Also So wie der Code den ich oben angegeben hab. Der auch Funktioniert.
    Ich bin aber nicht Sicher ob das Ok ist.
    Kopier dir den Code und teste das mal ,zieh mal mehrere diese TextBoxen auf eine Form.
    Dann machst du ein Button und schreibst im Click-Ereignis " OTextBox.Bearbeitungsmodus =True ".
    Vielleicht verstehst du dann mein Problem.

    Das Problem ist aber wenn ich die BearbeitungsModus -Eigenschaft Lösche,
    meckert der Designer.
    Du meinst, alle TextBoxen sollen mit einem Klick in den Bearbeitungsmodus wechseln, ist das richtig? Deine Fragestellung ist da nicht so ganz eindeutig.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Seh ich das richtig? Du packst 10 Deiner Sondertextboxen auf Dein Formular und willst dann mit einem Schlag bei allen Boxen die Bearbeitungsmodusanzeigemöglichkeit aktivieren? Nein, das ginge nur, indem Du alle Instanzen auf Deinem Formular durchgehst. Du kannst nicht den Klassennamen verwenden, um alle Instanzen zu erwischen.

    VB.NET-Quellcode

    1. OTextBox.Bearbeitungsmodus = True
    sollte einen sauberen Syntaxfehler geben.
    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.
    Wie @VaporiZed gesagt hast, geht das nicht so, wie Du es Dir vorstellst. Was Du machen kannst ist eben alle Instanzen durchgehen und den Bearbeitungsmodus setzen oder Du packst alle Deine TextBoxen in ein Panel oder Ähnliches und erweiterst dies mit einer entsprechenden Funktion, welche dann den Bearbeitungsmodus für alle in dem Panel vorhandenen TextBoxen setzt.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Achso X/ ist ja Shared. Ja, ok, der Code läuft. Also geht es nicht um die Frage, wie man ihn zum Laufen bringt, sondern ob er schön ist. Tja, er läuft. Bis jemand ne bessere Idee hat: ja, ganz schön.
    @SpaceyX: Nee, hab mich getäuscht. Hab den Code vorher nicht probiert und das Shared übersehen. Ja, er läuft. Zumindest, wenn man die Boxen zur Designzeit erzeugt. Zur Laufzeit hab ich's nicht probiert, aber dem TE geht's wohl eher um was anderes.
    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.
    Ich finde es nicht sauber, sorry. Würde mir lieber eine spezialisierte Ableitung einer ControlCollection erstellen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Amro schrieb:

    alle Objekte diese klasse
    Alle Instanzen von OTextBox
    oder
    alle Instanzen von Controls, die Member einer OTextBox-Instanz sind?
    So was:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. For Each tb As OTextBox In Me.Controls.OfType(Of OTextBox)()
    3. tb.Enabled = False
    4. Next
    5. End Sub
    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!

    Amro schrieb:

    Ist halt nur ReadOnly.
    Klar.
    Wenn Du die Property schreiben wolltest, müssten ja alle Instanzen informiert werden, das geht aber von einer Schred Property aus nicht.
    Weil eben innerhalb der Implementierung auf kein anderes Nicht-Shared-Member / Prozedur zugegriffen wird, wurde diese Property Shared deklariert.
    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!
    Nee, damit meinte er, dass die gezeigten Framework-Propertys ReadOnly deklariert sind. Sein Beispielcode läuft. Da kann man im Betrieb die Funktion an und ausschalten und die OTextBox-Instanzen reagieren alle sofort. Ich hab's probiert. Es geht in diesem Thread wohl weniger um ein Problem als um eine Codepräsentation.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class FrmMain
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. OTextBox.BearbeitungsModus = Not OTextBox.BearbeitungsModus
    4. End Sub
    5. End Class
    6. Public Class OTextBox
    7. Inherits System.Windows.Forms.TextBox
    8. Public Shared Property BearbeitungsModus() As Boolean
    9. 'Private _bearbeitungsModus As Boolean
    10. 'Public Property BearbeitungsModus() As Boolean
    11. ' Get
    12. ' Return _bearbeitungsModus
    13. ' End Get
    14. ' Set(ByVal value As Boolean)
    15. ' _bearbeitungsModus = value
    16. ' End Set
    17. 'End Property
    18. Sub New()
    19. SetStyle(ControlStyles.ResizeRedraw Or
    20. ControlStyles.OptimizedDoubleBuffer, True)
    21. End Sub
    22. Protected Overrides Sub OnGotFocus(e As EventArgs)
    23. MyBase.OnGotFocus(e)
    24. If BearbeitungsModus Then
    25. Me.BackColor = Drawing.Color.LightGoldenrodYellow
    26. End If
    27. End Sub
    28. '
    29. Protected Overrides Sub OnLostFocus(e As EventArgs)
    30. MyBase.OnLostFocus(e)
    31. If BearbeitungsModus Then
    32. Me.BackColor = Drawing.SystemColors.Window
    33. End If
    34. End Sub
    35. End Class



    Wenn @Amro es noch auf die Spitze treiben/perfektionieren will, sorgt er noch dafür, dass seine OTBs bei folgendem Code "korrekt" reagieren und dass die beiden Farben nicht durch ihn vorgegeben sind und dann hat er ein nettes, eigenes CE:

    VB.NET-Quellcode

    1. Private Sub OTextBox1_TextChanged(sender As Object, e As EventArgs) Handles OTextBox1.TextChanged
    2. OTextBox.BearbeitungsModus = Not OTextBox.BearbeitungsModus
    3. End Sub

    Aber wie diese Verbesserungen aussehen, soll er mal selber rausfinden. Schau mer mal, was rauskommt. ;)

    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 3 mal editiert, zuletzt von „VaporiZed“ ()

    VaporiZed schrieb:

    Sein Beispielcode läuft.
    Bei Dir auch :?:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. CheckBox1_CheckedChanged(Nothing, EventArgs.Empty)
    4. End Sub
    5. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    6. OTextBox.BearbeitungsModus = CheckBox1.Checked
    7. End Sub
    8. End Class
    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!
    Ja. Wenn ich dann in die TextBoxen reingehe (siehe Post#1, Zeile#21-#27), werden sie entsprechend verfärbt. Auch bei Deinem Code.
    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.
    @VaporiZed
    Du hast mich verstanden :thumbsup:
    Im Net.Framework ist nicht alles ReadOnly.
    Wenn man z.Bs. TextBox. eingibt , also die Klasse TextBox und nicht das
    Control dan bekommt man ja die geerbten Methoden und Eigenschaft.
    Mit F12 kann man sich das ja anschauen.
    Und zu deiner Erweiterung , hört sich gut an.
    Ich will das mal Probieren.

    VaporiZed schrieb:

    Wenn @Amro es noch auf die Spitze treiben/perfektionieren will, sorgt er noch dafür, dass seine OTBs bei folgendem Code "korrekt" reagieren und dass die beiden Farben nicht durch ihn vorgegeben sind und dann hat er ein nettes, eigenes CE:

    Wie meinst du das nicht durch mich vorgegeben?

    VaporiZed schrieb:

    Wenn ich dann in die TextBoxen reingehe
    Wenn Du 20 OTextBoxen hast und Deinen Button betätigst, musst Du in alle Instanzen reinklicken, damit die reagieren. Das ist ein NoGo.
    Mit meinem Code in Post #13 und der Nicht-Static-Property genügt der alleinige Click auf den Button, wie es sein soll.
    @Amro Du hast den Sachverhalt mit dem Static nicht verstanden. :/
    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!