 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 1 樓
|
發表於: 星期五 三月 25, 2005 7:32 pm 文章主題: 測試BINDEVENT的能耐 |
|
|
本來想BINDEVENT可以將固定的程式碼嵌入到你想要的地方, 但是使用上是有點限制.
原來想要達到的目的是, 利用bindevent來嵌入 .OptionGroup之中所有的 .OptionButton.GotFocus 及.LostFocus , 這樣可以用來做在某個 .optionbutton 在 focus時能改變button的底色. 但發現在bindevent的程式碼中使用的 this 這一類物件是bindeven原先所在的地方, 並不是在它bind的那個物件裡, 這樣就無法得知目前button所在的地方之物件了, 不知有人有更好的方式在不用一個一個來設定各個OptionButton的程式, 來達到這個目的嗎?
以下是我的測試程式:
建立一個OptionGroup 的 class
加入2個"方法" chgGotFocus及chgLostFocus
在.init中寫上以下程式碼
FOR i=1 TO .buttonCount
BINDEVENT(.buttons(i),"GotFocus",this,"chgGotFocus",1) &&--,1=先執行內定的.Gotfocus再執行.chgGotFocus
BINDEVENT(.buttons(i),"LostFocus",this,"chgLostFocus",1)
next
**************
.chgGotFocus的程式碼
this.BackColor = rgb(128,255,128) &&--如果你將這行程式複製到你每個OptionButton.GotFocus裡, 在執行時是正確的, 但用bindevent就是不對. 它的this.backcolor指的是.chgGotFocus這個程式碼原始所在地的this.backcolor也就是OptionGroup.backcolor
**************
.chgLostFocus的程式碼
this.BackColor = this.parent.Backcolor _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
goto-dream
註冊時間: 2004-05-11 文章: 909
第 2 樓
|
發表於: 星期六 三月 26, 2005 10:20 am 文章主題: |
|
|
1.可以在gotfocus及lostfocus設定傳進去的參數.如下
THISFORM.chgGotFocus("XXXX")
2.
.chgLostFocus的程式碼
可以在gotfocus及lostfocus設定傳進去的參數.如下
LPARAMETERS tc_color
this.BackColor = tc_color
3.綁定OptionButton的物件tabindex或是名稱
傳值給要執行的事件....
底下給你範例...
代碼: | **********************************
* 用途: 系統參數--執行個別參數設定
* 參數:
* 傳值:
* 範例:
**********************************
DEFINE CLASS BindEvent_APField_cmdButton AS Custom
i_Index=1
i_Value=1
i_Name1=""
i_Name2=""
PROCEDURE CLICK
*MESSAGEBOX(THIS.Class )
THISFORM.cmdButton_Click(THIS.i_Name1,THIS.i_Name2)
ENDPROC
ENDDEFINE |
THISFORM.init事件
代碼: | *!*THISFORM新增comamndbutton
FOR i =1 TO ALEN(fieldName1)
mm="cmdButton_"+ALLTRIM(STR(i))
THISFORM.ADDOBJECT(mm,"mycommandbutton")
THISFORM.&mm..CAPTION=fieldName1[i]
THISFORM.&mm..VISIBLE=.T.
THISFORM.&mm..AUTOSIZE=.F.
THISFORM.&mm..WIDTH=205
THISFORM.&mm..HEIGHT=35
THISFORM.&mm..TOP=45*(i-1)+10
THISFORM.&mm..LEFT=35
lc_String="olblDay"+ALLTRIM(STR(i))
*!*BindEvent 自訂義物件 /事件
THISFORM.AddObject(lc_String,"BindEvent_APField_cmdButton")
THISFORM.&lc_String..i_Index=i
THISFORM.&lc_String..i_Name1=fieldName1[i]
THISFORM.&lc_String..i_Name2=fieldName2[i]
BINDEVENT(THISFORM.&mm,"Click",THISFORM.&lc_String,"Click")
ENDFOR |
thisform.cmdbutton_click事件
代碼: | LPARAMETERS tc_Name1,tc_Name2
IF ALLTRIM(tc_Name1)=="" OR ALLTRIM(tc_Name2)=="" &&不得為無效資料
RETURN
ENDIF
This.tcfindkey0=UPPER(tc_Name2)
This.tcfindkey1=UPPER(tc_Name1)
*Thisform.tcfindkey2=""
DO FORM forms\APFields_1 WITH This |
_________________ 福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!
想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.
愛作夢 |
|
回頂端 |
|
 |
