Seite 1 von 4

Variable GadgetList und variable Events ?

Verfasst: 12.11.2014 22:55
von Vera
Hallo,
ich hatte für einen anderen Thread ein Beispiel entwickelt, worin eine unwägbare Anzahl von Gadgets erstellt werden Kann.
Ich kann mir aber nicht vorstellen, wie man eine variable EventAbfrage vorbereiten kann, die für sich auch völlig flexibel ist, das sie jedwede Menge an neuen Gadget überwachen / abfangen kann.

Code: Alles auswählen

If OpenWindow(0, 0, 0, 305, 180, "ScrollAreaGadget - test Gadget-Lists", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  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()
  
RandomSeed(333)
n=1 ; To count Case 3
  
  Repeat
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
      Case  #PB_Event_Gadget
        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
    EndSelect
  ForEver
EndIf
Ich habe dort zwei Hinweise erhalten, die ich beide nicht umsetzen kann, und bleibe mit meinen Fragen alleine.
Thomas empfiehlt: 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
und Stevie empfiehlt: 'auf ein Gadget geklickt':

Code: Alles auswählen

          For i=1 To SpielerAnz  ;(Globale Variable)
            If aGadgetID=LobbyButton(i)
             LobbyButton_Click(i)  ;Button I wurde geklickt
            EndIf
          Next i
Die Listen sind mir fremd und ich weiß nicht, ob das dann gespeicherte Addressen sind oder literale Strings.
Und dann habe ich keine Vorstellung, wie ich einen ListenIndex als Zuordnung zu einem Gadget-event nutzen kann - geschweige denn, den flexiblen Event-Loop dafür einzurichten.

Würde mich über Unterstützung, mit der ich das lösen kann freuen.

Grüße ~ Vera

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 00:24
von NicTheQuick
Ich hatte mal ein Tutorial mit etwas ähnlichem gemacht. Vielleicht geht dir dann ein Licht auf: [PB] HowTo: CanvasWindow (Teil 1/2)

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 00:34
von GronkhLP
Gibt's bald neue Videos? :)

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 00:47
von Kiffi
ich würde diesbezüglich gerne BindGadgetEvent() in den Ring werfen, denn meiner Meinung nach kann der hiermit gebaute Code übersichtlicher sein als der mit einer Mörder-Eventschleife. In Zusammenarbeit mit Set-/GetGadgetData() kannst Du die Gadgets auseinander halten.

Code: Alles auswählen

EnableExplicit

#Window = 0
#ScrollAreaGadget = 0

Procedure ButtonEvent()
	Protected EventGadget = EventGadget()
	Protected GadgetData = GetGadgetData(EventGadget)
	Debug "Event: Button " + Str(GadgetData)
EndProcedure

OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter
Define Button 
Define newY = 10

For Counter = 0 To 9
	
  Button = ButtonGadget(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter + 1))
  SetGadgetData(Button, Counter + 1)
  BindGadgetEvent(Button, @ButtonEvent())
	
  newY + 40
	
Next

CloseGadgetList()

Repeat
Until WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Peter

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 13:36
von Vera
Hei ~
"Heut' woll'n wir wieder was programmieren" :allright:
Das ist toll gemacht Nic (k), aber ca. ab der 12min verlassen sie mich, doch Du machst auch viele Randbemerkungen, die sehr erhellend für mich sind. Das Video schaue ich mir mich Sicherheit noch häufig an. :)
Kannst Du mir auch den Link zum 2ten Teil geben. Den habe ich im Forum nicht finden können, wie auch den Link zu Deiner Seite, über den ich mal gestolpert war. (der in der Sig ist es nicht)

Danke Peter,
Dein Beispiel hat mir schon sehr geholfen. :D Einerseits wann und warum #PB_Any wirklich Sinn machen kann und das man Events auch via Callback abfragen kann.

Ok - im Moment bin ich noch auf PB 4.50 (bis mein aktueller Rechner repariert ist) und habe nun versucht den Callback aus der EventSchleife heraus abzufragen.
Das klappt prompt :-) - alle Buttons sind eindeutig

