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