Projektvorlage erstellen / Form Eigenschaften überschreiben

  • VB.NET

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

    Projektvorlage erstellen / Form Eigenschaften überschreiben

    Hallo!

    Ich möchte eine Projektmappen-Vorlage selbst erstellen und dabei einige Eigenschaften der Standard-Form überschreiben, wie z.B.:

    das Anzeigen der Color-Werte getrennt durch Komma und nicht durch Semikolon!

    Hat jemand eine Ahnung wie sowas geht?? :whistling:

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

    @Morrison Erstell Dein Projekt und exportiere es als Vorlage, es wird Dir dann bei Neues Projekt erstellen angeboten:
    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, danke!

    ​Aber weiß jemand wie ich die Color Anzeige ändern kann, so das ich statt z.B. "127;160;160" "127,160,160" angezeigt bekomme??
    Das muss doch in der Form selber sein, oder ist das im PropertyGrid so?

    ​Weil ich hab mal ein Template geladen da waren die Color-Angaben durch Komma anstatt mit Semikolon getrennt!
    @Morrison Welche Color-Anzeige meinst Du?
    Da musst Du ggf. nur die Funktion .ToString() überladen.
    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!
    Naja, wenn ich eine neue Windows-Forms-Projektmappe erstelle habe ich eine leere Form.
    Und rechts unten ist das Eigenschaften-Fenster.
    ​Dort stehen die Color-Angaben, wie z.B. BackColor, in Integer-Farbwerten jeweils mit Semikolon getrennt(wenn nicht gerade eine Farbe mit Namen gewählt ist).
    ​Nun hab ich aber mal eine Control-Sammlung gehabt wo die Farbwerte nicht duch Semikolon sondern durch Komma getrennt waren.

    ​Ist das nun eine Eigenschaft des Property-Grids? Weil diese muss die einzelnen Farbangaben ja auch umwandeln können, mit ColorConverter, oder was auch immer..
    ..kann ich diese "Textbox" mit den Integer-Farbwerten umformatieren?!?

    Morrison schrieb:

    Nun hab ich aber mal eine Control-Sammlung gehabt wo die Farbwerte nicht duch Semikolon sondern durch Komma getrennt waren.

    Das ist NICHT trivial.
    Mach' Dich bitte mit den Begriffen UiTypeEditor und vor allem [tt]UITypeConverter [/tt ]vertraut. Im Letzteren kannst Du Du die Darstellung im Propertygrid nach Belieben (auch mit beliebigen Trennzeichen) anpassen.
    BTW:
    Warum vom Entwicklungsstandard abweichen? Mich persönlich würden abweichende Darstellungen im Arbeitsfluss stören ...

    Morrison schrieb:

    ​Ist das nun eine Eigenschaft des Property-Grids?
    Das ist der .ToString()-Wert des Controls.
    Mach Dir ein Test-UserControl mit einer speziellen Property, die die Instanz einer weiteren Color-Klasse ist und gib dieser Dein .ToString().
    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!
    isses nicht.
    Ist der Wert, den der an die Color-Structure attributierte TypeConverter beim Aufruf von ColorConverter.Tostring(color) zurückgibt.
    Achso - mag zufällig dasselbe ergeben wie bei .Tostring - ach schoma garnet "der .ToString() - Wert des Controls". Sondern der Color.

    Wie gesagt: mag zufällig aufs gleiche rauskommen - nur bei der Point-Structure weiss ich, dass TypeConverter und .Tostring unterschiedliches erbringen.

    Was auf jeden Fall aufs gleiche rauskommt ist, dass weder die Color-Structur (und ihre Attributierung), noch den ColorConverter, noch die Form-Property vom Typ Color, noch das PropertyGrid in der IDE kann Morrison irgendwie ändern.
    Wäre auch absolut keine gute Idee.

    Ups - Fehler: Es ist, was der an die Color-Structure dran-attributierte UiTypEditor produziert, wie us4711 schon sagt. Im Falle unbenannter Farben scheint dieser auf den ColorConverter zurückzugreifen.

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

    Eine schöne Gelegenheit, den TypeConverter vorzustellen.
    Bau ein Control:

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Text
    3. Public Class MyControl
    4. Inherits Control
    5. Public Sub New()
    6. MyBase.New
    7. End Sub
    8. <Category("MyColor")>
    9. <TypeConverter(GetType(MyColorTypeConverter))>
    10. Public Property MyColor As Color = Color.Red
    11. End Class

    Füge eine Color-Property hinzu und dekoriere diese mit einem Typeconverter:

    VB.NET-Quellcode

    1. Public Class MyColorTypeConverter
    2. Inherits TypeConverter
    3. Public Overrides Function CanConvertTo(context As ITypeDescriptorContext, destinationType As Type) As Boolean
    4. Return True
    5. End Function
    6. Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    7. If destinationType Is GetType(String) AndAlso Not value Is Nothing AndAlso value.GetType Is GetType(Color) Then
    8. Dim col = CType(value, Color)
    9. Dim sb As New StringBuilder
    10. sb.Append("Alpha: " & col.A.ToString & ", ")
    11. sb.Append("Rot: " & col.R.ToString & ", ")
    12. sb.Append("Gelb: " & col.G.ToString & ", ")
    13. sb.Append("Blau: " & col.B.ToString)
    14. Return sb.ToString
    15. Else
    16. Return value
    17. End If
    18. End Function
    19. End Class

    In der Überladung CanConvertTo kann geprüft werden, ob eine Umwandlung möglich sein soll (das hängt dann u.U. von anderen Umständen ab).
    In ConverttTo wird dann die tatsächliche Umwandlung in einen beliebigen String vorgenommen.
    Also: Möglich, aber aufwendig. Un das dann für JEDE Property des Forms...
    Ich füge das Testprojekt bei.
    Dateien
    nur morrison nützt das nichts, weil er kann die Background-Property der Form-Klasse nicht neu programmieren.
    Ausserdem bezweifel ich dass das hülfe, denn wie gesagt: Was im Propertygrid angezeigt wird ist der UITypeEditor - nicht der TypeConverter.
    Also wers genau wissen will, kann ja mal im IlSpy nachschauen, oder auf Rosylin (heisst jetzt anders, habich vergessen, wie).
    Nee, nee, die Anzeige im Propertygrid ist schon die Ausgabe des TypeConverters, denn genau dazu ist er ja da.
    Und natürlich kann er die BackgroundColor-Property überschreiben, nämlich mit

    VB.NET-Quellcode

    1. Public Overrides Property BackColor As Color
    .
    Und die kann er dann wieder mit einem TypeConverter dekorieren.
    Hallo!

    Das Beispiel von us4711 klappt sehr gut!

    ​Nun ist aber das nächste Problem das ich im "DropDownMenu" keine Usereingaben machen kann! Wo die Werte stehen habe ich nur "ReadOnly"!
    ​Ich kann zwar verschiedene Farben angeben und ändern und bekomme auch die jeweiligen Farbwerte, kann aber dort keine Eingabe tätigen!!

    ​Ist das Absicht? ;(
    ma im ernst - willst du das verwenden?
    Alle Controls haben iwelche Color-Properties, und die werden einheitlich über den Standard abgefackelt.
    Aber bei eigenen CustomControls willst du davon nu abweichen, und eine Spezial-Präsentation einführen?

    Und bei mir funzt das mit Form.BackColor eben nicht.

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

    Morrison schrieb:

    kann aber dort keine Eingabe tätigen!!

    Ja, guck Dir die Definition von UITypeConverter an. Da gibt's weitere Überladungen, z.B. CanConvertFrom und ConvertFrom. Damit wäre Dein Vorhaben umsetzbar.
    Hilfreich kann auch sein Getting the Most Out of the .NET Framework PropertyGrid Control
    @Morrison
    Hier ein kleines Beispiel, wie man im Propertygrid auch Daten eingeben kann. Weiter unten dann das angepasste Testprojekt.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Imports System.Globalization
    3. Imports System.Text
    4. Public Class MyControl
    5. Inherits Control
    6. Public Sub New()
    7. MyBase.New
    8. Me.BackColor = Color.DarkGray
    9. End Sub
    10. <Category("MyColor")>
    11. <TypeConverter(GetType(MyColorTypeConverter))>
    12. Public Property MyColor As Color = Color.Red
    13. <Category("MyColor")>
    14. <TypeConverter(GetType(MyColorTypeConverter))>
    15. Public Overrides Overloads Property BackColor As Color
    16. Get
    17. Return MyBase.BackColor
    18. End Get
    19. Set(value As Color)
    20. MyBase.BackColor = value
    21. Me.Invalidate()
    22. End Set
    23. End Property
    24. End Class
    25. Public Class MyColorTypeConverter
    26. Inherits TypeConverter
    27. Public Overloads Overrides Function CanConvertTo(ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
    28. If (destinationType Is GetType(Color)) Then
    29. Return True
    30. End If
    31. Return MyBase.CanConvertFrom(context, destinationType)
    32. End Function
    33. Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
    34. If destinationType Is GetType(String) AndAlso Not value Is Nothing AndAlso value.GetType Is GetType(Color) Then
    35. Dim col = CType(value, Color)
    36. Dim sb As New StringBuilder
    37. sb.Append(col.ToString & ", ")
    38. sb.Append("Alpha: " & col.A.ToString & ", ")
    39. sb.Append("Rot: " & col.R.ToString & ", ")
    40. sb.Append("Grün: " & col.G.ToString & ", ")
    41. sb.Append("Blau: " & col.B.ToString)
    42. Return sb.ToString
    43. Else
    44. Return value
    45. End If
    46. End Function
    47. Public Overloads Overrides Function CanConvertFrom(ByVal context As ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
    48. If (sourceType Is GetType(String)) Then
    49. Return True
    50. End If
    51. Return MyBase.CanConvertFrom(context, sourceType)
    52. End Function
    53. ' Muster: A:255#R:255#G:255#B:255#
    54. Public Overloads Overrides Function ConvertFrom(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal value As Object) As Object
    55. If (TypeOf value Is String) Then
    56. Try
    57. Dim Alpha As Int32 = 255
    58. Dim Red As Int32 = 0
    59. Dim Green As Int32 = 0
    60. Dim Blue As Int32 = 0
    61. Dim values = CStr(value).ToUpper.Split(","c)
    62. For Each val As String In values
    63. Dim a = val.Split(":"c)
    64. Select Case True
    65. Case a(0).Trim = "ALPHA"
    66. Int32.TryParse(a(1), Alpha)
    67. Case a(0).Trim = "ROT"
    68. Int32.TryParse(a(1), Red)
    69. Case a(0).Trim = "GRÜN"
    70. Int32.TryParse(a(1), Green)
    71. Case a(0).Trim = "BLAU"
    72. Int32.TryParse(a(1), Blue)
    73. Case Else
    74. ' vorangestellte Farbeinfo ignorieren
    75. 'MessageBox.Show(a(0))
    76. End Select
    77. Next
    78. Dim col As Color = Color.FromArgb(Alpha, Red, Green, Blue)
    79. Return col
    80. Catch
    81. Throw New ArgumentException("Can not convert '" & CStr(value) & "' to type color")
    82. End Try
    83. End If
    84. Return MyBase.ConvertFrom(context, culture, value)
    85. End Function
    86. End Class
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „us4711“ ()

    Morrison schrieb:

    muss ich allerdings VS neu starten
    Ein Rebuild All sollte reichen:
    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!