VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

測試BINDEVENT的能耐

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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 樓

發表發表於: 星期六 三月 26, 2005 10:28 am    文章主題: 引言回覆

我這不知道是不是你要的答案.....
那種方式...我已經好久沒用了
要調解決你的問題..需要花很多時間想

_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
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 樓

發表發表於: 星期六 三月 26, 2005 5:42 pm    文章主題: 引言回覆

我剛剛測試一下....
可以在thisform.interactivechange寫入以下代碼
MESSAGEBOX(this.value)

每按不同按鈕.他會顯示不同的順序


這樣表示可以判斷是哪一各按鈕在使用

納表示你的想法也是可行的~~~

_________________
福隆昌淨水有限公司--淨水器的專家,淨水器,飲水機,濾心!!

想了解更多,您可上幸福雞湯組.找尋!!丁澐瑄.老師.

          愛作夢
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
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
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
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. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
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 來學習別人的經驗, 畢竟要完成一本書也是作者將自己的學習經驗的精華, 呈現的一種方式, 用別人的經驗來縮短自己研究的時間, 是值得用金錢換時間的.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作