Seite 2 von 3

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 17:20
von stevie1401
Mit Canvas habe ich mich noch nicht befasst. Jeder einzelne Spieler muss allerdings in der Liste anklickbar sein.
Es ist für mich erheblich(!) einfacher ein ScrollAreaGadget neu zu erstellen, als darin "rumzuwurschteln", noch komplizierter wird es mit den Spieltischen, wo auch noch unterschiedliche Spieler spielen können. Da ist ein Neuerstellen eines ScrollAreaGadget zumindest für mich sinnvoll.
Mag sein, dass es bessere Programmier-Stile gibt, aber ich bin nun mal kein Programmier-Freak und beginne erst, diese Sprache zu erlernen.

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 17:41
von NicTheQuick
Deswegen überhäufen wir dich ja auch mit Tipps. :D
Und drauf los programmieren hat bisher ja noch den wenigsten geschadet. Immerhin lernt man aus Fehlern auch am besten. Viel Spaß!

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 21:04
von Danilo
stevie1401 hat geschrieben:

Code: Alles auswählen

    If aflag=0 And GetActiveWindow()=win1
      ScrollAreaGadget(4, 10,10,300,300,300,300)
      For i=1 To 100
        TextGadget(#PB_Any, 10,i+80,100,25,"TextGadget "+Str(i))
      Next i      
     CloseGadgetList()  
     aflg=1 
      
    EndIf
Denke auch an den Schreibfehler: 'aflag' > 'aflg'

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 21:16
von ts-soft
Naja, oft genug wurde er ja auch auf enableexplicit hingewiesen und wird diese Hinweise ja nicht ignorieren.

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 21:37
von Vera
stevie1401 hat geschrieben:

Code: Alles auswählen

      For i=1 To 100
        TextGadget(#PB_Any, 10,i+80,100,25,"TextGadget "+Str(i))
      Next i    
Ich frag mich ja, ob irgend jemand dieses (hingefletzte) Beispiel ausprobiert hat.
Nie zuvor habe ich so heftige GTK-Warnings gekriegt - aber auch einen Moment gebraucht, bis ich geschnallt habe, dass das Trampeln auf der Stelle auch eine echte Herausforderung ist.


Da das Erstellen von Gadgetlisten on the fly für mich auch völlig neu ist, habe ich mal ein kleine Studie zu ScrollAreaGadget und GadgetList erarbeitet ... und das dann noch in ein 2 Fenstermodel eingebettet. viel Vergnügen :-)

Code: Alles auswählen

;- zweite Version mit 2 Fenstern

If OpenWindow(0, 0, 0, 305, 180, "ScrollAreaGadget - test Gadget-Lists", #PB_Window_SystemMenu | #PB_Window_ScreenCentered); | #PB_Window_Invisible
  ScrollAreaGadget(0, 10, 10, 290, 160, 375, 205, 30)
  ButtonGadget  (1, 150, 0, 120, 30, "1: Button")
  ButtonGadget  (2, 150, 35, 120, 30, "2: add change list")
  ButtonGadget  (3, 150, 70, 120, 30, "3: reNew gadget list")
  TextGadget    (4, 0, 10, 145, 80, " 4: This is the content" + Chr(10) + " of a ScrollAreaGadget!" + Chr(10) + Chr(10) + " at the moment", #PB_Text_Center | #PB_Text_Border)
  CloseGadgetList()

  HideGadget(0, 1)

  If OpenWindow(1, 0, 0, 210, 110, "naggy window :-)", #PB_Window_WindowCentered, WindowID(0))
    DisableWindow(0, 1)
    SetActiveWindow(1)
    ButtonGadget(5, 30, 40, 130, 25, "close dat 2nd window")
  EndIf

  RandomSeed(333)
  n = 1 ; To count Case 3

  Repeat
    Select WaitWindowEvent()

      Case #PB_Event_CloseWindow
        If EventWindow() = 0
          End
        ElseIf EventWindow() = 1
          CloseWindow(1)
          DisableWindow(0, 0)
          HideGadget(0, 0)
          SetActiveWindow(0)
        EndIf

      Case  #PB_Event_Gadget

        Select EventWindow()
          Case 0

            Select EventGadget()
              Case 1
                MessageRequester("Info", "Button 1 was pressed!", #PB_MessageRequester_Ok)
                SetGadgetText(1, "1: was pressed")
              Case 2
                OpenGadgetList(0)
                ButtonGadget  (1, 150, 0, 120, 30, "old 1 again")
                SetGadgetColor(4, #PB_Gadget_BackColor, RGB(Random(189), Random(123), Random(133)))
                ButtonGadget  (5, 170, 105, 80, 30, "new Gaget 5")
                CloseGadgetList()


              Case 3
                ; HideGadget(0,1)
                OpenGadgetList(0)
                For i = 4 To (Random(99) + 1)*30
                  h = (i - 4)*30
                  StringGadget(i, 10, h, 120, 25, Str(n) + " - TextGadget " + Str(i))
                  ;   Delay(60)
                Next i
                n + 1
                SetGadgetAttribute(0, #PB_ScrollArea_InnerHeight, h + 30)
                SetGadgetText(1, Str(i - 1) + " - new Gadgets")
                CloseGadgetList()
                ; HideGadget(0,0)
            EndSelect

          Case 1
            Select EventGadget()
              Case 5
                CloseWindow(1)
                DisableWindow(0, 0)
                HideGadget(0, 0)
                SetActiveWindow(0)
            EndSelect
        EndSelect

    EndSelect
  ForEver

EndIf
Ich frage mich allerdings nun, inwieweit kann man für solche variablen Gadgets überhaupt Event-Abfragen anlegen. Läßt sich sowas auch zur Laufzeit erstellen, variieren und anpassen?

Gruß ~ Vera

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 22:04
von ts-soft
Vera hat geschrieben:Ich frage mich allerdings nun, inwieweit kann man für solche variablen Gadgets überhaupt Event-Abfragen anlegen. Läßt sich sowas auch zur Laufzeit erstellen, variieren und anpassen?
Listen, Arrays, Maps usw.

Code: Alles auswählen

      For i=1 To 100
        AddElement(MyList())
        MyList() = TextGadget(#PB_Any, 10,i+80,100,25,"TextGadget "+Str(i))
      Next i

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 23:37
von stevie1401
Naja, oft genug wurde er ja auch auf enableexplicit hingewiesen und wird diese Hinweise ja nicht ignorieren.
Keine Sorge, das war nur mal schnell und schmutzig als Beispiel geschrieben. Dass dabei Fehler entstehen können, zeigt das "aflag"<>"aflg".

Ich benutze in meinem Programm EnableExplicit ;-)
Ich frage mich allerdings nun, inwieweit kann man für solche variablen Gadgets überhaupt Event-Abfragen anlegen. Läßt sich sowas auch zur Laufzeit erstellen, variieren und anpassen?
Selbstverständlich!
global dim Knopp(100)

Kopp(i)=TextGadget(#PB_Any,x,y,x1,y1,"Text")

Nun kann man abfragen.

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 10.11.2014 23:55
von Vera
Danke Thomas,
aber sorry, das schaffe ich nicht.
Ich verstehe, dass hier MyList() eine LinkList mit 100 Addressen von 100 Gadgets sein könnte? 'Könnte' aber auch der literale Wert der jeweiligen Zeile sein, die dann indexiert sind?

Selbst wenn ich solch einen Addressindex hätte, wie soll man denn darüber die Events der einzelnen Gadgets ermitteln?

Code: Alles auswählen

Select MyList()
  Case 1-100
   If 1 ... ?
   If 2 ... ?
Da müste ich doch auch schon vorher wissen, wieviele Gadgets es geben wird und dürfte die auch nicht mehr 'schauffeln', damit Case und spezifisches Event nicht durcheinanderkommen.

Wie könnte Stevie es schaffen, ständig die Spielerauflistung neu zu generieren, die sich immer in anderen Gadget befinden, aber jeden Spieler dabei trotzdem eindeutig in Zugriff (incl. Abfrage) zu halten, wenn sich ständig deren Position ändert?

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 11.11.2014 00:11
von Vera
stevie1401 hat geschrieben:
Ich frage mich allerdings nun, inwieweit kann man für solche variablen Gadgets überhaupt Event-Abfragen anlegen. Läßt sich sowas auch zur Laufzeit erstellen, variieren und anpassen?
Selbstverständlich!
global dim Knopp(100)

Kopp(i)=TextGadget(#PB_Any,x,y,x1,y1,"Text")

Nun kann man abfragen.
w0w - wenn das so selbstverständlich ist, kann ich dann bitte ein laufendes MiniBeispiel haben, bitte?

Wenn Hugo am Anfang in Gadget 3 war und nach einem Neuaufbau, dann in 65 , und danach in 24 - wie soll ich denn dafür einen dynamischen EventLoop schreiben?

Code: Alles auswählen

Case Event ggf. 3 oder auch 65 ... vielleicht aber doch 24
...und wie soll so eine EventAbfrage mal nur 21 Gadgets, dann mal 137, dann wieder nur 15 erkennen?

Re: ScrollAreaGadget in aktivem Fenster

Verfasst: 11.11.2014 00:18
von stevie1401
Die Anzahl der Gadgets ergibt sich aus der Anzahl der Spieler. Die Anzahl der Spieler inclusive allen Spielernamen (und dazugehörigen Icons) sendet der Server den Clients, wenn sich etwas geändert hat. Die Variable SpielerNameAnz (oder so) kennt der Client also.

Code: Alles auswählen

   ;auf einen Button in der Lobby geklickt   
          For i=1 To SpielerAnz  ;(Globale Variable)
            If aGadgetID=LobbyButton(i)
             LobbyButton_Click(i)  ;Button I wurde geklickt
            EndIf
          Next i