Seite 1 von 1

BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 01:44
von alter Mann
Wenn man bei folgendem Code die Esc-Taste drückt, wird merkwürdigerweise die Funktion LeftClickEvent() aufgerufen

Code: Alles auswählen

Procedure LeftClickEvent()
  ; tue irgend etwas
  UnbindEvent(#PB_Event_LeftClick,@LeftClickEvent())  
  Debug "Klick"
  Debug Str(EventType())
  Debug Str(EventMenu())
  Debug Str(EventGadget())
  Debug Str(EventData())
  Debug Str(EventWindow())

EndProcedure

Procedure MenuEvent()
  Debug "Menü"
  UnbindEvent(#PB_Event_LeftClick,@LeftClickEvent())  
  UnbindMenuEvent(100,1200,@MenuEvent())
EndProcedure

If OpenWindow(111, 0, 0, 100, 100, "UnbindEvent", #PB_Window_SystemMenu )
  BindEvent(#PB_Event_LeftClick,@LeftClickEvent())
  
  CreatePopupMenu(100)
  AddKeyboardShortcut(111, #PB_Shortcut_Escape     , 1200)
  BindMenuEvent(100,1200,@MenuEvent())

  Repeat
    Event = WaitWindowEvent()
  Until  Event = #PB_Event_CloseWindow

EndIf
[Debugger]
Menü
Klick
0
1200
1200
0
111
weiß jemand, ob das so sein soll?

[heute mal auf WinXP PB5.21LTS(x86)]

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 02:04
von STARGÅTE
Bei mir stürtzt das Programm ab (ohne Debugger-Fehlermeldung) sobald ich irgendein Event auf dem Window auslöse.

Ich vermute mal es liegt an UnbindEvent das du im Event selbst ausführst.
Damit tötet sich ja der Callback selbst, und löst damit einen Speicherzugrifffehler aus.
---------------------------
UnbindEvent: PureBasic_Compilation0.exe - Fehler in Anwendung
---------------------------
Die Anweisung in 0x01eb3d10 verweist auf Speicher 0x01eb3d10. Der Vorgang written konnte nicht im Speicher durchgeführt werden.


Klicken Sie auf "OK", um das Programm zu beenden.
---------------------------
OK
---------------------------

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 03:17
von NicTheQuick
Das ist ein Bug, der mittlerweile schon behoben wurde, und soweit ich weiß sogar schon in PB V5.22.

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 09:43
von STARGÅTE
Na scheinbar nicht, denn ich habs hier mit der neusten Beta getestet, und bekomme diesen Absturz.

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 09:55
von Kiffi
Das ist aber auch ein gemeiner Fehler!

* Copy & Paste des Codes in ein neues PB-Fenster. Ausführen. ESC drücken -> Absturz (wie von STARGÅTE beschrieben)

* Auskommentieren der Zeile 'Debug "Menü"'. Ausführen. ESC drücken -> Kein Absturz

* Wieder einkommentieren der Zeile 'Debug "Menü"'. Ausführen. ESC drücken -> Kein Absturz

getestet mit PB5.3B6 32bit

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 14:27
von SBond
Bei mir stürzt es nur ab, wenn ich in das Fenster klicke.
Wenn ich ESC drücke, dann kommt nur das Debugfenster mit dem Text "Menü"


Abstürze bei PB5.30 B6 x64:
PB stürzt mit debugger ab.



PB 5.22 x86:
Debugger fängt den Fehler ab.
In der Prozedur LeftClickEvent() wird die letzte Zeile (EndProcedure) rot markiert.
Console: [ERROR] Ungültiger Speicherzugriff. (Schreibfehler an der Adresse 12)


viele Grüße,
SBond

Re: BindEvent / BindMenuEvent - Problem

Verfasst: 04.07.2014 22:19
von alter Mann
Kann das mal bitte jemand im englischen Bugforum melden, ich bin da nur Besucher...

ein etwas aufwändiger Workaround:

Code: Alles auswählen

Procedure LeftClickEvent()
  Debug "Klick"
  Debug Str(EventType())
  Debug Str(EventMenu())
  Debug Str(EventGadget())
  Debug Str(EventData())
  Debug Str(EventWindow())
  PostEvent(#PB_Event_Gadget,111,11)
EndProcedure

Procedure MenuEvent()
  Debug "Menü"
  Debug Str(EventType())
  Debug Str(EventMenu())
  Debug Str(EventGadget())
  Debug Str(EventData())
  Debug Str(EventWindow())
  PostEvent(#PB_Event_Gadget,111,11)
EndProcedure

Procedure FreeEvents()
  UnbindEvent(#PB_Event_LeftClick,@LeftClickEvent())  
  UnbindMenuEvent(100,1200,@MenuEvent())  
  Debug "Free"
EndProcedure

If OpenWindow(111, 0, 0, 100, 100, "UnbindEvent", #PB_Window_SystemMenu )
  BindEvent(#PB_Event_LeftClick,@LeftClickEvent())
  
  CreatePopupMenu(100)
  AddKeyboardShortcut(111, #PB_Shortcut_Escape     , 1200)
  BindMenuEvent(100,1200,@MenuEvent())
  
  TextGadget(11,0,0,0,0,"")
  BindGadgetEvent(11,@FreeEvents())

  Repeat
    Event = WaitWindowEvent()
  Until  Event = #PB_Event_CloseWindow

EndIf