BindEvent in Modulen [PB 5.20 Beta 10]

Für allgemeine Fragen zur Programmierung mit PureBasic.
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Justin »

Hi,

bin gerade am Rumspielen mit den neuen Funktionalitäten. Zum Beispiel:

Code: Alles auswählen

DeclareModule MTest
  
EndDeclareModule
Module MTest
  
  Procedure EventHandler()
    
        Debug "OK"
    
  EndProcedure
  BindEvent(#PB_Event_Gadget, @EventHandler(), #PB_All, 0, #PB_EventType_Change)
EndModule
OpenWindow(0,0,0,140,200,"Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0,0,0,120,180,"Name",85)

For i = 0 To 9
  AddGadgetItem(0, -1, "name " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Warum haut es mir denn da immer zwei Events beim Changen um die Ohren?

Gruß
Justin
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von STARGÅTE »

BindEvent kannst du nicht in dieser Form verwenden.
Siehe hier: PB 5.20 - BindEvent() doesn't work with #PB_All

Nutze hier bitte BindGadgetEvent().

Zu dem eigentlichen Problem: Da dieses Event im WaitWindowEvent()-Block nicht doppelt kommt, ist es wohl ein Bug.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Justin »

Alles klar. Das Problem tritt aber auch ganz unabhängig vom #PB_All auf, denn wenn ich das durch die entsprechenden Nummern ersetze ist es das selbe.

Code: Alles auswählen

BindEvent(#PB_Event_Gadget, @EventHandler(), 0, 0, #PB_EventType_Change)


Gibt das jemand ans englische Forum weiter?

Gruß
Justin
Zuletzt geändert von Justin am 16.08.2013 13:16, insgesamt 1-mal geändert.
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Bisonte »

Da wird bei einem Klick anscheinend erst einmal das aktuelle Element auf -1 gesetzt,
und dann erst auf den jeweiligen Eintrag. Also zwei Events.

Wenn man allerdings in der Mainloop des Fensters das Event abfragt wird nur eines gefeuert...

Beim WindowEvent() hat PB die Events ja mehr oder weniger gefiltert, und bei BindEvent ist
man ja sozusagen ungefiltert, daher behaupte ich mal das in der Filterung von PB das erste Event
unterdrückt wird. Im Callback allerdings ist es nach wie vor vorhanden.

Man kann sich (wenn das alles so zutrifft) sich behelfen mit :

Code: Alles auswählen

  Procedure EventHandler()
    If GetGadgetState(EventGadget()) > -1
      Debug "OK"
    EndIf
  EndProcedure
Womit man dann die "PB Filterung" wieder durchführt.

Anmerkung : Innerhalb eines Modules eine direkte Anweisung zu machen ist schlecht. (BindEvent())
Sollte man nun das Modul ans Ende stellen, was dann ?

Besser wäre also folgendes :

Code: Alles auswählen

DeclareModule MTest
  Declare Set()
EndDeclareModule
Module MTest
  Procedure EventHandler()
    If GetGadgetState(EventGadget()) > -1
      Debug "OK " + Str(GetGadgetState(EventGadget()))
    EndIf
  EndProcedure
  Procedure Set()
    BindEvent(#PB_Event_Gadget, @EventHandler(), #PB_All, 0, #PB_EventType_Change)
  EndProcedure
EndModule

OpenWindow(0,0,0,140,200,"Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0,0,0,120,180,"Name",85)

MTest::Set()

For i = 0 To 9
  AddGadgetItem(0, -1, "name " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()
  If Event = #PB_Event_Gadget
    If EventType() = #PB_EventType_Change 
      Debug "Normal " +Str(GetGadgetState(0))
    EndIf  
  EndIf  
Until Event = #PB_Event_CloseWindow 
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Justin »

Also das gilt bsp. auch für StringGadgets. Da kommen auch mehrere Event bei rüber - bei leftclick oder lostfocus.

Das ist sehr schade, denn eigentlich hatte ich vor, dass Modul so zu gestallten damit es mir in einer List vorliegende Gadgets selbstständig verwaltet, dass ich das in der normalen Loop machen kann weiß ich :)
Aber die Gadgets in der Liste sind auch variabel, somit kann ich BindGadgetEvent auch nicht verwenden, weil ich dor auf ein bestimmtest Gadget zugreife.

Sehr schade.

Gruß
Justin
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Justin »

Noch besser wird es, wenn man die Bindung in einer Prozedur des Moduls festlegt. Dann kommen da 12 Ereignisse bei raus...

Gruß
Justin
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Bisonte »

Dann probiers doch mal so ...
hier kommt nur wirklich ein "Debug" pro Aktion...

Code: Alles auswählen

DeclareModule MTest
  Declare Set(Gadget)
EndDeclareModule
Module MTest
  Procedure EventHandler()
    Select GadgetType(EventGadget()) 
      Case #PB_GadgetType_ListIcon
        If GetGadgetState(EventGadget()) > -1
          Debug "OK " + Str(GetGadgetState(EventGadget()))
        EndIf
      Case #PB_GadgetType_String
        Debug "Change on String"
    EndSelect
    
  EndProcedure
  Procedure Set(Gadget)
    BindGadgetEvent(Gadget, @EventHandler(), #PB_EventType_Change)
  EndProcedure
EndModule

OpenWindow(0,0,0,140,220,"Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0,0,0,120,180,"Name",85)
StringGadget(1, 0, 185, 120, 20, "H")

For i=0 To 1
MTest::Set(i)
Next i

For i = 0 To 9
  AddGadgetItem(0, -1, "name " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()
 
Until Event = #PB_Event_CloseWindow 
Edit: Oder du erstellst dir eigene GadgetKreationen wie hier...

Code: Alles auswählen

DeclareModule MTest
  Declare myListIconGadget(Gadget, x, y, Width, Height, Title$, TitleWidth, Flags = -1)
  Declare myStringGadget(Gadget, x, y, Width, Height, Content$, Flags = -1)
EndDeclareModule
Module MTest
  
  EnableExplicit
  
  Procedure EventHandler()
    Select GadgetType(EventGadget()) 
      Case #PB_GadgetType_ListIcon
        If GetGadgetState(EventGadget()) > -1
          Debug "OK " + Str(GetGadgetState(EventGadget()))
        EndIf
      Case #PB_GadgetType_String
        Debug "Change on String"
    EndSelect
  EndProcedure
  Procedure myListIconGadget(Gadget, x, y, Width, Height, Title$, TitleWidth, Flags = -1)
    
    Protected Result, ID
    
    If Flags = -1
      Result = ListIconGadget(Gadget, x, y, Width, Height, Title$, TitleWidth)
    Else
      Result = ListIconGadget(Gadget, x, y, Width, Height, Title$, TitleWidth, Flags)
    EndIf
    If Gadget = #PB_Any : ID = Result : Else : ID = Gadget : EndIf
    
    If IsGadget(ID)
      BindGadgetEvent(ID, @EventHandler(), #PB_EventType_Change)
    EndIf
    
    ProcedureReturn Result
    
  EndProcedure
  Procedure myStringGadget(Gadget, x, y, Width, Height, Content$, Flags = -1)
    
    Protected Result, ID
    
    If Flags = -1
      Result = StringGadget(Gadget, x, y, Width, Height, Content$)
    Else
      Result = StringGadget(Gadget, x, y, Width, Height, Content$, Flags)
    EndIf
    If Gadget = #PB_Any : ID = Result : Else : ID = Gadget : EndIf
    
    If IsGadget(ID)
      BindGadgetEvent(ID, @EventHandler(), #PB_EventType_Change)
    EndIf
    
    ProcedureReturn Result
    
  EndProcedure
  
EndModule

OpenWindow(0,0,0,140,220,"Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

MTest::myListIconGadget(0,0,0,120,180,"Name",85)
MTest::myStringGadget(1, 0, 185, 120, 20, "H")

For i = 0 To 9
  AddGadgetItem(0, -1, "name " + Str(i))
Next

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Justin
Beiträge: 167
Registriert: 09.09.2008 16:46

Re: BindEvent in Modulen [PB 5.20 Beta 10]

Beitrag von Justin »

so,

also wenn ich den GadgetState auf > -1 prüfe, scheint es in der uhrsprünglichen Version zu funktionieren.

Ich danke euch für eure Teilnahme.

Aber vielleicht kann das jemand an entsprechender Stelle melden...

Gruß
Justin
PB 5.11 x64 / Kubuntu 12.10 x64 | Windows 7 x64
Antworten