Probleme mit Rectangle -> DesktopRectangle

Ich habe in meinem vorhandenen Code ein kleines Rectangle, dass ich nutze, um den Farb-Picker aufzurufen. Im MouseUp-Event findet sich dazu:

Dim c as Color
Dim b as Boolean
c=me.FillColor
UserDialog.Visible=false
b=Color.SelectedFromDialog(c,"Select a Color")
if b=true then me.FillColor=c
UserDialog.Visible=True
UserDialog.show

Das hat früher (keine Ahnung bis wann) prima funktioniert. Gestern viel mir auf, dass der Farb-Picker immer nur schwarz zurück gibt. Egal welche Farbe ich einstelle.
Also neues Projekt mit neuem Rechteck (warum hat das runde Ecken) Code eingefügt - funktioniert.
OK, Rechteck in altes Projekt kopiert. Aha, ist jetzt DesktopRectangle. Darum die runden Ecken.
Also diversen Code angepasst auf DesktopRectangle.

Ich bekomme nun noch in dieser Zeile:
UserFarbe.Append new FarbPicker

diesen Fehler:
“Expect a type name but found method UserDialog.UserDialog.FarbPicker insted”

Eigentlich will ich lediglich dem Array “UserFarbe” (Typ: DesktopRectangle) ein weiteres Element hinzufügen. Ziel ist, mehrere Rechtecke in dem Fenster zu erzeugen, die ich über das Array ansprechen kann.
Komisch finde ich, dass “UserDialog” in der Meldung doppelt auftaucht. Das Fenster heißt “UserDialog”. Darin gibt es aber kein weiteres “UserDialog”.

Irgendwie stehe ich auf dem Schlauch.
Kann mir mal jemand die Augen öffnen, was ich gerade übersehe?
Danke.

Was für ein Typ ist den FarbPicker?

FarbPicker ist das im Fenster eingesetzte DesktopRectangle.

Ich hoffe, das hilft. Woher das doppelte “UserDialog” in der Fehlermeldung kommt, erschließt sich mir nicht.

Manchmal hilft es schon, über ein Problem zu sprechen :slight_smile:
Ich habe den Fehler gefunden:
FarbPicker war kein kein Control Set. Das stand noch auf “None”.

Jetzt läuft es wieder. :slight_smile:

1 Like

Offenbar verhält sich DesktopRectangle anders als das bisherige Rectangle.

Bisher habe ich ein Initial-Rectangle angelegt und beim Öffnen so viele Rectangle hinzugefügt, wie erforderlich sind:

UserFarbe.Append new FarbPicker // FarbPicker ist das DesktopRectangle
UserFarbe(UBound(UserFarbe)).Visible=true
UserFarbe(UBound(UserFarbe)).Top=y
UserFarbe(UBound(UserFarbe)).Left=x

Leider werden die DesktopRectangle des Array aber nicht angezeigt.
Also im Debugger nachgesehen. Der Code wird ausgeführt, im Fenster gibt es in den Controls aber nur das eine initiale DesktopRectangle.

Der Code hat bisher (mit Rectangle) prima funktioniert und läuft in ähnlicher Weise mit anderen GUI Elementen (Label, CheckBox, PopupMenu, Canvas, RadioButton) weiterhin problemlos.

Kann man bei DesktopRectangle kein Array nutzen? Wie fügt man da weitere Elemente hinzu? Was kann ich übersehen haben?

Neue Erkenntnis:
Ich habe ein neues Projekt mit dem DesktopRectangle erzeugt und meine Methoden hinzu gefügt. Das funktioniert.
Also mein Fenster aus dem vorhandenem Projekt in das neue Projekt eingefügt. Funktioniert nicht.

Kurze Prüfung ergibt, dass anscheinend mein bisheriges Fenster (Window) mit DesktopRectangle nicht korrekt funktioniert. Nutzt man ein DesktopWindow funktioniert es.

Nach Änderung von Window zu DesktopWindow und den Events (Close → Closing, Open → Opening) werden die gewünschten DesktopRectangle an passender Position und mit passender Farbe erzeugt.
Allerdings fehlen nun die anderen GUI-Elemente, die beim Öffnen erzeugt werden (Label, PopupMenu, CheckBox, etc.) und nach Aufruf des FarbPickers (um die Farbe zu ändern) wird das Fenster geschlossen.

Die Umbauarbeiten sind also deutlich umfangreicher als erwartet. :frowning:

Jetzt habe ich mein Fenster umgebaut (zumindest das Meiste) und mal einen Test gemacht.
Die DesktopRectangle werden wieder aufgebaut - Prima.

Das Fenster ist jetzt ein DesktopWindow. Allerdings funktioniert es nicht mehr, das Fenster im Opening-Event in der Größe an meine Wünsche anzupassen:

i=val(NthField(HTMLExport.UserDialogSize,",",1))
j=val(NthField(HTMLExport.UserDialogSize,",",2))
me.Width=val(NthField(HTMLExport.UserDialogSize,",",1))
me.Height=val(NthField(HTMLExport.UserDialogSize,",",2))

