GlobalFloatingWindow als Palette

Hallo in die Runde.
Ich nutze einige Global Floating Windows als Hilfsfenster zum Einblenden von Zusatzinformationen und diverse Funktionen (also hnlich wie Werkzeugpaletten in Zeichenprogrammen).
Die Fenster sollen nur eingeblendet und genutzt werden knnen, wenn das Hauptfenster aktiv ist. Wird zu einer anderen Anwendung gewechselt oder ein anderes Fenster (z. B. Einstellungen) des Programms geffnet werden, sollen die Hilfsfenster ausgeblendet werden. Gleiches auch beim Minimieren.
Einfach im Deactivate-Event des Hauptfensters die Hilfsfenster ausblenden funktioniert nicht, weil ich die Hilfsfenster dann ausblende, wenn ich eines davon nutzen mchte.

Hat das schon mal jemand umgesetzt und einen Tipp fr mich?

Gru, Stefan Mettenbrink.

wie wre es mit einem Timer, der regelmig schaut, ob window(0) das Hauptfenster ist?
Dann wre das vorne und die Hilfsfenster sollen sichtbar sein.

Hmm…
Dann müsste ich auch prüfen, ob eines der Hilfsfenster vorn ist. Könnte funktionieren.

Gruß, Stefan Mettenbrink.

window(0) ist das vordere Fenster.
Keine Ahnung, ob das dann das Floating Window ist oder das normale.

Warum nutzt Du nicht ein Floating Window (ohne das Global)? Auf dem Mac hat das genau den Effekt, den Du beschrieben hast.

Ich möchte die Funktion genauso unter Windows und Linux nutzen.

Meine derzeitigen Test funktionieren nicht. Ich bastel mal ein Beispielprojekt.

Gruß, Stefan Mettenbrink.

Ich habe mal ein Beispielprojekt erstellt:
http://www.familienbande-genealogie.de/Test/PaletteDemo.zip

Das Projekt enthlt ein Dokumentfenster mit drei BevelButtons, die je ein Global Floating Window ffnen und einen BevelButton,(Window 2), der ein neues Dokumentfenster ffnet.

Die Methode ShowHideGlobal wird von einem globalen Timer alle 500ms aufgerufen. Dort sollen die Palettenfenster ein- bzw. ausgeblendet werden.

Offenbar ist das vorderste Fenster nicht das aktive Fenster (wie bekomme ich das heraus?) und es wird auch nicht erkannt, wenn ich zu einem anderem Programm wechsel.

Mir fehlt also eine Mglichkeit, zu erkennen, ob meine Anwendung die gerade benutzte Anwendung (im Vordergrund) ist und welches Fenster gerade das aktive Fenster ist.

Irgendwelche Tipps?

Gru, Stefan Mettenbrink.

Es wird immer kurioser :frowning:

Ich habe den BevelButton (Main 1) in meinem Beispielprojekt in Toggle gendert und im dortigen Action-Event folgenden Code eingefgt:
Global1.Visible=me.Value

Damit soll das Global Floating Window ein und ausgeblendet werden knnen. Funktioniert bei mir aber nicht.
Habe ich etwas bersehen?
Oder kann man Global Floating Windows nicht wieder einblenden?

Gru, Stefan Mettenbrink.

Versuche es einmal mit .Hide statt .Close. Damit hatte ich auch schon Probleme bei einem Fenster, das immer wieder angezeigt und versteckt werden sollte.

Mit .Hide und .Show funktioniert das ein- und ausblenden.

Mein ursprüngliches Problem bekomme ich dennoch nicht mit Window(0) in den Griff.
Ich habe die App mit einer Variable ausgestattet, die den Visible-Status enthält. Diese Variable setzte ich im Activate-Event der betreffenden Fenster auf true und im Deactivate-Event auf false. Das funktioniert zumindest in meiner Demo-App.


In der Feedback App findet sich bereits ein Hinweis auf nicht funktionierendes .visible für Fenster. Offenbar schon mindestens seit 2013r4.1 :frowning:

Für mich macht das wenig Hoffnung.
Bislang finde ich am Umstieg von REALstudio auf Xojo immer weniger Freude. Ich behebe Probleme, die ich bislang nicht hatte und melde Fehler, die innerhalb des kostenlosen Updatezyklus nicht behoben werden. Damit muss ich wieder einen Haufen Geld in die Hand nehmen, damit mein Programm wieder so läuft, wie es zuvor bereits funktionierte.
Auf meine Anfrage, ob der von mir gemeldete (bestätigte) Fehler bis zum Ablauf meiner Lizenz behoben ist, habe ich nicht mal eine Antwort erhalten. Wenn ich aber sehe, dass der Fehler mit .visible bereits seit drei Jahren nicht behoben wurde, erscheint es mir wenig sinnvoll weiter in Xojo zu investieren.

Bei wem sollte ich meinen Unmut äußern?

Gruß, Stefan Mettenbrink.