goto-dream
註冊時間: 2004-05-11 文章: 909
第 3 樓
|
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 4 樓
|
發表於: 星期六 三月 26, 2005 1:18 pm 文章主題: |
|
|
goto-dream, 像你這樣在form裡的物件都用addobject的方式增加也都不錯, 所以如果像我這類的問題也是須要借重addobject的方式, 不可以像我這樣只用一個chgGotFocus 就想用在每一個optionButton裡, 必須像你的一樣, 為每一個optionbutton增加一個專屬的 chgGotFocus才行. 但我不知是否可以為 optionGroup中的的每一個OptionButton 增加一個它自己專屬的method, 因為如果是增加在 OptionGroup中也是可行拉, 只是有點牽強, 不知也有其它完美的解決方法呢? _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
goto-dream
註冊時間: 2004-05-11 文章: 909
第 5 樓
|
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 6 樓
|
發表於: 星期日 三月 27, 2005 4:49 am 文章主題: |
|
|
thisform.interactivechange 以前沒用過, 有了這個, 就不須再用自定的class來記錄目前active的物件是那一個了, 真方便. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
thornbird313
註冊時間: 2004-12-14 文章: 23
第 7 樓
|
發表於: 星期日 三月 27, 2005 12:20 pm 文章主題: |
|
|
THISFORM.InteractiveChange?表单没有这个方法吧?是不是指OptionGroup的?
OptionGroup的InteractiveChange事件:
THIS.SetAll("BackColor", THIS.BackColor)
THISFORM.ActiveControl.BackColor = RGB(255, 0, 0) |
|
回頂端 |
|
 |
thornbird313
註冊時間: 2004-12-14 文章: 23
第 8 樓
|
發表於: 星期日 三月 27, 2005 12:24 pm 文章主題: |
|
|
用成员类(MemberClass)要更方便一些。 |
|
回頂端 |
|
 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 9 樓
|
發表於: 星期一 三月 28, 2005 12:58 am 文章主題: |
|
|
thornbird313 寫到: | 用成员类(MemberClass)要更方便一些。 |
同意,但要 8.0 以上才支援 _________________ 希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 10 樓
|
發表於: 星期一 三月 28, 2005 9:32 am 文章主題: |
|
|
對! 用memberclass確實比較方便.
以前在用grid時, 就用這種方法來改變內定的header,
因為沒有過BINDEVENT ,想測試看看能過做到什麼程度, 原本以為它可以將程式碼插入到所指定的位置, 想成可以完全溶入該段程式碼中, 但實際上是插入一個指向你的副程式的point而以, 這個副程式的位置還在它原本的位置, 並不是將整段程式碼"搬"到你指定的地方去執行, 所以在該段副程式中用的 "this." 並不等於你原先插入的那個位置上 "this." , 所以BINDEVENT還是有些使用上的限制, 這就是我想要測試的目的.
如果各位先進還有測試心得, 還請不吝分享指教. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
Chris Lee
註冊時間: 2004-03-23 文章: 32
第 11 樓
|
發表於: 星期三 三月 30, 2005 6:34 am 文章主題: |
|
|
bindevent 無法抓到 event source(如果是 VBScript/JavaScript 就可輕易抓到),但可以藉助 aevents(請詳見『VFP OOP Basics』一書第 133 頁)。
請把 chggotfocus 改成如下即可:
aevents(aa, 0)
aa[1].BackColor = rgb(128,255,128)
chglostfocus 也是依樣畫葫蘆:
aevents(aa, 0)
aa[1].BackColor = aa[1].parent.Backcolor
其實這類問題,我建議還是自訂 class 較好,因為更彈性。
Chris |
|
回頂端 |
|
 |
syntech
註冊時間: 2003-05-16 文章: 4249 來自: Taipei,Taiwan
第 12 樓
|
發表於: 星期三 三月 30, 2005 9:05 am 文章主題: |
|
|
不過,bindevents()這樣設計似乎也沒錯,
BINDEVENT(oEventSource, cEvent, oEventHandler, cDelegate [, nFlags])
也就是應該使用
do case
case oEventSource.baseclass == "Textbox"
oEventSource.readonly=.t.
oEventSource.parent.value=.t.
.
.
endcase
我在寫 bcb 時,
也常常需要以 dynamic_case 強制指定傳入指標的型態,
再作後續的操作. _________________ 如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問
請聯絡我們,也許我們幫得上忙 |
|
回頂端 |
|
 |
garfield Site Admin

註冊時間: 2003-01-30 文章: 2160
第 13 樓
|
發表於: 星期三 三月 30, 2005 1:21 pm 文章主題: |
|
|
太好了, 可以用aevents()加強 bindevent 的功能 ,謝謝李老師的提醒, 回頭再來看help檔, 其實就有說:You can call the AEVENTS( ) function to retrieve an object reference to the event source , 看來自己英文程度太差了, 也沒有認真看, 才會lose這麼重要的資訊. !
應該買本VFP OOP Basics 來學習別人的經驗, 畢竟要完成一本書也是作者將自己的學習經驗的精華, 呈現的一種方式, 用別人的經驗來縮短自己研究的時間, 是值得用金錢換時間的. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|