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.

    RodFromGermany schrieb:

    @Amro Du hast den Sachverhalt mit dem Static nicht verstanden.


    Deshalb schreib ich ja hier rein.
    Ich wollte ja nur wissen ob das so gemacht werden kann.
    Mein vorhaben ist eine Form mit Textboxen. Der Benutzer soll anhand des Farbwechsels der
    Textbox erkennen, ob er im Bearbeitungsmodus oder im Ansichtsmodus ist.
    Ich will eine Eigenschaft einmal Setzen und die Textboxen sollen sich selbst darum kümmern,
    wenn sie angelickt werden.
    Wenn du mir noch sagst, was ich nicht an Static Properety verstanden hab wäre das sehr Hilfreich.
    Ist Static und Shared das Selbe?

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

    RodFromGermany schrieb:

    musst Du in alle Instanzen reinklicken, damit die reagieren. Das ist ein NoGo.
    :?:
    Er will doch, dass nur die TextBox markiert/gefärbt wird, die gerade den Fokus hat. Es sollen nicht alle gefärbt werden, sondern nur eine, in der sich das Caret befindet.

    @Amro: Du gibst Farben vor: Einmal die, die als markiert angesehen werden soll (also dieses hellgelb). Und zum anderen die Fall-Back-Farbe. Aber die ist nicht bei jedem "SystemColors.Window". Stell Dir vor, jemand will all-in-black haben. Und dann kommt Deine OTextBox und bringt da dieses hellgraublaupetrolwasauchimmer ins Spiel, nachdem sie den Fokus verloren hat.
    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.
    Das wird schwierig.
    Ich hab ja jetzt eine Eigenschaft "BearbeitungsModus" die Projektweit gilt.
    Sie verändert die Farben nicht nur in der einer Form sondern in allen Formen wo die OTextBox
    draufgezogen wurde.
    Was auch in Ordnung ist , da ich vielleicht in zwei oder drei Formen Änderungen vornehmen will.
    Erst beim Abspeichern der Daten will ich dann "BearbeitungsModus = False" setzen.

    Würde ich jetzt eine Eigenschaft, sagen wir mal "OnGotFocusColor As Color " hinzufügen.
    Wäre sie ja nur für die einzelnen OTextBoxen im Eigenschaftsfenster oder im QuellCode veränderbar.

    Aber ich bleib mal drann und schaue ob ich was Nutzbares hinbekomme.

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

    @VaporiZed

    Hast du sowas gemeint?

    VB.NET-Quellcode

    1. Public Class OTextBox
    2. Inherits System.Windows.Forms.TextBox
    3. Public Shared Property BearbeitungsModus As Boolean
    4. Public Shared Property OnGotFocusColor As Color = Color.AliceBlue
    5. Public Shared Property OnLostFocusColor As Color = SystemColors.Window
    6. '
    7. Sub New()
    8. SetStyle(ControlStyles.ResizeRedraw Or
    9. ControlStyles.OptimizedDoubleBuffer, True)
    10. End Sub
    11. '
    12. Protected Overrides Sub OnGotFocus(e As EventArgs)
    13. MyBase.OnGotFocus(e)
    14. If BearbeitungsModus Then
    15. Me.BackColor = OnGotFocusColor
    16. End If
    17. End Sub
    18. '
    19. Protected Overrides Sub OnLostFocus(e As EventArgs)
    20. MyBase.OnLostFocus(e)
    21. If BearbeitungsModus Then
    22. Me.BackColor = OnLostFocusColor
    23. End If
    24. End Sub
    25. End Class
    26. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    27. JrgTextBox.OnLostFocusColor = Color.Red
    28. JrgTextBox.OnGotFocusColor = Color.Bisque
    29. JrgTextBox.BearbeitungsModus = True
    30. End Sub

    Amro schrieb:

    Ist Static und Shared das Selbe?
    Ja.
    @VaporiZed OK.
    Also:
    Zentral vergibst Du das Attribut Bearbeitungsmodus und diejenige Instanz, die gerade den Fokus hat, ändert ihr Aussehen.
    Und wenn Du dann mit dem Tab rumklickerst, ist immer die nächste Instanz aktiv.
    OK, dann ist die Herangehensweise in Ordnung.
    Setzt natürlich voraus, dass zum Zeitpunkt des Setzens des Attributs keine der Instanzen den Fokus hat, weil sie es ja erst beim Fokus-Wechsel mitbekommt.
    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:

    das mit den Focus macht jetzt auch Probleme
    Was genau?
    Wie äußert sich das?
    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!
    Jetzt kann man mit der Methode BerbeitungsModusColor Die Farben
    für alle im Projekt befindlichen TextBoxen ändern
    Oder kann die Farben mit GotFocusBackcolor und LostFocusBackColor auch einzeln ändern.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class oTextBox
    2. Inherits System.Windows.Forms.TextBox
    3. '
    4. 'Private Shared Felder
    5. Private Shared _collection As New List(Of oTextBox)
    6. 'Private
    7. Private _bearbeitungsModus As Boolean
    8. Private _gotFocusColor As Color
    9. Private _lostFocusColor As Color '
    10. 'Property
    11. Public Property BearbeitungsModus() As Boolean
    12. Get
    13. Return _bearbeitungsModus
    14. End Get
    15. Set(value As Boolean)
    16. _bearbeitungsModus = value
    17. End Set
    18. End Property
    19. Public Property GotFocusColor() As Color
    20. Get
    21. Return _gotFocusColor
    22. End Get
    23. Set(ByVal value As Color)
    24. _gotFocusColor = value
    25. End Set
    26. End Property
    27. '
    28. Public Property LostFocusColor() As Color
    29. Get
    30. Return _lostFocusColor
    31. End Get
    32. Set(ByVal value As Color)
    33. _lostFocusColor = value
    34. Me.BackColor = value
    35. End Set
    36. End Property
    37. '
    38. 'Public Shared Methoden
    39. Friend Shared Sub BerbeitungsModusColor(gotFocusColor As Color, lostFocusColor As Color)
    40. For Each txtBox As oTextBox In _collection
    41. txtBox.GotFocusColor = gotFocusColor
    42. txtBox.LostFocusColor = lostFocusColor
    43. Next
    44. End Sub
    45. Friend Shared Sub BerbeitungsModus(bearbeitungsModus As Boolean)
    46. For Each txtBox As oTextBox In _collection
    47. txtBox.BearbeitungsModus = bearbeitungsModus
    48. Next
    49. End Sub
    50. '---------------------------------------------------------------
    51. '
    52. Sub New()
    53. SetStyle(ControlStyles.ResizeRedraw Or
    54. ControlStyles.OptimizedDoubleBuffer, True)
    55. _collection.Add(Me)
    56. End Sub
    57. '
    58. 'Overrides
    59. Protected Overrides Sub OnEnter(e As EventArgs)
    60. MyBase.OnEnter(e)
    61. If BearbeitungsModus Then
    62. Me.BackColor = _gotFocusColor
    63. End If
    64. End Sub
    65. '
    66. Protected Overrides Sub OnLeave(e As EventArgs)
    67. MyBase.OnLeave(e)
    68. If BearbeitungsModus Then
    69. Me.BackColor = _lostFocusColor
    70. End If
    71. End Sub
    72. '
    73. End Class



    So kann man das ganze aufrufen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    2. If CheckBox1.Checked Then
    3. oTextBox.BerbeitungsModus(CheckBox1.Checked)
    4. oTextBox.BerbeitungsModusColor(Color.AliceBlue, SystemColors.GradientInactiveCaption)
    5. Else
    6. oTextBox.BerbeitungsModus(CheckBox1.Checked)
    7. oTextBox.BerbeitungsModusColor(SystemColors.Window, SystemColors.Window)
    8. End If
    9. End Sub



    Kritik und Vorschläge wie man es besser machen könnte nehm ich gerne an :)

    Amro schrieb:

    VB.NET-Quellcode

    1. Friend Shared Sub BerbeitungsModusColor(gotFocusColor As Color, lostFocusColor As Color)
    Ich gehe mal davon aus, dass sich diese beiden Farben wähend der Laufzeit nicht ändern.
    Dann kannst Du das auch gleich als reguläre (nicht Shared) Property machen, was im Sinne des Controls mehr Sinn macht.
    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 hab das über die Backcolor eigenschaft gelöst.
    Dadurch das die _collection durchlaufen wird in der For each schleife

    VB.NET-Quellcode

    1. Public Property LostFocusColor() As Color
    2. Get
    3. Return _lostFocusColor
    4. End Get
    5. Set(ByVal value As Color)
    6. _lostFocusColor = value
    7. Me.BackColor = value 'Hier ändert es die Farbe
    8. End Set
    9. End Property

    Die andere Farbe brauch ich ja erst wieder beim Enter der Textbox

    Amro schrieb:

    Ich möchte eine eigenschaft der klasse [...Bearbeitungsmodus...] ändern die sich auf alle Objekte diese klasse auswirkt.
    Ich bin aber nicht Sicher ob das Ok ist.
    Nö - eiglich nich ok.
    Also mit niederem Anspruch ("ist mein Spezial-Control, für meine Spezialfälle") wäre das durchaus ok - wenn du weisst, was du tust.
    Aber ein allgemeingültig gemeintes Control, von dem man sich auch vorstellen könnte, es weiterzugeben - sollte sich nicht so verhalten.
    Sowas nennt man "Seiten-Effekt", wenn eine Aktion Auswirkungen nicht nur auf einen gezielten "Partner" hat, sondern sich in irgendeiner Weise auch auf andere oder völlig andere Elemente auswirkt.
    Seiteneffekte sind prinzipiell unfein - obwohl man zugestehen muss, dass sie ebenso prinzipiell nicht immer vermeidbar sind.

    Jedenfalls wenn einer irgendwo im Code den Bearbeitungsmodus setzt - dass dann alle SuperTextboxes der ganzen Anwendung umschalten - das geht nicht - verletzt das Prinzip der minimalen Überraschung.

    Was anneres wäre, wenns um eine Art Theme ginge, also um eine einheitliche Anwendungs-Optik zu erhalten. Aber Themes sind keine Geschichten, die man zur Laufzeit b.Bed. umschaltet, sondern Themes werden einmalig initial gesetzt.
    Und natürlich in so "Konfigurations-Dialogen", die speziell (und selten) aufgerufen werden, um das Theme zu ändern.

    Amro schrieb:

    Oder halt, wenn es mehrere sind in eine Schleife durchlaufen.
    Das hatten wir bereits ;)
    Ich hatte ja ursprünglich implizit angenommen, was der EDR Dir da geschrieben hat.
    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!