TreeGadget SubItems ohne Klick sichtbar machen

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag von stevie1401 »

Prima! Das ist genau das, was ich brauchte.
Vielen Dank!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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

Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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
a²+b²=mc²
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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
a²+b²=mc²
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: TreeGadget SubItems ohne Klick sichtbar machen

Beitrag 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
a²+b²=mc²
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

~ DELETE ~
Zuletzt geändert von CodeCommander am 18.01.2015 14:37, insgesamt 1-mal geändert.
~ DELETE ~
Antworten