 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 1 樓
|
發表於: 星期一 三月 15, 2004 2:39 am 文章主題: VFP8的自定事件(轉貼) |
|
|
來源:myf1 lousg
[譯文]It Was Bound To Happen – Event Binding in VFP8
VFP8的事件綁定
Matt Jarvis
介紹
VFP8的一個新特性是事件綁定。這個新的強有力的工具可以讓開發者以「hook」任何對象的任意方法,包含FoxPro應用程序和COM服務器,進入任何的VFP對象。
利用這個工具可以近乎無窮的辦法對新的或已經存在的程序進行增強和擴展。同樣,控件也可以在單個「handler」下進行處理,以提供一個簡單的代碼維護的方法。
我已經研究了事件綁定,並受到啟發要把它應用到我現在的應用程序、框架和COM服務器裡。
什麼是事件綁定?
你必半從名字做猜測,事件綁定(EB是處理一個對象的事件,並綁定到另一個對像事件上。比如,表單上的一個命令按鈕把它的Click事件綁定到其他對象,叫做「動作管理者(Action Manager)」它,就有一個事件可以處理用戶的動作。
注意,在上段中我並沒有說是Click方法。事件和方法不是同一回事,雖然我們狐友(VFP』er)趨向於認為相同。在許多情況下它們沒有不同,但是也有例外(也一直如此),所以需要記得它們是不同的。
發佈者是具有可活動事件的對象,比如上例中的命令按鈕Click事件。它使得機器監視事件的發生。
委託者是監聽事件的發生並產生你所規定的動作的對象。它就是我上例中使用的動作管理者。可以認為它是將要發生綁定事件的目標。
在VFP推出後不久,Markus Eggar在《Code》雜誌上給出了一個關於事件綁定的簡單討論。雖然很基本,它突出的表明了事件綁定可以是如何簡單。在他怕例子裡,他建立了一個帶命令按鈕的表單,點擊命令按鈕從委託者裡放出代碼以執行某些動作。
這裡是五個用於事件綁定的新的函數:
· BINDEVENT
· UNBINDEVENTS
· RAISEEVENT
· AEVENTS
· EVENTHANDLER
BINDEVENT
Syntax (from VFP Help): BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])
你可以使用BINDEVENT命令在事件源和處理者間做綁定。在這樣情況下,事件源是表單上控件的事件,事件處理者就是所寫的用於響應表單發生的事件的自定義類。
示例1:
首先,我創建一上個表單,包含有命令一個按鈕、一個文本框和一個在Click方法裡寫有代碼Release()的命令按鈕。
當我運行如下程序時,你可以很容易的見到我能夠對表單上任何或所有的控件的Click和Gotfocus事件作連接。
* - begin program
clear all
* - set up the Handler
oHandler = newobject( 'myHandler')
do form form1 name oForm noshow
* - I do this here for this example, but this could easily be
* - done in the form Init or in the base class
* - 我這裡只是示例,你可以很容易的把它放入表單的Init或基類裡。
for each oControl in oForm.controls
wait window oControl.baseclass
if lower( oControl.baseclass) = "textbox" then && only echo text boxes
wait wind oControl.Name
bindevent( oControl, 'Gotfocus', oHandler, 'myProc2')
endif
if pemstatus( oControl, 'Click', 5) = .t. and ! 'QUIT' $ upper( oControl.name)
bindevent( oControl, 'Click', oHandler, 'myProc1')
endif
endfor
aevents( laevents, oHandler)
list memory to mem noconsole
oForm.show()
read events
release oForm
define class myHandler as session
procedure myProc1
wait window program()
endproc
procedure myProc2
wait window 'Hi - I got the focus'
endproc
enddefine
* - end of program
在這個簡單示例裡,你可以很容易見到,當你點擊按鈕或是點擊/進入文本框時,事件處理者就會執行事件代碼。我不再去做更多的,但是你可以猜想你用這種強大的特性所能做的\事情,你如果把連接到你的應用程序框架以監視用戶動作以實現問答測試或審計目的。
一個有趣的竅門是,你可以設置EB在事件源事件代碼前性,也可以在事件處理者代碼後。參見事件綁定的幫助裡的nFlags信息。
另一個有趣的是關於Eb並不要求是一對於一的,你可以綁定一個事件到多個的事件處理者,就像你有一個的可監聽多個事件源的事件處理者。把它認為是多對多…….
UNBINDEVENTS
Syntax (from VFP Help): UNBINDEVENTS( oEventSource, cEvent, oEventHandler, cDelegate )
正如你所期待的,UNBINDEVENTS關閉了你先前建立的綁定。注意,你可以關閉一次關閉某個特定對象的一個事件或所有事件綁定。
RAISEEVENT
Syntax (from VFP Help): RAISEEVENT( oEventSource, cEvent [, eParm1...] )
同樣,這是一個完美的自解釋。更多信息參見幫助。
AEVENTS
Syntax (from VFP Help): AEVENTS( ArrayName [, 0 | oEventObject ] )
這個函數捕獲你所建立的所有定並保存到數據組裡。
EVENTHANDLER
Syntax (from VFP Help): EVENTHANDLER(oCOMObject, oVFPObject [, lUnbind])
當你想綁定一個COM對像(比如,Word或你自己的Dll)以自定義你的VFP應用程序的事件時使用這個函數。這個比較複雜些,所以我想把這個留待下次。
另一個示例:
在這個示例裡我將建立EB以監視對一個自定義類的屬性的訪問。它類似於Access方法, 但是對於任何現在的應用程序可以不需要作修改。我希望聽到的是,你已經有自己的自定義類庫,在不修改的情況下你可以使得它們能夠運行自定義代碼,比如,為了調試目的。
* - begin program
clear all
oHandler = newobject( 'myHandler')
oExample = createobject( 'MyClass')
* - call delegate before event code (default)
* - 在事件代碼前調用委託者代碼(默認)
nFlag = 0
* - call event before delegate
* - 在委託者代碼前調用事件代碼
*nFlag = 1
* - Do not trigger event (call delegate code) when a simple method call occurs
* - 當一個簡單方法調用發生時不執行觸發器事件(調用委託者代碼)
*nFlag = 2
* - Call event code before delegate code. Do not trigger
* - event (call delegate code) when simple method calls occur
* - 在委託者代碼前調用事件代碼。當簡單方法調用發生時不執行觸發器事件(稠用委託者代碼)
*nFlag = 3
bindevent( oExample, 'GetPropertyvalue', oHandler, 'myProc1', nFlag)
aevents( laevents, oHandler)
list memory to mem noconsole
? oExample.GetPropertyvalue()
return
define class myHandler as session
procedure myProc1
wait window program()
endproc
enddefine
define class MyClass as Session
TheProperty = .t.
procedure GetPropertyvalue
wait window program()
return this.TheProperty
endproc
* - end program
Matt Jarvis _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 2 樓
|
發表於: 星期一 三月 15, 2004 11:12 am 文章主題: |
|
|
很像 delphi/BCB 中的 actionlist 物件所作的事 _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 3 樓
|
發表於: 星期一 三月 15, 2004 11:20 am 文章主題: |
|
|
題外話:只是建議下列可不可以換一下
[簡轉繁的初始內容] --> [繁体本身的習慣說法]
綁定 --> 連結
對象 --> 物件
對像 --> 物件
控件 --> 控制項
調用 --> 呼叫
響應 --> 回應
創建 --> 建立
文本框 --> 文字方塊
運行 --> 執行
默認 --> 預設
示例 --> 範例
訪問 --> 存取 _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
朱育興 在 星期一 三月 15, 2004 11:25 am 作了第 1 次修改 |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 4 樓
|
發表於: 星期一 三月 15, 2004 11:22 am 文章主題: |
|
|
這個 bindevent( ) 真是強,沒人講還不知道有這個功能, 以前寫程式的遇到的某些問題就是受限於沒有這個功能, 無法開發出共用元件, 趕緊測試中 _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 5 樓
|
發表於: 星期一 三月 15, 2004 10:21 pm 文章主題: |
|
|
朱育興 寫到: | 題外話:只是建議下列可不可以換一下
[簡轉繁的初始內容] --> [繁体本身的習慣說法]
綁定 --> 連結
對象 --> 物件
對像 --> 物件
控件 --> 控制項
調用 --> 呼叫
響應 --> 回應
創建 --> 建立
文本框 --> 文字方塊
運行 --> 執行
默認 --> 預設
示例 --> 範例
訪問 --> 存取 |
我是使用ALiBaBar轉換的.他沒有外帶對照表.
所以轉出來會這樣.誰知道有更好的工具?
可以解決此問題!! _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 6 樓
|
發表於: 星期二 三月 16, 2004 1:00 am 文章主題: |
|
|
我就是用 ALiBaBar 轉換的,它有一個功能就是提供我講的外帶對照表,不過今天一大早我要去台北出差(跟證券交易所的人開會),等回來後我教你如何使用,並將我搜集一部分這種轉換檔給你。 _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ |
|
回頂端 |
|
 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 7 樓
|
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|