Das Problem mit den zu vielen Fehlern ist kein neues. Workarounds gehören zum Programmieren dazu.

Hier ist Code um zu sehen, ob ein Fenster sichtbar ist:

for currentWindow as Integer = 0 to WindowCount - 1 dim theWindow as Window = Window(currentWindow) if theWindow.getWindowName = "MainWindow" then 'das Fenster ist offen end if next

Wünsche trotzdem ein schönes neues, gesundes und hoffentlich nicht zu frustrierendes 2017!

Mein Problem ist nicht, dass ich nicht mitbekomme, ob das Fenster sichtbar ist. Mein Problem ist, dass bisher funktionierender Code jetzt nicht mehr funktioniert. Ich habe keine Lust, Geld in neue Versionen von Xojo zu investieren um dann Fehler in bislang funktionierenden Funktionen von Xojo zu umgehen.

Für mich ist das Hobby, aber wie gehen damit Programmierer um, die mit Xojo Geld verdienen müssen. Die werden sich doch schnell nach Alternativen umsehen.
Selbst wenn meine Zeit kein Geld kostet, bekomme ich durch mein Hobby kein Geld rein. Um so weniger Interesse habe ich an Updates, wenn diese dann nur neue Probleme verursachen.

Dennoch, vielen Dank für die Unterstützung hier im Forum!
Ich bin momentan nur etwas genervt :frowning:

Gruß, Stefan Mettenbrink.

Noch ein abschlieender Hinweis.

Der Fix, .Hide und .Show anstelle von .Visible zu nutzen, funktioniert nicht ganz wie gewnscht. Ich kann zwar die Fenster damit wie gewnscht ausblenden, beim Einblenden erhalten die Fenster mit .Show leider auch den Fokus. Hier muss man dann erneut rumfummeln um das Problem zu umgehen.

Ich wei ja nicht, wie Xojo die Prioritten setzt, aber bei mir haben die Fehlerbereinigungen in bisher funktionierenden Funktionen hchste Prioritt. Das wrde ich mir fr Xojo ebenso wnschen.

Gru, Stefan Mettenbrink.

Ich bin mir nicht sicher, ob das für dich zu einem gangbaren Ergebnis führt, aber so als Grundidee:

Ich denke, dass du ohne einen Timer auskommst. Ich habe deinen Code mal in den Paint-Event von Window1 kopiert und den Timer deaktiviert. Da das Fenster neu gezeichnet wird, wann immer sich der Focus ändert, scheint das gut ohne Timer-Delay zu funktionieren.

Window1 habe ich eine public property Aktiv As Boolean gegeben. Falls Sie false ist, wird Einblenden im Window1.PaintEvent auf jeden Fall auch False.

Zusätzlich habe ich bei den Einblendestellen (also Globalx.Visible = true) noch Globalx.Show aufgerufen. Ansonsten wurde das wieder visible gesetzte GlobalWindow nicht angezeigt.

In App.Activate nun ein

Window1.Aktiv = True und in App.Deactivate das Gegenstück, jeweils gefolgt von Window1.Invalidate, damit der Paint-Event wieder feuert.

Dann werden die Globals brav ausgeblendet, wenn die App in den Hintergrund geht, und sie erscheinen wieder, wenn Window1 den Fokus bekommt. Hast du dir das etwa so gedacht?

P.S. Nicht mehr funktionierender Code könnte mit Änderungen der APIs zu tun haben, die in früheren Versionen mit alten Betriebssystemen noch funktionierten, und für die es mitunter keine Entsprechung mehr gibt. Bin mir in diesem Fall allerdings nicht sicher, aber mal eben an GUI-Zugriffe aus Threads gedacht …

P.P.S.: Ja, da stimmt allerdings was in der Tat nicht. Visible = True macht das Window nicht visible. Der Workaround scheint zu sein, stattdessen Show zu verwenden (und trotzdem visible = false als Gegenstück). Dabei konnte ich auch keinen verschobenen Focus bemerken.

[quote=306619:@Ulrich Bogun]Ich bin mir nicht sicher, ob das für dich zu einem gangbaren Ergebnis führt, aber so als Grundidee:

Ich denke, dass du ohne einen Timer auskommst. Ich habe deinen Code mal in den Paint-Event von Window1 kopiert und den Timer deaktiviert. Da das Fenster neu gezeichnet wird, wann immer sich der Focus ändert, scheint das gut ohne Timer-Delay zu funktionieren.

Window1 habe ich eine public property Aktiv As Boolean gegeben. Falls Sie false ist, wird Einblenden im Window1.PaintEvent auf jeden Fall auch False.

Zusätzlich habe ich bei den Einblendestellen (also Globalx.Visible = true) noch Globalx.Show aufgerufen. Ansonsten wurde das wieder visible gesetzte GlobalWindow nicht angezeigt.

In App.Activate nun ein
Window1.Aktiv = True und in App.Deactivate das Gegenstück, jeweils gefolgt von Window1.Invalidate, damit der Paint-Event wieder feuert.

