Variable GadgetList und variable Events ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Variable GadgetList und variable Events ?

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
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: Variable GadgetList und variable Events ?

Beitrag von NicTheQuick »

Ich hatte mal ein Tutorial mit etwas ähnlichem gemacht. Vielleicht geht dir dann ein Licht auf: [PB] HowTo: CanvasWindow (Teil 1/2)
GronkhLP
Beiträge: 72
Registriert: 14.11.2013 22:43
Wohnort: Köln
Kontaktdaten:

Re: Variable GadgetList und variable Events ?

Beitrag von GronkhLP »

Gibt's bald neue Videos? :)
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Variable GadgetList und variable Events ?

Beitrag 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
a²+b²=mc²
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Variable GadgetList und variable Events ?

Beitrag 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
Zuletzt geändert von Vera am 13.11.2014 14:31, insgesamt 1-mal geändert.
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Tommy
Spassvogel
Beiträge: 319
Registriert: 17.10.2013 14:36

Re: Variable GadgetList und variable Events ?

Beitrag von Tommy »

Vera hat geschrieben:Das ist toll gemacht Nick, aber ...
Wenn das der Nic sieht. :D
Zuletzt geändert von Tommy am 27.01.2015 10:46, insgesamt 2-mal geändert.
PB 5.41 x64
Benutzeravatar
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Variable GadgetList und variable Events ?

Beitrag von Vera »

Tommy hat geschrieben:Wenn das der Nic sieht. :D
ui :o .... getz nich meer :mrgreen:
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: Variable GadgetList und variable Events ?

Beitrag 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
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: Variable GadgetList und variable Events ?

Beitrag 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:
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: Variable GadgetList und variable Events ?

Beitrag 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
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
Antworten