ColorGroup Mode Verwirrung

Leider ist die Doku zu der Klasse ColorGroup etwas dürftig, oder ich bin zu blöd…
Im folgenden Beispiel Code, sieht es so aus, dass wenn der Mode der ColorGroup einmal festgelegt ist, also von NONE auf irgendwas gewechselt ist, der Mode für immer fest ist.

Var cg As New ColorGroup
Var cArray() As Color

Var mode As ColorGroup.Modes

mode = cg.Mode
// 1. Break The mode is "NONE" This is OKAY
Break

cg.AddColor(ColorGroup.Platforms.Current, &c11111100)
mode = cg.mode
cArray = cg.Values
// 2. BreakThe mode is "DUAL" this is wrong! should be "SINGLE" but there ar now 2 same colors in the array
Break

cg.AddColorPair(ColorGroup.Platforms.Current, &c22222200,&c33333300)
mode = cg.Mode
cArray = cg.Values
//  3. Break The mode is "DUAL" this is OK but now the colors are from break 2 not from the addColorPair
Break

cg.AddColor(ColorGroup.Platforms.Current, &c44444400)
mode = cg.mode
cArray = cg.Values
// 4. Break The mode is "DUAL" this is wrong! should be "SINGLE" and the colors are from break 2, where is the prev addColor
Break

Oder ist das ein Bug ??? Oder hab ich es nicht verstanden ?

Juergen

Das sieht echt komisch aus. Kann die Farbe einer ColorGroup nur einmal gesetzt werden? Und mode sieht falsch aus. Ich konnte dazu keinen Bug-Report finden.

Xojo 2022r3 unter macOS Ventura.

Ich würde eher darauf tippen, das es ein Verständnisproblem ist, kein Bug. So wie ich die Dokumentation verstehe besteht eine Farbgruppe besteht immer aus zwei Farbangaben (eine für den Hellmodus, eine für den Dunkelmodus). Die Modi geben nur an, wie die Farben verwendet werden sollen, Single bedeutet “nimm eine Farbe für Hell und Dunkel - beide Farbangaben enthalten also die gleiche Farbe”… AddColor() trägt also eine Farbe bei beiden Werten der Farbgruppe ein, AddColorPair() erlaubt das gezielte Setzen einer Farbe für den Hell- und einer Farbe für den Dunkelmodus.

Ob AddColor() und AppColorPair() die vorhandenen Werte überschreiben sollen oder die neuen ergänzen, kann ich jetzt nicht beurteilen - ich setze bisher die Werte einer ColorGroup nur einmal und ändere sie dann nicht mehr…

Danke euch beiden!
Um die Unklarheiten zu beseitigen, habe ich mal ein Issue erstellt.

Da mich die ColorGroup echt nervt, habe ich in der Zwischenzeit eine eigene Klasse erstellt, die logisch arbeitet. ich werde sie nochmal überarbeiten und dann den Link hier posten, vielleicht kann es ja der eine oder andere gebrauchen.

Mein Farbsetup, das ich mit ColorGroup machen wollte hat mich Tage an Zeit und Nerven gekostet…

Dies ist momentan meine selbst kreierte Lösung:

WTEC_ColorGroup

Einfach “einfach”…hoffentlich :slight_smile: Zumindest bis ich meinen ColorGroup Horizont erweitert habe…

Ich arbeite an einem Programm, das Farben für die Wiedergabe von Handschriften verwendet. ZB. Randbemerkungen von Setzern in Rot, Blau etc. Also die Angabe der Schreibfarbe (Braune Tinte etc.). Bisher ging das problemlos mit einem Rectangle und Fillcolor. Die Farbe als String in die Datenbank etc.

Jetzt gibt aber das Rectangle eine ColorGroup zurück. Ein nur ganz klitzekleines Beispiel, wie ich daraus eine simple Farbe mache, is wohl zuviel verlangt. Es gibt Situationen, in denen eine Farbe Tag und Nacht als die eine Farbe signifikant ist und nicht verändert werden darf. Man muss nicht alles dem Tag-Nacht-Schnickschnack unterwerfen und wenn, dann bitte mit bescheidenen Angaben, wie man das alte Ding retten kann.

Ist doch in der Dokumentation zur ColorGroup aufgeführt: ColorGroup.Values gibt Color() zurück.

Ich hab jetzt mit einem kleinen Test mal nachgeschaut: das Resultat der ColorGroup heisst “UndefinedColorCallback = NIL”
Der Code:
//Das Beispiel ist von Xojo, das Rectangle mit dem MouseUP von mir. Farbe ist Korrekt

