Seite 1 von 2

Zwei Fenster mit TextGadgets

Verfasst: 15.02.2009 18:37
von Rossi64
Moin!
Mit der Zuordnung von Gadgets zu Fenstern habe ich ein kleines Problem.
Folgender Fall mit PB 4.30(x86):
Zwei Fenster öffnen und in jedes ein TextGadget platzieren.
Nun ist es mir nicht möglich, das erste TextGadget erst nach dem Öffnen des zweiten Fensters zu schreiben (mag ja ein ungewöhnlicher Wunsch sein...), trotz SetActiveWindow().
-> Im ersten Fenster erscheint kein TextGadget; im zweiten Fenster erscheint das TextGadget, welches im ersten Fenster erscheinen sollte.

Das Programm habe ich auf ein Minimum gestutzt, aber ich sehe keinen Fehler. Weiß jemand Rat?

Die Taste "Return" wechselt zwischen den Fenstern.
Hier das gestutzte Programm:

Code: Alles auswählen

#KeyReturn = 0

OpenWindow(0, 0, 0, 300, 100, "Erstes Fenster")
AddKeyboardShortcut(0, #PB_Shortcut_Return, #KeyReturn)
; Variante A, folgende Zeile, richtig: schreibt in das erste Fenster
;TextGadget(0, 0, 0, 200, 20, "Erstes Fenster")

OpenWindow(1, 0, 0, 200, 50, "Zweites Fenster")
AddKeyboardShortcut(1, #PB_Shortcut_Return, #KeyReturn)
TextGadget(1, 0, 0, 200, 20, "Zweites Fenster")
HideWindow(1, 1)

; Variante B, folgende 2 Zeilen, falsch: schreiben in das zweite Fenster:
SetActiveWindow(0)
TextGadget(0, 0, 0, 200, 20, "Erstes! Fenster")

Repeat
  Define event = WaitWindowEvent()
  Select GetActiveWindow()
    Case 0
      Select event
        Case #PB_Event_Menu
          Select EventMenu()
            Case #KeyReturn
              HideWindow(0, 1)
              HideWindow(1, 0)
          EndSelect
      EndSelect ;event
      
    Case 1
      Select event
        Case #PB_Event_Menu
          Select EventMenu()
            Case #KeyReturn
              HideWindow(1, 1)
              HideWindow(0, 0)
          EndSelect
      EndSelect ;event
  EndSelect ;GetActiveWindow
ForEver

Verfasst: 15.02.2009 18:44
von Kaeru Gaman
äh... du hast doch die lösung in den kommentaren drin stehen.
das erzeugen der gadgets findet auf das zuletzt erstellte fenster statt, wenn du nicht UseGadgetList verwendest.

also, wenn du die Gadgets später erzeugen willst als die beiden fenster,
musst du UseGadgetList verwenden... ;)

mit ActiveWindow hat das nix zu tun.

Verfasst: 15.02.2009 18:51
von Rossi64
In der Tat - UseGadgetList() ist relevant, SetActiveWindow() ist hierfür wirkungslos.

Vermutlich kann ich sogar auf das zweite Fenster verzichten, indem ich einfach die GadgetList umschalte, anstelle der Fenster.

Verfasst: 15.02.2009 19:18
von Kaeru Gaman
wie meinst du das jetzt?

die GadgetList gibt nur an, wohin neu erstellte Gadgets gepackt werden.
angezeigt werden immer alle, die nicht "versteckt" sind.

auch Gadgets selber haben Gadgetlisten, können also als Container fungieren.

du kannst also zwei container übereinanderlegen, mit unterschiedlichen Gadgets bepacken,
und abwechselnd sichtbar schalten, um ein Fenster mit wechselndem Inhalt zu bekommen.

aber das hat nichts mit Liste an oder aus zu tun.

Verfasst: 16.02.2009 00:31
von KeyKon
Am einfachsten wäre vll auch ein PanelGadget() wenn ohnehin der Benutzer selbst entscheiden sollte welche Gadgets er grad braucht...

Verfasst: 16.02.2009 17:00
von Andesdaf
Rossi64 hat geschrieben:In der Tat - UseGadgetList() ist relevant, SetActiveWindow() ist hierfür wirkungslos.
Weil SetActiveWindow() dem angegebenen Fenster den Fokus gibt (jedenfalls
im eigenen Programm) und nicht irgendeine GadgetList als aktuell setzt.

Das Problem hätte sich auch mit der Hilfe lösen können, bei SetActiveWindow
steht nix von Gadgetlisten.
Rossi64 hat geschrieben:Vermutlich kann ich sogar auf das zweite Fenster verzichten, indem ich einfach die GadgetList umschalte, anstelle der Fenster.
Du kannst aber nur eine GadgetList pro Fenster erstellen. Für mehrere Gadgetlisten
empfehle ich dir wie Kaeru das ContainerGadget.

Verfasst: 16.02.2009 22:08
von Rossi64
Danke für die Tipps.
Ich fasse das Gelernte zusammen:

Es gibt max. eine GadgetList pro Fenster.
Ein einzelnes Gadget wird automatisch zu einer GadgetList, wenn dem selben Fenster ein weiteres Gadget hinzu gefügt wird.

Wird ein weiteres Fenster geöffnet und dann weitere Gadgets hinzu gefügt, gehören diese zu diesem weiteren Fenster.

Sollen Gadgets anschließend zum ersten Fenster hinzu gefügt werden, ist vorher auf dessen GadgetList mittels UseGadgetList() umzuschalten.

Mehrere Gadgets können in einem ContainerGadget zusammen gefasst werden. Hierzu gibt es z.B. verschiedene Rahmen.
Gadgets und ContainerGadgets können per HideGadget() ausgeblendet werden.

Verfasst: 16.02.2009 22:55
von Kaeru Gaman
> Ein einzelnes Gadget wird automatisch zu einer GadgetList, wenn dem selben Fenster ein weiteres Gadget hinzu gefügt wird.

nope, aber du kannst die Gadgetlist in einem Gadget Nutzen um Child-Gadgets zu diesem Gadget hinzuzufügen.
wenn gadgets zu einem Fenster hinzugefügt werden, landen die in der GadgetList des Fensters.
es ist immer automatisch die GadgetList des zuletzt erstellten Fensters oder Containers aktiv.
diese existiert automatisch mit dem erzeugen des Fensters/Containers.


> Mehrere Gadgets können in einem ContainerGadget zusammen gefasst werden. Hierzu gibt es z.B. verschiedene Rahmen.

fast.
- das ContainerGadget selber besitzt keinen Rahmen, es ist im Grunde unsichtbar.
- das Frame3DGadget ist kein 'echtes' Gadget, sondern nur ein optisches Element,
ohne Events oder sonstige Eigenschaften.

Verfasst: 17.02.2009 02:06
von PMV
Kaeru Gaman hat geschrieben:> Mehrere Gadgets können in einem ContainerGadget zusammen gefasst werden. Hierzu gibt es z.B. verschiedene Rahmen.

fast.
- das ContainerGadget selber besitzt keinen Rahmen, es ist im Grunde unsichtbar.
fast :mrgreen:

Code: Alles auswählen

#PB_Container_BorderLess : Ohne jeden Rahmen (Standard)
#PB_Container_Flat       : Flacher Rahmen 
#PB_Container_Raised     : Erhabener Rahmen 
#PB_Container_Single     : Einfach vertiefter Rahmen 
#PB_Container_Double     : Doppelt vertiefter Rahmen
MFG PMV

Verfasst: 17.02.2009 02:40
von Kaeru Gaman
ah ok....
hab ichs mir falsch gemerkt, oder war es früher eingeschränkter?