ABER ich bekomme auch immer auch den Event des Scrollgadgets zurück.
Den versuche ich nun in der Procedure abzufangen und die Procedure dann abzubrechen. ABER ProcedureReturn, was angeblich eine Procedure unmittelbar beendet, wird total ignoriert.

Jetzt hab' ich wieder Stunden nur damit verbracht, endlose Variationen von Konditionen in der Procedure auszuprobieren, aber alles wird 'ignoriert' und die Procedure bis zum Ende ausgeführt.
In Nicks Video verwendet er ProcedureReturn wie selbstverständlich und es funktioniert vermutlich auch wie gewünscht (oder wie die Hilfe verspricht). Was ist denn nun an dieser Procedure von Peter anders, das es darin wirkungslos ist?
Hier mein aktueller Trial&ErrorCode:

Code: Alles auswählen

EnableExplicit

#Window = 0
#ScrollAreaGadget = 0

Global GadgetDati

Procedure ButtonEvent()
   Protected EventGadget = EventGadget()
   Protected GadgetData = GetGadgetData(EventGadget)
   ;Debug "Event: Button " + Str(GadgetData)
   If GadgetData = 0 
     Debug "GD = "+ Str(GadgetData)    ; obwohl 0 eindeutig erkannt wird, wird die Procedure hier nicht abgebrochen
     ProcedureReturn  ; #False
   ;EndIf ; 
 ElseIf GadgetData > 0 
     GadgetDati = GadgetData
     ProcedureReturn GadgetDati
     EndIf
EndProcedure

OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter
Define Button
Define newY = 10

For Counter = 0 To 9
   
  Button = ButtonGadget(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter + 1))
  SetGadgetData(Button, Counter + 1)
;  BindGadgetEvent(Button, @ButtonEvent())
   
  newY + 40
   
Next

CloseGadgetList()


Repeat
  Select WaitWindowEvent()
    Case  #PB_Event_CloseWindow
      End
      
    Case  #PB_Event_Gadget
      
       GadgetDati = ButtonEvent()
; 
       Debug "Event: Button " + Str(GadgetDati)
      
      
      Select EventGadget()
          Case 0 : Debug "Case 0"             ; wird eindeutig erkannt

        Case 1
             Debug "Button " + Str(GadgetDati)   ; die bleiben immer leer
        Case 2
             Debug "Button " + Str(GadgetDati)
        Case 3
             Debug "Button " + Str(GadgetDati)
          
      EndSelect
  EndSelect
  
ForEver
ps: zu Set-/GetGadgetData() bin ich noch garnicht gekommen, da ich noch an dem Return nage

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 13:46
von Tommy
Vera hat geschrieben:Das ist toll gemacht Nick, aber ...
Wenn das der Nic sieht. :D

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 14:34
von Vera
Tommy hat geschrieben:Wenn das der Nic sieht. :D
ui :o .... getz nich meer :mrgreen:

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 15:02
von matbal
BindGadgetEvent stellt die Verbindung zwischen Prozedur und Event her. Wenn du kein BindGadgetEvent benutzt, mußt du selber überprüfen, zu welchem Gadget das Event gehört. Dazu mußt du die Nummern der mit PBAny erstellten Buttons irgendwo zwischenspeichern. Im EventLoop mußt du dann diese Nummern überprüfen.

PureBasic vergibt mit #PBAny sehr große Nummer, so daß sie mit den selbst vergebenen Nummern nicht kollidieren.

Zum Speichern eigenen sich Arrays, Listen oder Maps.

Mit Array:

Code: Alles auswählen

EnableExplicit

#Window = 0
#ScrollAreaGadget = 0


OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter, i
Define newY = 10
Define maxButton = 10

Dim Button(maxButton)

For Counter = 1 To maxButton
   Button(Counter) = ButtonGadget(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter))
   ; SetGadgetData(Button(Counter), Counter)
   
   newY + 40
Next

CloseGadgetList()


