Zwei Fenster mit TextGadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Rossi64
Beiträge: 9
Registriert: 01.12.2008 21:17

Zwei Fenster mit TextGadgets

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Rossi64
Beiträge: 9
Registriert: 01.12.2008 21:17

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Am einfachsten wäre vll auch ein PanelGadget() wenn ohnehin der Benutzer selbst entscheiden sollte welche Gadgets er grad braucht...
(\/) (°,,,°) (\/)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag 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.
Win11 x64 | PB 6.20
Rossi64
Beiträge: 9
Registriert: 01.12.2008 21:17

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ah ok....
hab ichs mir falsch gemerkt, oder war es früher eingeschränkter?
Antworten