none
Problem mit ColorTranslator RRS feed

  • Frage

  • Hallo zusammen,

    ich habe in meinem Programm ein Array mit den Sysremfarben derart:
    Public sysColorsA As Array =
        {
        {"sysScrollBars“, "&H80000000“},              ' Farbe der Bildlaufleiste
        {"sysDesktop“, "&H80000001“}}                ' Desktop-Farbe

    Das lese ich in ein Array
        Public farbP(,) As String  mit  farbP = sysColorsA

    Dann extrahiere ich in das Array     Public Shared farbValues() As Double  mit
            For i As Short = 0 To (farbP.Length / 2) - 1
                farbValues(i) = farbP(i, 1)
            Next
    Das Problem taucht auf, wenn ich mache
                    Dim c As Color
                    c = ColorTranslator.FromOle(farbValues(i))

    da erhalte ich die Meldung
    System.OverflowException: "Die arithmetische Operation hat einen Überlauf verursacht."

    Ich sehe nicht, warum dieser Fehler kommt...

    Grüße-




    Dietrich

    Freitag, 14. Februar 2020 13:46

Antworten

  • Hallo zusammen,
    nachfolgend meine derzeitige Lösung. Ich habe eine Funktion, die alle Systemfarben in einer Liste List(Of Color) speichert. Aus dieser Liste kann dann recht einfach eine Farbe ausgewählt und weiter verwendet werden.
    Hier die Funktion:
    'SystemColors listen
       Public Function GetSystemColors() As List(Of Color)
          'Ergebnis in List
          Dim type As Type = GetType(SystemColors)
          Dim properties As PropertyInfo() = type.GetProperties()
          Dim list As List(Of Color) = New List(Of Color)()
          For Each [property] As PropertyInfo In properties
             If GetType(Color).IsAssignableFrom([property].PropertyType) Then
                list.Add(CType([property].GetValue(Nothing, Nothing), Color))
             End If
          Next
          Return list
       End Function
    Anwenden mit dem Aufruf zum Erzeugen der Liste:
       Dim listSysColors As List(Of Color)
       listSysColors = GetSystemColors()

    Anwenden zur Auswahl einer Farbe via Index i:
       farbValue = Color.FromName(listSysColors.Item(i).Name).ToArgb

    Grüße-

    Dietrich

    • Als Antwort markiert dherrmann Sonntag, 8. März 2020 16:55
    Sonntag, 8. März 2020 16:55