Sub MouseUp(x As Integer, y As Integer)
Var c As Color
Var b As Boolean
c = Color.CMY(0.35, 0.9, 0.6, 0) ’ choose the default color shown in color picker
b = Color.SelectedFromDialog(c, “Select a Color”)
me.FillColor = c
me.Refresh
Var cg as new ColorGroup
cg = me.FillColor
Break

End Sub

PS: das Resultat ist durchgehend wie genannt, auch im Debugger und den Werten des Rectangle - und auch nach dem Refresh. Das Rectangle gibt schlicht nix gescheites zurück.

Der Wert muss natürlich noch ausgelesen werden, z.B. so:

Var cX() As Color
cX = cg.Values

Ich gestehe, dass ich die Doku zu diesen ColorGroups schlicht nicht kapiere.

Xojo war einmal eine Sprache für Leute, die bereit waren, das Programmieren zu lernen, also zB. für Literaturwissenschafter, wie ich es bin, die sich mit Edition und sehr besonderen technischen Fragen (diplomatische Wiedergabe von Texten etc.) beschäftigen und deshalb mit einem Spagat leben, den auszuhalten nicht gerade einfach ist. Informatiker verstehen i.d.R. nicht, was wir wollen und wir verstehen i.d.R. nicht, was die Informatik an kognitiven Grundstrukturen verlangt. Und für diese “Brücke” war Xojo ein sehr gutes Instrument. Kommt noch die Lauffähigkeit auf verschiedenen Systemen dazu. Nun habe ich nichts dagegen, wenn neue Features dazu kommen, sehr wohl aber, wenn sie die alten einfach in den Abfall werfen. Eine Änderung wie beim Rectangle kann sehr grosse Folgen nach sich ziehen, wenn man nicht daran denkt, dass die konkreten Folgen für Anwendungen für die Hersteller der Sprache schlicht nicht zu überblicken sind. Man kann ja z.B. auch 2 Versionen eines Rectangles anbieten, dann wäre der Spuk vorbei.

Das funktioniert. Danke (Warum ist mir aber völlig unklar. Wie gesagt, ein kleines Beispiel wäre gut.)

Nur ein kleine Anmerkung für das Verständnis: Wenn die Doku sagt “ColorGroup.Values gibt Color() zurück.”, dann versuche ich - weil nur eine Farbe - dort eine 0 hineinzusetzen. Habe ich auch versucht, weil für mich Color() ein Array ist. Akzeptiert aber der Compiler nicht. Offensichtlich - und das ist ja beileibe kein Vorwurf - ist Ihnen klar, dass es sich da nicht um einen Array handelt (wie ich das gelernt habe), aber ich stehe dann eben im Nebel (und weiss jetzt noch nicht, um was für einen Typ es sich da handelt.

Color enthielt bisher genau einen Wert, ColorGroup kann einen oder zwei Werte enthalten - man muss also etwas anders damit umgehen.
ColorGroup.Values gibt den oder die Werte zurück - die liest man in ein Array ein und holt sich dann von dort den gesuchten Wert,

Betriebssyteme und Programmiersprachen sind sehr dynamische Sachen, die sich (schnell) ändern. Xojo hat ja alle “alten” Sachen beibehalten (man kann Rectangle - API 1 - ja immer noch verwenden), beim DeskTopRectangle kommt halt die API 2 zum Einsatz.

Es geht ja nicht ums Streiten, was Sie sagen ist alles ok. Für mich - und das sage ich jetzt als Sprachwissenschafter - ist es eben neu das “Einlesen in einen Array”, das überhaupt nicht evident ist. Da geht es auch nicht um API2, sondern darum, dass .values nochmals eingelesen werden muss, was überhaupt nicht selbsterklärend ist. Da ich schon über 20 Jahre mit RealBasic und dann Xojo arbeite (heute mehr als Hobby, ich bin jetzt 78) weiss ich schon, wie dynamisch die Sache ist (das ist auch gut so). Es gibt aber nicht nur Datenstrukturen, sondern auch kognitive Strukturen, die massiv von der Sprache abhängen. Und an diesem kleinen (und eigentlich unwichtigen Teil) werden die kognitiven Strukturen für mich ohne Erläuterung verletzt. Das betrifft ganz einfach das Textverstehen - den Code und seine Erläuterung. Für mich war da immer Niklaus Wirth ein Vorbild.

1 Like