ScrollAreaGadget in aktivem Fenster

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

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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.
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: ScrollAreaGadget in aktivem Fenster

Beitrag 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ß!
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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'
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ScrollAreaGadget in aktivem Fenster

Beitrag von ts-soft »

Naja, oft genug wurde er ja auch auf enableexplicit hingewiesen und wird diese Hinweise ja nicht ignorieren.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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?
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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?
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: ScrollAreaGadget in aktivem Fenster

Beitrag 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
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten