Smalltalk 如何处理Spec 2工具栏中的事件/检测按住SHIFT键?
我有一个工具栏SpToolbarPresenter作为实例变量工具栏,我有一个updatePresenter实现作为:Smalltalk 如何处理Spec 2工具栏中的事件/检测按住SHIFT键?,smalltalk,pharo,Smalltalk,Pharo,我有一个工具栏SpToolbarPresenter作为实例变量工具栏,我有一个updatePresenter实现作为: updatePresenter cmds isEmpty ifTrue: [ ^ self ]. btnHandlers := cmds collect: [ :cmd | | btn | btn := SpToolbarButtonPresenter
updatePresenter
cmds isEmpty ifTrue: [ ^ self ].
btnHandlers := cmds collect: [ :cmd |
| btn |
btn := SpToolbarButtonPresenter new
label: cmd name;
action: [];
help: cmd help.
toolbar addItem: btn.
(SpEventHandler for: btn) whenMouseDownDo: [ :ev |
self onCmd: cmd name event: ev ] ]
我使用SpEventHandler而不是action:因为我想在单击工具栏按钮时检测按住SHIFT键。但是,我仍然需要该操作:因为没有它,我会得到一个奇怪的错误,如cull:被发送到nil
这段代码适用于第二个工具栏的按钮我在工具栏上有两个按钮,但第一个按钮不适用!第一个工具栏的按钮永远不会获取事件,因此永远不会调用onCmd
所以,如何在单击工具栏按钮时检测按住SHIFT键,或2修复此代码,以便所有按钮都将获得此事件?任何帮助都是有用的
PS.Windows 10,规范2,Pharo-9.0.0+build.940.sha.deeec198EF752789431EE24667709A4 A3FF87BDA 64位修复程序可能是:
updatePresenter
cmds do: [ :cmd |
| btn |
btn := SpToolbarButtonPresenter new
label: cmd name;
action: [ ];
help: cmd help.
toolbar addItem: btn.
btn eventHandler whenMouseDownDo: [ :ev |
self onCmd: cmd name event: ev ] ]
测试-它的工作。想法是使用按钮的eventHandler,然后为它们创建新的处理程序。修复可能是:
updatePresenter
cmds do: [ :cmd |
| btn |
btn := SpToolbarButtonPresenter new
label: cmd name;
action: [ ];
help: cmd help.
toolbar addItem: btn.
btn eventHandler whenMouseDownDo: [ :ev |
self onCmd: cmd name event: ev ] ]
测试-它的工作。我们的想法是使用按钮的eventHandler,然后为它们创建新的处理程序。正如@RandomB所说,但也添加了一个shiftPressed测试:
此外,即使没有直接关系,我也不能避免说:使用完整的变量/方法名!它将使您的代码更具可读性:正如@RandomB所说,但也添加了一个shiftPressed测试: 此外,即使没有直接关系,我也不能避免说:使用完整的变量/方法名!这将使您的代码更具可读性: