Benutzer mit den meisten Antworten
Problem mit ColorTranslator

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-FarbeDas lese ich in ein Array
Public farbP(,) As String mit farbP = sysColorsADann 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
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
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 -
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
-
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.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 4. März 2020 12:36
-
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
-
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 largeGruß,
DimitarBitte 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.
-
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
-
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