i und j haben die passenden Werte. Das Fenster bekommt aber immer die im Inspector angegebenen Werte von 300x300 :frowning:

Gibt es da einen Trick?

Erst mal auf mein ursprüngliches Problem zurück.
Das Rechteck zum Aufruf des FarbPickers ist da, im MouseUp-Event steht:

 Var c  As Color
c = me.FillColor 'Color.CMY(0.35, 0.9, 0.6, 0) // choose the default color shown in color picker
Call Color.SelectedFromDialog(c, "Select a Color")
me.fillcolor=c

Der Picker wird auch aufgerufen und ich kann eine Farbe wählen. Wenn ich den Picker schließe und einen Breakpoint an “me.fillcolor=c” setze, sehe ich, dass die Farbe nicht übernommen wurde.
Also zurück auf Start. Wo war mein neu angelegtes Testprojekt? Dort den Code überprüft, alles identisch.
Breakpoint an derselben Stelle.
Hier funktioniert es.

Es ist zum Haare raufen.
OK. Das Pi-Day Angebot steht noch. Also zugeschlagen, Update eingespielt, die neusten MBS Plugins installiert. Neuer Test.

Leider mit dem selben unbefriedigendem Ergebnis. Wo ist mein Fehler? Hat noch jemand eine Idee, was ich versuchen könnte?
Gibt es einen FarbPicker in den MBS-Plugins?

Kannst Du ein einfaches Beispiel machen?

Ich habe inzwischen mal das Fenster aus dem neuen Projekt (DesktopWindow) in mein bestehendes Projekt kopiert und ein paar grundlegende Methoden, die erforderlichen Variablen und das DesktopRectangle eingefügt. Damit funktioniert es dann.
Es reicht also nicht, das bisherige Window in ein DesktopWindow um zu deklarieren. Mit einem komplett neuen Window scheint es zu funktionieren.
Da wird dann auch wieder die Fenstergröße übernommen.

Fazit:
Wenn bestehende Fenster Probleme machen, ein neues Fenster erzeugen und alle erforderlichen Methoden, Variablen und Controls neu einsetzen.

Ich habe in meinem Bestandsprojekt gut 50 Fenster :frowning:

Danke für die Unterstützung. Ich hoffe, es kommt nicht wieder etwas neues hinzu.

Oh wei. Das Upgrade auf Desktop API 2 habe ich dieses Jahr auch noch auf der To-Do-Liste. Aber ich habe weniger Fenster, dafür eine Menge an ContainerControls.

Klar. NSColorPanelMBS Klasse.

Der Picker wird auch aufgerufen und ich kann eine Farbe wählen. Wenn ich den Picker schließe und einen Breakpoint an “me.fillcolor=c” setze, sehe ich, dass die Farbe nicht übernommen wurde.

so hab ich das benutzt,
bei Ok Knopf bekommt man die Farbe, Fenster schließen ist wie Abbruch. (Xojo 2021 r3.1)

Var col As Color = Me.BackgroundColor

If Color.SelectedFromDialog(col,"select a color") = True Then Me.BackgroundColor = col

So. Jetzt läuft wieder (fast) alles. Lediglich das Ausblenden des Dialoges, wenn der FarbPicker aufgerufen wird, macht noch Probleme. Der Dialog wird ausgeblendet und der FarbpPicker eingeblendet. Wenn ich den FarbPicker über das Schließfeld schließe, wird der ursprünglicher Dialog nicht wieder eingeblendet.
Mein Code:

Var c  As Color
c = me.FillColor 'Color.CMY(0.35, 0.9, 0.6, 0) // choose the default color shown in color picker
'UserDialog.Visible=false
Call Color.SelectedFromDialog(c, "Select a Color")
me.fillcolor=c
'UserDialog.Visible=true

Wenn ich die Kommentare nutze, wird das Fenster UserDialog nicht angezeigt. Auch nicht mit nachfolgendem UserDialog.show

Danke an Christian. Ich schau mir das mal an, möglicherweise ist das die einfachere Lösung. Blöd nur, dass ich jetzt schon alles auf die neue Desktop API 2 umgestellt habe.

@ MarkusR:
Hmm… Die Variante kannte ich noch nicht. Bei meiner Variante über Call bekomme ich einen OK-Knopf. Da kann ich den Dialog nur schließen.

Ist mit Deiner Variante nicht anders. Ich nutze MacOS. Evt. liegt das daran?

Hat noch jemand eine Idee, wie ich mein Fenster nach dem Ausblenden wieder bekomme?

Ausblenden ging dann doch ganz einfach:

Var c  As Color
c = me.FillColor 'Color.CMY(0.35, 0.9, 0.6, 0) // choose the default color shown in color picker
UserDialog.top=UserDialog.top-20000
Call Color.SelectedFromDialog(c, "Select a Color")
me.fillcolor=c
UserDialog.top=UserDialog.top+20000