Farbe als Optional Parameter übergeben

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

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Farbe als Optional Parameter übergeben

    HI,

    ich habe eine Prozedur, die optionale Parameter enthält. Für diese Parameter muss ein Default Wert eingetragen werden:

    VB.NET-Quellcode

    1. Private Sub DisableClearDgv(myDgv As DataGridView,
    2. Optional blnClear As Boolean = True,
    3. Optional blnDisable As Boolean = True,
    4. Optional DisableColor As Color = Color.LightGray)


    Den Default für die DisableColor mag der Compiler aber nicht:

    Fehler BC30059 Konstanter Ausdruck erforderlich.

    Ich habe dann versucht eine Konstante mit der Farbe zu definieren:

    VB.NET-Quellcode

    1. Public Const DisabledColor As Color = Color.LightGray


    Das mag der Compiler auch nicht:

    Fehler BC30424 Konstanten müssen einen systeminternen oder enumerierten Typ aufweisen, keinen Klassen-, Struktur-, Typparameter- oder Arraytyp.

    grrrr ....

    Ich habe jetzt das Zauberwort Const weggelassen:

    VB.NET-Quellcode

    1. Public DisabledColor As Color = Color.LightGray
    2. Private Sub DisableClearDgv(myDgv As DataGridView,
    3. Optional blnClear As Boolean = True,
    4. Optional blnDisable As Boolean = True,
    5. Optional DisableColor As Color = DisabledColor)


    Jetzt frisst der Compiler zwar die Definition. Aber als Parameter kann ich das immer noch nicht übergeben:

    Fehler BC30369 Auf einen Instanzmember einer Klasse kann nicht ohne explizite Instanz einer Klasse von einer/m freigegebenen Methode/Member aus verwiesen werden.

    grrrrrrrr .... !

    Also mir scheint, dass mir hier noch irgend etwas Grundlegendes zum Umgang mit den Farben fehlt. :)

    Intellisense hilft mir hier leider auch nicht viel weiter. Kann mir jemand (mit gewohnter Nachsicht) auf die Sprünge helfen ?

    LG
    Peter
    Ja, Color ist kein konstanter Wert, sondern eine Struktur. Schau' mal im Objektbrowser nach.
    Als Workarounf versuch mal:

    VB.NET-Quellcode

    1. Private Sub DisableClearDgv(myDgv As DataGridView,
    2. Optional blnClear As Boolean = True,
    3. Optional blnDisable As Boolean = True,
    4. Optional DisableColor As Color = Nothing)
    5. If DisableColor = Nothing Then
    6. DisableColor = Color.LightGray
    7. End If
    8. End Sub
    Bei stackoverflow hab ich gesehen, dass in erster Linie mit Nullables gearbeitet wird:

    VB.NET-Quellcode

    1. Private Sub DisableClearDgv(myDgv As DataGridView, Optional blnClear As Boolean = True, Optional blnDisable As Boolean = True, Optional DisableColor As Color? = Nothing)
    2. If Not DisableColor.HasValue Then DisableColor = Color.LightGray
    3. '...

    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.

    Peter329 schrieb:

    DisableColor
    Ist das eventuell eine SystemColors?

    VB.NET-Quellcode

    1. Private Sub DisableClearDgv(myDgv As DataGridView,
    2. Optional blnClear As Boolean = True,
    3. Optional blnDisable As Boolean = True,
    4. Optional DisableColor As SystemColors = Color.WHATEVER)
    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!
    Also erst mal Danke für alle Antworten.

    Ok, das verstehe ich, Color ist eine Struktur. Aber was ich nicht verstehe: wieso kann man nicht eine BESTIMMTE Farbe als KONSTANTE abspeichern. Im Debugger wird mir die Farbe als Hexstring mit den jeweiligen Farbanteilen angezeigt. Das könnte ich jetzt natürlich mit der Brechstange nachbilden. Aber mir geht es ja um "saubere" Lösungen.

    Meine Farbe ist KEINE SystemColor ... sondern eine stinknormale mit Color.xxxx wählbare Farbe.

    Ich habe jetzt die Sache mit "nothing" realisiert und das funktioniert natürlich auch. Trotzdem ist das halt nicht so recht befriedigend ...

    LG
    Peter
    Andere Möglichkeit ist eine Überladung ohne diesen Parameter, welche deine Funktion mit diesem Parameter aufruft.
    structs als Konstanten wären tatsächlich manchmal schön. Aber was dir der Debugger als Hexstring anzeigt ist ja alles bereits zur Laufzeit und keine Konstante...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    ~blaze~ schrieb:

    oder?
    Nein.
    @Peter329 Wenn der Compiler einen konstanten Ausdruck haben will, gib ihm einen:

    VB.NET-Quellcode

    1. Private Const ARGB As Integer = &HFFCCDDAA
    2. Private Sub DisableClearDgv(myDgv As DataGridView,
    3. Optional blnClear As Boolean = True,
    4. Optional blnDisable As Boolean = True,
    5. Optional DisableColor As Integer = ARGB)
    6. Dim col = Color.FromArgb(DisableColor)
    7. ' ...
    oder überlade die Prozedur:

    VB.NET-Quellcode

    1. Private Sub DisableClearDgv(myDgv As DataGridView,
    2. Optional blnClear As Boolean = True,
    3. Optional blnDisable As Boolean = True)
    4. DisableClearDgv(myDgv, blnClear, blnDisable, Color.WHATEVER)
    5. End Sub
    6. Private Sub DisableClearDgv(myDgv As DataGridView,
    7. Optional blnClear As Boolean = True,
    8. Optional blnDisable As Boolean = True,
    9. Optional DisableColor As Color)
    10. ' ...
    11. End Sub
    Kann allerdings sein, dass dann der Parameter DisableColor als zweiter Parameter stehen muss.
    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!

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

    RodFromGermany schrieb:

    Kann allerdings sein, dass dann der Parameter DisableColor als zweiter Parameter stehen muss.

    Ziemlich sicher.
    Er darf nämlich in dem Fall NICHT Optional sein und muss deshalb vor den Optional-Parametern stehen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    ErfinderDesRades schrieb:

    Wie post#2 zeigt, gehts doch.
    Da würde ich trotzdem die Überladung faforitisieren, das war früher auch mal Deine Strategie.
    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!