Dann werden die Globals brav ausgeblendet, wenn die App in den Hintergrund geht, und sie erscheinen wieder, wenn Window1 den Fokus bekommt. Hast du dir das etwa so gedacht?[/quote]

Ja, so war es gedacht.
Danke, dass Du dir das mal angesehen hast!

Ja, wäre denkbar.
Diverse GUI-Zugriffe in Threads hatte ich bisher auch (wurden von REALstudio ja nicht bemängelt, führten aber dann offenbar doch zu gelegentlichen unerklärlichen Abstürzen), inzwischen habe ich die (hoffentlich) alle beseitigt.

Komisch, bei mir führt ein windows.show dazu, dass dieses Fenster auch den Fokus erhält.
Dadurch muss ich im Timer-Event immer zuletzt das Fenster aufrufen, welches im Vordergrund sein soll.

Gruß, Stefan Mettenbrink.

[quote=306650:@Stefan Mettenbrink]Komisch, bei mir führt ein windows.show dazu, dass dieses Fenster auch den Fokus erhält.
Dadurch muss ich im Timer-Event immer zuletzt das Fenster aufrufen, welches im Vordergrund sein soll.[/quote]
Wie gesagt: Da war ich mir nicht sicher, ob es vom Verhalten genau deinen Ansprüchen genügt. Hier mal das modifizierte Projekt zurück. Ist da Window1 im Vordergrund gewesen und die App wird wieder aktiv, hat es dann auch die Menüzeile und ist sofort bedienbar. Lag Window2 vorne, werden die Paletten erst gezeigt, wenn man wieder auf Window1 klickt.

P.S.: <https://xojo.com/issue/29638> habe ich ein paar Punkte gegeben und eine Bestätigung reingesetzt, dass der Bug noch existiert. Nach neuen Releases sind oftmals auch Bugs gefixt, die nicht in den release notes vermerkt wurden. Lohnt sich also, mal eigene Reports zu prüfen und ggf. als gefixt zu markieren – und andernfalls hilft bei alten offenen Bugs eine Bestätigung den Ingenieuren, zu wissen, dass eine Baustelle immer noch offen ist.

Ich habe Dein Beispiel ohne Timer mal mit meinem verglichen und stelle fest, dass bei Dir das Hauptfenster den Focus behält. Das entspricht eher meinen Bedürfnissen. Ich werde also noch mal Zeit investieren und meine App nach Deinem Beispiel umbauen.

Danke für die Unterstützung!

Gibt es eigentlich noch die Betaversionen? Ich habe jetzt noch einen Termin und werde heute nicht mehr dazu kommen, danach zu suchen. Wenn also jemand einen Hinweis hat, wo ich näheres zur Teilnahme am Test der Betaversionen finde, bin ich daran interessiert.

Gruß, Stefan Mettenbrink.

Freut mich, prima!
Betaversionen gibt es nach wie vor, wenngleich im Moment gerade keine, als Bestandteil der Pro-Lizenz. Alyssa ist die Ansprechpartnerin für Beta-Teilnahme.

Irgendwas ist passiert und ich verstehe es nicht.

Gestern habe ich das genderte Demoprojekt getestet und es lief so, wie ich es mir vorgestellt habe.
Heute Morgen habe ich mir gerade ein paar Minuten genommen und meine App entsprechend angepasst - es funktioniert nicht.

Merkwrdig. Also die Demo mit Timer genommen und dort die nderungen eingebaut. Funktioniert auch nicht.
Deine Version ohne Timer ausprobiert, geht auch nicht mehr.
Xojo neu gestartet, Deine Demo luft wieder nicht.

Was ist los? Gestern hatte ich doch getestet und die Demo lief wie gewnscht. Bin ich da irgendwie blind gewesen?

Werden bei Dir die globalen Fenster ausgeblendet, wenn das 2. Hauptfenster geffnet wird?

Bei mir funktioniert es nur beim Wechsel zu einer anderen App.
App.Aktiv im Activate/Deacivate-Event von Window1 hilft nicht, weil dann beim einblenden Deactivate aufgerufen wird und die Fenster nur wild rumflackern.

Deine nderung scheint leider doch nicht zu funktionieren. Oder habe ich etwas bersehen?

Gru, Stefan Mettenbrink.

Das ist recht seltsam. Ich habe die PaletteOhneTimer-Demo noch mal geöffnet und sie verhält sich bei mir wie gewohnt. Die globalen Fenster bleiben auf, wenn das zweite Hauptfenster geöffnet wird.

Wild drauflos geraten: Hast du in eigenen Klassen Inspector Behavior settings eingeführt? Das ist bei mir der beliebteste Punkt für unvorhersehbares Programmverhalten: Irgendeine Property hat einen ganz anderen Wert als gedacht, weil ein Vorgabewert sich da reimgeschummelt hat. Funktioniert es auch nicht mehr, wenn du das Projekt von gestern ummodifiziert öffnest?