Alle Antworten

  • Hallo Dietrich,

    abgesehen davon, dass ich nicht so wirklich verstehe, was genau Du da eigentlich machst, ist für mich nachvollziehbar, wo genau der Fehler auftritt, welchen Wert "i" in deinem Fall hat, was genau in farbValues(i) in diesem Moment steht, usw.

    Poste doch bitte einen vollständigen und lauffähigen Code (lauffähig bis zum Fehler). Dann kann man sich das auch mal anschauen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 14. Februar 2020 14:08
    Moderator
  • Entschuldigung, sehe gerade, dass mein erster Post ein wenig unklar formuliert ist...

    Mein Programm arbeitet mit ca. 30 Arrays, die Paletten-Daten in der Form wie bei sysColorsA speichern. Eine der Paletten ist die aller SystemFarben. Hier im Beispiel habe ich das Feld sehr gekürzt.

    Hier ein Codebeispiel:

    Public sysColorsA As Array =
        {
        {"sysScrollBars“, "&H80000000“},              ' Farbe der Bildlaufleiste
        {"sysDesktop“, "&H80000001“}                  ' Desktop-Farbe
        }
    
    Public farbP(,) As String
    Public farbValues() As Double
    Dim c As Color
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    	Handles Button1.Click
    
    farbP = sysColorsA
    ReDim farbValues((farbP.Length / 2) - 1)
    For i As Short = 0 To (farbP.Length / 2) - 1
          farbValues(i) = farbP(i, 1)
          c = ColorTranslator.FromOle(farbValues(i))
    Next
    
    End Sub
    
    In der Zeile c=...  tritt der oben genannte Fehler auf.


    Dietrich

    Freitag, 14. Februar 2020 15:21
  • Hallo Dietrich,

    farbP = sysColorsA

    An dieser Zeile meckert der Compiler, weil so eine implizite Konvertierung mit der Option Strict On nicht zulässig ist. Mit der Option Strict Off erhalte ich die von Dir angeführte Fehlermeldung. Es ist grundsätzlich empfehlenswert, die Option Strict On zu verwenden. Zu diesem Zweck kann Dein Code (bis auf die zwei hexadezimalen Werte) wie folgt angepasst werden:

        Public sysColoursA(,) As String = New String(1, 1) {{"sysScrollBars", "&H80000000"}, {"sysDesktop", "&H80000001"}}
    
        Public farbP(,) As String
        Public farbValues() As Integer 'die Methode ColorTranslator.FromOle erwartet einen Integer-Wert
        Dim c As Color
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            farbP = sysColoursA
            ReDim farbValues(CType((farbP.Length / 2), Integer) - 1)
    
            For i As Short = 0 To CType((farbP.Length / 2 - 1), Short)
                farbValues(i) = CType(farbP(i, 1), Integer)
                c = ColorTranslator.FromOle(farbValues(i))
            Next
        End Sub

    Die zwei Werte liegen über dem für Integer zulässigen Wertebereich, weil &H80000000 = 2 147 483 648 (Dezimal). Mit Zahlen, die kleiner als &H80000000 sind, ist der Code lauffähig.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 4. März 2020 12:34
    Administrator
  • Hallo Dimitar, danke für den Tipp.

    Allerdings geht es genau um die Werte für die Systemfarben und die sind eben &H80000000 usw. codiert.

    Grüße-


    Dietrich

    Freitag, 6. März 2020 08:13
  • 	Public Enum sysColors
    		sysScrollBars = &H80000000					 ' Farbe der Bildlaufleiste
    		sysDesktop = &H80000001						 ' Desktop-Farbe
    		sysActiveTitleBar = &H80000002			 ' Farbe der Titelleiste des aktiven Fensters
    		sysInactiveTitleBar = &H80000003			 ' Farbe der Titelleiste des inaktiven Fensters
    		sysMenuBar = &H80000004						 ' Menühintergrundfarbe
    		sysWindowBackground = &H80000005			 ' Fensterhintergrundfarbe
    		sysWindowFrame = &H80000006				 ' Fensterrahmenfarbe
    		sysMenuText = &H80000007					 ' Farbe des Menütextes
    		sysWindowText = &H80000008					 ' Farbe des Textes in Fenstern
    		sysTitleBarText = &H80000009				 ' Farbe des Titeltextes, des Größeneinstellungsfeldes und des Bildlaufpfeils
    		sysActiveBorder = &H8000000A				 ' Rahmenfarbe des aktiven Fensters
    		sysInactiveBorder = &H8000000B			 ' Rahmenfarbe des inaktiven Fensters
    		sysApplicationWorkspace = &H8000000C	 ' Hintergrundfarbe von MDI-Anwendungen (MDI = multiple-document interface)
    		sysHighlight = &H8000000D					 ' Hintergrundfarbe von Elementen, die in einem Steuerelement ausgewählt wurden
    		sysHighlightText = &H8000000E				 ' Textfarbe von Elementen, die in einem Steuerelement ausgewählt wurden
    		sysButtonFace = &H8000000F					 ' Farbe der Schattierung der Oberfläche einer Befehlsschaltfläche
    		sysButtonShadow = &H80000010				 ' Farbe der Schattierung am Rand einer Befehlsschaltfläche
    		sysGrayText = &H80000011					 ' Abgeblendeter (deaktivierter) Text
    		sysButtonText = &H80000012					 ' Farbe des Schaltflächentextes
    		sysInactiveCaptionText = &H80000013		 ' Textfarbe eines inaktiven Titels
    		sys3DHighlight = &H80000014				 ' Markierungsfarbe für dreidimensional angezeigte Elemente
    		sys3DDKShadow = &H80000015					 ' Farbe des dunkelsten Schattens für 3D-Elemente
    		sys3DLight = &H80000016						 ' Zweithellste Farbe für dreidimensional angezeigte Elemente nach sys3Dhighlight
    		sysInfoText = &H80000017					 ' Farbe des QuickInfo-Textes
    		sysInfoBackground = &H80000018			 ' Hintergrundfarbe des QuickInfo-Textes
    	End Enum
    
    Hier mal die Codes für die Systemfarben.

    Dietrich

    Freitag, 6. März 2020 08:15
  • Hallo Dietrich,

    Für die Systemfarben ist in .NET Framework die SystemColors-Klasse vorgesehen. Sieh Dir auch diesen Thread an, der Deinem Anliegen entspricht:
    ColorTranslator.FromOle(0x8000000f) number too large

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 6. März 2020 11:01
    Administrator
  • Danke, Dimitar, mein Anliegen ist aber, die numerischen Werte zu verwenden, weil nur die bspw. in einer Datenbank speicherbar sind.

    Hier mal die dezimalen Werte zu den oben gezeigten Systemfarben:
    2147483648
    2147483649
    2147483650
    2147483651
    2147483652
    2147483653
    2147483654
    2147483655
    2147483656
    2147483657
    2147483658
    2147483659
    2147483660
    2147483661
    2147483662
    2147483663
    2147483664
    2147483665
    2147483666
    2147483667
    2147483668
    2147483669
    2147483670
    2147483671
    2147483672
    Und die erzeugen eben den arithmetischen Überlauf....

    Grüße-


    Dietrich

    Samstag, 7. März 2020 08:48
  • Hallo zusammen,
    nachfolgend meine derzeitige Lösung. Ich habe eine Funktion, die alle Systemfarben in einer Liste List(Of Color) speichert. Aus dieser Liste kann dann recht einfach eine Farbe ausgewählt und weiter verwendet werden.
    Hier die Funktion:
    'SystemColors listen
       Public Function GetSystemColors() As List(Of Color)
          'Ergebnis in List
          Dim type As Type = GetType(SystemColors)
          Dim properties As PropertyInfo() = type.GetProperties()
          Dim list As List(Of Color) = New List(Of Color)()
          For Each [property] As PropertyInfo In properties
             If GetType(Color).IsAssignableFrom([property].PropertyType) Then
                list.Add(CType([property].GetValue(Nothing, Nothing), Color))
             End If
          Next
          Return list
       End Function
    Anwenden mit dem Aufruf zum Erzeugen der Liste:
       Dim listSysColors As List(Of Color)
       listSysColors = GetSystemColors()

    Anwenden zur Auswahl einer Farbe via Index i:
       farbValue = Color.FromName(listSysColors.Item(i).Name).ToArgb

    Grüße-

    Dietrich

    • Als Antwort markiert dherrmann Sonntag, 8. März 2020 16:55
    Sonntag, 8. März 2020 16:55