Linux: Fenster ausblenden geht nicht? (Xojo 2025)

Ich arbeite an der Software für ein Mess-System, bei dem die Anzeige mit einem Raspberry 4 auf einem 7”-HDMI-Touch-Display läuft. Damit ich an der Software auch am Macbook arbeiten kann, wenn die zugehörige Hardware gerade nicht verfügbar ist, zeigt diese - abhängig vom Betriebssystem (target…) - auf dem Mac ein zusätzliches Fenster, bei dem Slider die Sensordaten liefern. Unter Linux übernehmen das selbstverständlich echte Sensoren.

Unter Linux setze ich das Fenster “simu” eigentlich auf unsichtbar, mit:

if targetLinux then
simu.width = 1
simu. height = 1
simu. top = 1
simu.left = 1
simu.hide
simu.close
end if

Das Problem: Nichts und niemand interessiert sich unter Linux dafür. Das Fenster steht einfach mitten auf dem Hauptfenster (dieses läuft unter Linux im fullscreen mode). Unter MacOS steht es in der richtigen Größe neben dem Hauptfenster (dieses hier nicht im full screen mode), wie es soll.

Wie löse ich das Problem? Danke für Tips.

Wieso instanziierst du das Window denn überhaupt unter Linux…?

Sonst ist eine Vermutung, dass das Fenster mit Implicit Instance = True ist… und wenn irgendwo im Code auch unter Linux dann ein DummySensorWindow.xyz vorkommt, dann wird das möglicherweise wieder angezeigt (wer weiss, ist vielleicht einer der Linux Bugs… kann’s grad nicht ausprobieren).

Daher würde ich in erster Linie empfehlen, diese Window explizit mit Implicit Instance = False zu setzen. Und bewusst NUR unter macOS überhaupt erst instanziieren mit ... = new DummySensorWindow. Damit wär’ auch garantiert, dass das unter Linux gar nie erst geöffnet und gezeigt wird.

Ok, danke, aber erklär mir das mal bitte etwas detaillierter. Ich erstelle ja das Fenster nicht mit “new” quasi aus dem Nichts, sondern lege es im Projekt quasi statisch durch “hinzufügen” an. Wieso wird das Kommando “hide” (ich verstehe das als “sei unsichtbar!”) ignoriert, auch wenn ich versehentlich (ich prüfe das), eine Variable oder Methode aus dem Kontext dieses Fensters ansprechen sollte … ? Und selbst wenn es nicht unsichtbar bzw. im Hintergrund sein sollte: Wieso werden die Größenangaben ignoriert?

Bei deinem Window simu vermute ich, dass - wenn du du beim Inspector oben von “ID” zu dem “Zahnrad” wechselt das Fenester mit aktiviertem Implicit Instance konfiguriert hast.

Ich nehme jetzt einfach mal an, dass dort dann (Slider) Controls drauf sind ausliest, z.B. mit Label1.Text = Simu.Slider1.Value.ToString

Implicit Instance bedeutet, dass das Fenster automatisch instanziiert (und somit auch angezeigt) wird.

Du machst an einer Stelle dann:

simu.hide
simu.close

Das heisst: Fenster wird nicht sichtbar UND du schliesst das Fenster ganz (Instanz geht weg).

Alsbald später dann irgendwo wieder ein z.B. Label1.Text = Simu.Slider1.Value.ToString folgt heisst das: Simu.___ → oh, es gibt dieses Fenster (noch nicht | nicht mehr) → Xojo erzeugt es wie gewünscht automatisch dank dem Implicit Instance.

Das kannst du problemlos auch unter macOS nachvollziehen - es funktioniert wie erwartet (aber nicht wie von dir gewünscht):
simu.xojo_binary_project.zip (5.9 KB)

Im Window1.Open habe ich dein Code Snipplet von oben eingefügt. Eigentlich erwartest du, dass das Fenster “Simu” unsichtbar ist.
Dennoch ist/wird es sichtbar. Du kannst hier das “Simu”-Fenster noch so oft schliessen - es öffnet sich sofort wieder (da Timer darauf zugreift).

Simple Lösung hier:

// NICHT SCHLIESSEN, damit die Instanz dauerhaft
// ausgeblendet und somit nicht sichtbar bleibt
'simu.close

Einfach super gefährlich dieses standardmässig aktivierten Implicit Instance Verhalten…


Ich würde weiterhin empfehlen, eine Property (auf Window1) für das Fenster zu setzen, und es nur unter macOS selber mit new simu zu instanziieren.
Weil dann merkst du sehr schnell, wenn du “aus Versehen” darauf zugreifst - unter Linux würdest du dann erwarten, dass (Window1).mysimuwindow immer nil ist (da nie unter Linux instanziiert) - ein (Window1).mysimuwindow.Slider1.Value.ToString würde dann die erwartete Nil Object Exception geben.


Kurz und knapp: Implicit Instance ist zwar einfach und praktisch - aber auch sehr gefährlich und super anfällig für solche selbst verursachten “Bugs”… tu dir einen Gefallen und kontrolliere selber, welche Fenster du instanziierst und anzeigst.
Und wenn nicht - dann einfach das simu.close auskommentieren und es sollte vermutlich auch so funktionieren. Aber halt unschön, da dieses Fenster bei dir unter Linux ja offenbar gar nicht erst gewünscht ist - es aber doch immer da ist.

Weil du die wegen dem simu.close ja zurücksetzt.
Ein späteres simu.xyz erstellt dir ein neues Fenster - mit seiner Standard Grösse, auch platziert am default-ort wo ein neues Fenster öffnet.

Utilise:

Var newBounds As New DesktopRect(100, 150, 800, 600) // Left, Top, Width, Height
Self.Bounds = newBounds

More in the documentation.

Translate with your browser.

Herzlichen Dank für all die Tips. am Ende konnte ich das Problem mit zwei Methoden lösen, die hier genannt wurden:

  1. window.visible = false - Ja ja, der Wald und die Bäume - ist ja eigentlich sowas von naheliegend!
  2. alle Zugriffe in meinem “real_mode” (Linux) nochmal genau geprüft und einige tatsächlich gefunden und entfernt.

Nun ist “Ruhe im Karton”, alles Bestens!