Repeat
   Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
         End
         
      Case  #PB_Event_Gadget
         Define Gadget = EventGadget()
         Select Gadget
            Case #ScrollAreaGadget : Debug "ScrollArea"             ; wird eindeutig erkannt
               
            Default
               For i = 1 To maxButton  ; Button-Array durchsuchen
                  If Button(i) = Gadget   ; Button gefunden
                     Debug "Button " + Str(i)
                     Break                ; Suche abbrechen
                  EndIf
               Next
               
         EndSelect
   EndSelect
   
ForEver
Oder mit List

Code: Alles auswählen

EnableExplicit

#Window = 0
#ScrollAreaGadget = 0


OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter
Define newY = 10

NewList Button()  

For Counter = 1 To 10
   AddElement(Button())
   Button() = ButtonGadget(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter))
   SetGadgetData(Button(), Counter)
   
   newY + 40
Next

CloseGadgetList()


Repeat
   Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
         End
         
      Case  #PB_Event_Gadget
         Define Gadget = EventGadget()
         Select Gadget
            Case #ScrollAreaGadget : Debug "ScrollArea"             ; wird eindeutig erkannt
               
            Default
               ForEach Button()  ; Button-Liste durchsuchen
                  If Button() = Gadget   ; Button gefunden
                     Debug "Button " + GetGadgetData(Button())
                     Break
                  EndIf
               Next
               
         EndSelect
   EndSelect
   
ForEver
Oder mit Map

Code: Alles auswählen

EnableExplicit

#Window = 0
#ScrollAreaGadget = 0


OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 160, 280, "", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)

ScrollAreaGadget(#ScrollAreaGadget, 10, 10, 140, 260, 110, 410)

Define Counter
Define newY = 10
Define Btn
NewMap Button()

For Counter = 1 To 10
   btn = ButtonGadget(#PB_Any, 10, newY, 100, 30, "Button " + Str(Counter))
   ; SetGadgetData(btn, Counter)
   Button(Str(btn)) = Counter    
   
   newY + 40
Next

CloseGadgetList()


Repeat
   Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
         End
         
      Case  #PB_Event_Gadget
         Select EventGadget()
            Case #ScrollAreaGadget : Debug "ScrollArea"             ; wird eindeutig erkannt
               
            Default
               If FindMapElement(Button(), Str(EventGadget())) 
                  Debug "Button " + Button()
               EndIf
               
         EndSelect
   EndSelect
   
ForEver

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 15:27
von NicTheQuick
Vera hat geschrieben:Hei ~
"Heut' woll'n wir wieder was programmieren" :allright:
Das ist toll gemacht Nic (k), aber ca. ab der 12min verlassen sie mich, doch Du machst auch viele Randbemerkungen, die sehr erhellend für mich sind. Das Video schaue ich mir mich Sicherheit noch häufig an. :)
Kannst Du mir auch den Link zum 2ten Teil geben. Den habe ich im Forum nicht finden können, wie auch den Link zu Deiner Seite, über den ich mal gestolpert war. (der in der Sig ist es nicht)
Ich habe oben extra den Link aus der Playlist eingefügt, damit der zweite Teil automatisch von selbst los läuft, sobald der erste vorüber ist. Ansonsten sollte es aber auch das erste Video in der Liste der ähnliches Videos sein. Alternativ für dich hier der zweite Teil als Direktlink: [PB] HowTo: CanvasWindow (Teil 2/2) :mrgreen:

Re: Variable GadgetList und variable Events ?

Verfasst: 13.11.2014 17:43
von ts-soft
Hab hier nur mit halben Auge mitgelesen, aber möchte doch Anmerken:
Alle EventProceduren, die auf BindEvent, BindGadgetEvent und BindMenuEvent basieren, haben kein
ProcedureReturn oder ähnlichen Ausgang! Genauso wie beim normallem Loop, kann man keinen Wert
zurückgeben.

Sollte eigentlich in der Hilfe stehen, bin aber zu faul zum nachschauen.

Dies gilt für alle EventProceduren, mit Ausnahme des echten (Windows)-Callbacks, wobei dort die Rückgaben
aber vorgegeben und dokumentiert sind und nicht willkürlich gewählt werden können.

Gruß
Thomas