張洪舉大師《160問》中的16問“如何為_SCREEN表單指定事件”為何不能在VFP8中運行
張老師書中解決指定事件過程提供的源程序如下:
IF TYPE("_Screen.oHook")="O"
_Screen.RemoveObject("oHook") &&如果對象存在,移除
ENDIF
_Screen.AddObject("oHook","MyHook")
DEFINE CLASS MyHook AS Custom
oScreen = _Screen
WAIT WINDOW oscreen
PROCEDURE oScreen.Resize
"發(fā)生了Resize事件"
ENDPROC
PROCEDURE oScreen.click
"發(fā)生了Click事件"
ENDPROC
PROCEDURE oScreen.MouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WAIT WINDOW "水平坐標(biāo):"+STR(nXCoord)+"垂直坐標(biāo):"+STR(nYCoord) NOWAIT
ENDPROC
ENDDEFINE
上述程序在VFP6中運行很好,但系統(tǒng)升級到VFP8 或VFP9后提示語句:
PROCEDURE oScreen.Resize 等(指 oScreen)出錯。
請各位高手解決
[原創(chuàng)]這個不知是不是你想要的結(jié)果(在VFP8及VFP9里都測試通過):
**********************在_Screen里指定事件***********************
PUBLIC oHandler
oHandler=NEWOBJECT("myhandler")
BINDEVENT(_SCREEN,"Resize",oHandler,"myresize") && 框架變動
BINDEVENT(_SCREEN,"Click",oHandler,"myClick") && Click事件
BINDEVENT(_SCREEN,"RightClick",oHandler,"myRClick")&& RightClick右鍵事件
BINDEVENT(_SCREEN,"MouseMove",oHandler,"myMouseMove") && MouseMove鼠標(biāo)經(jīng)過事件
BINDEVENT(_SCREEN,"KeyPress",oHandler,"myKeyPress")&& KeyPress事件
DEFINE CLASS myhandler AS Session
PROCEDURE myresize
"發(fā)生了Resize事件"
RETURN
PROCEDURE myClick
"發(fā)生了Click事件"
RETURN
PROCEDURE myRClick
"發(fā)生了RightClick事件"
RETURN
PROCEDURE myKeyPress
LPARAMETERS nKeyCode, nShiftAltCtrl
IF nKeyCode = 27 && [ESC] 退出系統(tǒng)
"按下了[ESC]"
CLEAR DLLS
QUIT
ENDIF
"發(fā)生了KeyPress事件"
RETURN
PROCEDURE myMouseMove
LPARAMETERS nButton, nShift, nXCoord, nYCoord
WAIT WINDOW "水平坐標(biāo):"+STR(nXCoord)+"垂直坐標(biāo):"+STR(nYCoord) NOWAIT
RETURN
ENDDEFINE
事件綁定:不知道這個函數(shù)行不行
bindevent(_screen,'resize',你綁定到的對象,'處理方法')
可以用 BINDEVENT() 來綁定事件, 屬性或方法從 Visual FoxPro 自己的對象到其它 Visual FoxPro 對象。要從 Component Object Model (COM) 對象綁定事件, 用 EVENTHANDLER() 函數(shù)。
BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])
參數(shù)
- oEventSource
- 指定事件源, 它必須是一個有效的 Visual FoxPro 對象。
- cEvent
- 指定你想綁定的事件, 方法或?qū)傩缘拿帧?
- oEventHandler
- 指定對象, 必須是一個有效的 Visual FoxPro 對象, 處理事件。
- cDelegate
- 指定方法, 或 "代理", 為 oEventHandler 處理事件。
- nFlags
- 指定一個你可以為事件綁定操作設(shè)置的額外的位標(biāo)記。
示例
下面示例展示如何保持類瀏覽器的位置在 Visual FoxPro 桌面的左邊, 進(jìn)化論桌面如何重調(diào)大小。BINDEVENT() 用 oHandler 關(guān)聯(lián) _SCREEN 或 Visual FoxPro 桌面 的 Resize 事件, 它使用 myresize 作為它的代理。當(dāng) Resize 事件被觸發(fā)時運行 myresize 代碼。
PUBLIC oHandler
oHandler=NEWOBJECT("myhandler")
DO (_browser)
BINDEVENT(_SCREEN,"Resize",oHandler,"myresize")
DEFINE CLASS myhandler AS Session
PROCEDURE myresize
_obrowser.left = _SCREEN.Width - _obrowser.width
RETURN
ENDDEFINE