Seite 1 von 2

TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 21.10.2014 19:44
von stevie1401

Code: Alles auswählen

exepath.s=GetCurrentDirectory()
Bilderordner.s=exepath+"inc/bilder/"
Kartenordner.s=BilderOrdner+"karten/"
MeinkartenOrdner.s=KartenOrdner+"Karten4/"

ButtonBackColor = RGB(50, 37, 27)
ButtonForeColor = RGB(207, 186, 167)

UseJPEGImageDecoder()
UsePNGImageDecoder()


LoadImage(0, bilderordner+"sonderregeltisch64.png")

If OpenWindow(0, 0, 0, 1200, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_Maximize)
  SetWindowColor(0,ButtonForeColor)
    TreeGadget(0, 10, 10, 600, 300)                                         ; TreeGadget Standard
    SetGadgetColor(0, #PB_Gadget_BackColor, ButtonForeColor)
    
      For a = 1 To 10
        
        AddGadgetItem (0, -1, "Tisch "+Str(a), ImageID(0), 0)        ; benutzen Sie ImageID(x) als 4. Parameter
        AddGadgetItem(0, -1, "Spieler 1", 0, 1)     ; diese sind auf dem ersten Sublevel
        AddGadgetItem(0, -1, "Spieler 2", 0, 1)
        AddGadgetItem(0, -1, "Spieler 3", 0, 1)
        AddGadgetItem(0, -1, "Spieler 4", 0, 1)
       
      Next
      
      
      
      
      
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
  
  
  
  

Ich möchte die SubItems, also die Spieler an den Tischen, sofort öffnen und sichtbar machen, ohne dass ich auf den Pfeil klicken muss.
Geht das irgendwie? (Für alle Betriebssysteme)

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 21.10.2014 19:57
von NicTheQuick
Das geht mit 'SetGadgetItemState(0, id, #PB_Tree_Expanded)'.

Code: Alles auswählen

ButtonBackColor = RGB(50, 37, 27)
ButtonForeColor = RGB(207, 186, 167)

UseJPEGImageDecoder()
UsePNGImageDecoder()


If OpenWindow(0, 0, 0, 1200, 180, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_Maximize)
	SetWindowColor(0,ButtonForeColor)
	TreeGadget(0, 10, 10, 600, 300)                                         ; TreeGadget Standard
	SetGadgetColor(0, #PB_Gadget_BackColor, ButtonForeColor)
	
	Define id.i = 0
	For a = 1 To 10
		
		AddGadgetItem (0, id, "Tisch "+Str(a))        ; benutzen Sie ImageID(x) als 4. Parameter
		AddGadgetItem(0, id + 1, "Spieler 1", 0, 1)						 ; diese sind auf dem ersten Sublevel
		AddGadgetItem(0, id + 2, "Spieler 2", 0, 1)
		AddGadgetItem(0, id + 3, "Spieler 3", 0, 1)
		AddGadgetItem(0, id + 4, "Spieler 4", 0, 1)
		; Wichtig ist das nach dem Hinzufügen der Kindknoten zu tun, sonst geht es nicht.
		SetGadgetItemState(0, id, #PB_Tree_Expanded)
		id + 5
	Next

	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 21.10.2014 23:15
von stevie1401
Prima! Das ist genau das, was ich brauchte.
Vielen Dank!

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 23.10.2014 15:59
von stevie1401
Wie kann ich Ereignisse eines TreeGadgets abfragen?
Ich habe ein TreeGadged mit Spielernamen erstellt.
Nun möchte ich herausfinden, welcher Spieler in der Treegadget angeklickt wurde, es kommt aber immer nur 0 heraus.

Code: Alles auswählen

Repeat
    Event = WaitWindowEvent()
    EventWindow = EventWindow()
    EventGadget = EventGadget()
    EventType = EventType()
    
    Select Event
      Case #PB_Event_Gadget
      ;  Debug Str(event)+"  "+Str(EventGadget)
        For i=1 To 13
          If EventGadget=LobbyButton(i)
           LobbyButton_Click(i)  
          EndIf
        Next i
        
        
        If EventGadget=SpielerListeID   ;ID der Spielerliste  (TreeGadget)
        Debug GadgetiD   ;ist immer  0
        EndIf
        
      Case #PB_Event_CloseWindow
        If EventWindow = 1
          CloseWindow(1)
          Break
        EndIf
    EndSelect
    
    
  ForEver


Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 23.10.2014 16:36
von Kiffi
stevie1401 hat geschrieben:es kommt aber immer nur 0 heraus.
... welches die ID des TreeGadgets (und somit korrekt) ist.

Um zu ermitteln, welcher Eintrag ausgewählt wurde, musst Du GetGadgetState() des TreeGadgets abfragen.

Grüße ... Peter

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 24.10.2014 07:59
von stevie1401
Sry, aber ich kriege das nicht hin.
Gibt es da irgendwo ein Beispiel?

/Erledigt.
Es lebe das engliche Forum ^^

Code: Alles auswählen

If EventGadget=SpielerListeID   ;die ID des TReeGadget der Spielerliste
   Debug GetGadgetItemText(SpielerListeID, GetGadgetState(SpielerListeID))  ;zeige den TEXT der angeklickten Zeile im TreeGadget
  ;(es wird bei Debug allerdings immer doppelt angezeigt)
EndIf

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 24.10.2014 08:35
von Kiffi
stevie1401 hat geschrieben:/Erledigt.
dennoch hier die Beispiele, die ich in der Zwischenzeit zusammengestellt habe:

Konventionell:

Code: Alles auswählen

EnableExplicit

#Window = 0
#TreeGadget = 0

OpenWindow(#Window, 0, 0, 300, 400, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TreeGadget(#TreeGadget, 10, 10, 280, 380)

Define a, id

For a = 1 To 2
	
	AddGadgetItem(#TreeGadget, id, "Tisch "+Str(a))        ; benutzen Sie ImageID(x) als 4. Parameter
	AddGadgetItem(#TreeGadget, id + 1, "Spieler 1", 0, 1)	 ; diese sind auf dem ersten Sublevel
	AddGadgetItem(#TreeGadget, id + 2, "Spieler 2", 0, 1)
	AddGadgetItem(#TreeGadget, id + 3, "Spieler 3", 0, 1)
	AddGadgetItem(#TreeGadget, id + 4, "Spieler 4", 0, 1)
	
	SetGadgetItemState(#TreeGadget, id, #PB_Tree_Expanded)
	
	id + 5
	
Next

Define WWE

Repeat 
	
	WWE = WaitWindowEvent()
	
	Select WWE
		Case #PB_Event_Gadget
			Select EventGadget()
				Case #TreeGadget
					Select EventType()
						Case #PB_EventType_LeftClick
							Debug "LeftClick on TreeGadget"
							Debug "GetGadgetText(): " + GetGadgetText(#TreeGadget)
							Debug "GetGadgetState(): " + Str(GetGadgetState(#TreeGadget))
							Debug "----"
					EndSelect
			EndSelect
	EndSelect
	
Until WWE = #PB_Event_CloseWindow
Mit BindGadgetEvent():

Code: Alles auswählen

EnableExplicit

#Window = 0
#TreeGadget = 0

Procedure TreeGadgetLeftClickEvent()
	Debug "LeftClick on TreeGadget"
	Debug "GetGadgetText(): " + GetGadgetText(#TreeGadget)
	Debug "GetGadgetState(): " + Str(GetGadgetState(#TreeGadget))
	Debug "----"
EndProcedure


OpenWindow(#Window, 0, 0, 300, 400, "TreeGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TreeGadget(#TreeGadget, 10, 10, 280, 380)

Define a, id

For a = 1 To 2
	
	AddGadgetItem(#TreeGadget, id, "Tisch "+Str(a))        ; benutzen Sie ImageID(x) als 4. Parameter
	AddGadgetItem(#TreeGadget, id + 1, "Spieler 1", 0, 1)	 ; diese sind auf dem ersten Sublevel
	AddGadgetItem(#TreeGadget, id + 2, "Spieler 2", 0, 1)
	AddGadgetItem(#TreeGadget, id + 3, "Spieler 3", 0, 1)
	AddGadgetItem(#TreeGadget, id + 4, "Spieler 4", 0, 1)
	
	SetGadgetItemState(#TreeGadget, id, #PB_Tree_Expanded)
	
	id + 5
	
Next

BindGadgetEvent(#TreeGadget, @TreeGadgetLeftClickEvent(), #PB_EventType_LeftClick)

Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 24.10.2014 09:14
von stevie1401
Vielen Dank.
So langsam werde ich mit PB warm. Könnte echt meine neue Sprache werden.
Welche Vorzüge hat BindGadgetEvent() und wie lege ich das in eine repeat: until ProgIstZuende-Schleife?

Re: TreeGadget SubItems ohne Klick sichtbar machen

Verfasst: 24.10.2014 13:28
von Kiffi
stevie1401 hat geschrieben:Welche Vorzüge hat BindGadgetEvent()
ich persönlich finde, dass man damit übersichtlicheren Code erstellen kann. Du schreibst Deinen Kram halt nicht mehr in eine immer größer werdende Eventschleife, sondern kannst ihn strukturiert in Prozeduren auslagern.

Und spezielle Events (beispielsweise das Window-Resize-Event) bekommst Du ohne Bind*-Befehle gar nicht mit.
stevie1401 hat geschrieben:und wie lege ich das in eine repeat: until ProgIstZuende-Schleife?
Auch bei der Benutzung von Bind*-Befehlen kannst Du nach wie vor in Deiner Event-Schleife auf Ereignisse reagieren:

Code: Alles auswählen

EnableExplicit

#myWindow = 0

Procedure myWindow_Close_Event()
	Debug "myWindow_Close_Event gefeuert"
EndProcedure

OpenWindow(#myWindow, 0, 0, 300, 300, "Schliess das Fenster!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

BindEvent(#PB_Event_CloseWindow, @myWindow_Close_Event(), #myWindow)

Define Event

Repeat
	Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
oder Du erstellst eine globale Exit-Variable:

Code: Alles auswählen

EnableExplicit

#myWindow = 0

Global SchlussJetzt

Procedure myWindow_Close_Event()
	SchlussJetzt = #True
EndProcedure

OpenWindow(#myWindow, 0, 0, 300, 300, "Schliess das Fenster!", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

BindEvent(#PB_Event_CloseWindow, @myWindow_Close_Event(), #myWindow)

Repeat
	WaitWindowEvent()
Until SchlussJetzt
Grüße ... Peter

Verfasst: 24.10.2014 13:40
von CodeCommander
~ DELETE ~