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

請教:如何得知是否正在編輯grid的儲存格之值

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
joyjoy



註冊時間: 2003-09-29
文章: 24


第 1 樓

發表發表於: 星期二 四月 12, 2005 7:49 pm    文章主題: 請教:如何得知是否正在編輯grid的儲存格之值 引言回覆

各位前輩,
我想在grid中作四件事:

一、以del按鍵去引發刪除功能,
我在表單的keypress事件中,判斷是否為"Del鍵",並寫了刪除的指令。
可是我希望若是正在編輯其中"任一儲存格"時,不要做刪除的指令,而是正常的"del鍵功能"(刪除字元)。

二、目前在儲存格上按"Enter"鍵會跳到下一格,如何可以改成,按"Enter"鍵後變成編輯該所在之儲存格。
再按一次"ENTER"鍵就回復成非編輯該所在儲存格的狀態。

三、有沒有辦法得知目前grid是處於儲存格編輯狀態或非編輯狀態?(如用滑鼠點儲存格,就處於儲存格狀態)
如果能做到第三點的話,那我應該就能以判斷狀態的方式做到第一點。

四、我在某一欄儲存格,如grid1.column3.text1.valid事件)中,寫下判斷條件去檢查是否符合要求,
若符合則可以離該該儲存格,並到下一格;若不符合規則,就不能離開該儲存格。
可是valid中不能寫thisform.grid1.column3.text1.setfocus()(它不允許setfocus()),
所以,我試改將判斷的規則及焦點控制(setfocus(),寫於grid1.column3.text1.lostfocus()中,
但是這樣子也無法讓焦點回去,(我寫在規則中的警示訊息會正確發出。)
是否在grid的lostfocus()中把焦點設在自己身上是無效的?
那我應該用什麼方法比較好?

表達能力有限,若表達得不好,尚請見諒。
請各位前輩協助,謝謝您們!
回頂端
檢視會員個人資料 發送私人訊息
bin1x



註冊時間: 2004-08-27
文章: 462


第 2 樓

發表發表於: 星期二 四月 12, 2005 8:16 pm    文章主題: 引言回覆

4.用when+valid就能做到
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 3 樓

發表發表於: 星期二 四月 12, 2005 9:01 pm    文章主題: 引言回覆

1.電腦會先去處理各個單一物件中的keypress , 不會去處理表單的keypress事件, 除非單一物件是disabled(映像中是這樣的)
2.只有在 grid中的.columns disabled 時才可能可以達到你的要求, 但也是沒試過在何地可以設定enabled
3.如果你有用2的方式去用, 那enabled就可用來判斷編輯及非編輯狀態.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
bigear



註冊時間: 2004-12-19
文章: 162
來自: 網路的另一端

第 4 樓

發表發表於: 星期二 四月 12, 2005 9:33 pm    文章主題: Re: 請教:如何得知是否正在編輯grid的儲存格之值 引言回覆

joyjoy 寫到:
三、有沒有辦法得知目前grid是處於儲存格編輯狀態或非編輯狀態?(如用滑鼠點儲存格,就處於儲存格狀態)
如果能做到第三點的話,那我應該就能以判斷狀態的方式做到第一點。


我的方法很笨,參考看看
1.宣告一個公用變數,變數=""
2.在每個 thisform.grid1.column1.text1.when 的事件中下,變數=THIS.PARENT.NAME
3.存檔或取消的時候再將,變數=""

這樣就可以利用變數判斷是否為編輯狀態了,也可以知道編輯到哪一個 column 物件

_________________
以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
bigear



註冊時間: 2004-12-19
文章: 162
來自: 網路的另一端

第 5 樓

發表發表於: 星期二 四月 12, 2005 9:37 pm    文章主題: Re: 請教:如何得知是否正在編輯grid的儲存格之值 引言回覆

joyjoy 寫到:
四、我在某一欄儲存格,如grid1.column3.text1.valid事件)中,寫下判斷條件去檢查是否符合要求,
若符合則可以離該該儲存格,並到下一格;若不符合規則,就不能離開該儲存格。
可是valid中不能寫thisform.grid1.column3.text1.setfocus()(它不允許setfocus()),
所以,我試改將判斷的規則及焦點控制(setfocus(),寫於grid1.column3.text1.lostfocus()中,
但是這樣子也無法讓焦點回去,(我寫在規則中的警示訊息會正確發出。)
是否在grid的lostfocus()中把焦點設在自己身上是無效的?
那我應該用什麼方法比較好?


RETURN .F.

_________________
以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
joyjoy



註冊時間: 2003-09-29
文章: 24


第 6 樓

發表發表於: 星期三 四月 13, 2005 12:14 pm    文章主題: 引言回覆

先在此謝謝各位前輩的教導!

第四點的部份,我已如bigear前輩所言加上 RETURN .F. (我把它加在grid1.column3.text1.valid事件中),
它已能在不符規則時鎖定在該儲存格,但是我發現若我點到GRID外的按鈕時,如THISFORM的CMD_DEL按時,
它還是會先處理THISFORM.CMD_DEL.CLICK()事件。
所以,再請問:如何可以讓它非得正確符合規則,否則不能點任何東西。
(或是我的做法不合理,請各位前輩教我該怎做較適當)

另外、

請問bin1x前輩:
您說:(4.用when+valid就能做到)。請恕晚輩愚昧,可否再說詳細一些。

請問garfield 前輩:關於第一部份,
我在表單的keypress事件中,判斷是否為"Del鍵",並寫了刪除的指令。且我把THISFORM.KeyPreview=.T.(讓表單優先取得KEYPRESS事件)。
我把DEL鍵事件去做"刪除明細檔之紀錄"的的動作寫在表單的KEYPRESS()中,是因為GRID本身沒有KEYPRESS事件,
而若在GRID中每個COLUMN.TEXT1.KEYPRESS()中寫,又變得較煩雜。
想問的是:我讓表單優先處理KEYPRESS事件是否是不當的做法。
另外、晚輩也有想用THISFORM.grid1.column3.ENABLED狀態來做,可是當column3.ENABLED=.F.時,
以鍵盤操作無法將焦點移到該儲存格。所以這似乎不能達成晚輩的需求。

請問bigear前輩:關於第三部份,
在thisform.grid1.column1.text1.when 的事件中 做 變數=THIS.PARENT.NAME的方式。
只要移到該儲存格上WHEN事件就會運作(因為焦點移到它上面了),
可是我尚未編輯該儲存格的內容。有沒有別的方法更適合。

補充一下:晚輩所指的儲存格編輯狀態:(這不是晚輩憑空想的,而是看過市面上有VFP開發的軟體有此好用操作介面)
當移到某儲存格時,該儲存格會整個反白,這還不是晚輩所指編輯狀態,
當以滑鼠點入或輸入值時,該儲存格會出現游標,這是晚輩所指的編輯狀態。
本來想用thisform.grid1.column3.text1.SELSTART值來判斷,未點入時是"0",
可是若游標在該格最前面,也是"0",所以此法失效。

無論如何,謝謝各位的幫忙!
回頂端
檢視會員個人資料 發送私人訊息
bin1x



註冊時間: 2004-08-27
文章: 462


第 7 樓

發表發表於: 星期三 四月 13, 2005 12:37 pm    文章主題: 引言回覆

[請問bin1x前輩:
您說:(4.用when+valid就能做到)。請恕晚輩愚昧,可否再說詳細一些。]
retu 0+自己的message
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
joyjoy



註冊時間: 2003-09-29
文章: 24


第 8 樓

發表發表於: 星期三 四月 13, 2005 1:26 pm    文章主題: 引言回覆

第四點的部份,已經解決了。
我依前輩們的指導,在grid1.column3.text1.valid事件中判斷,若不符return .f.(或return 0)
並且,我在grid.valid()中也加上相同的判斷條件,若不符也return .f.,讓焦點無法離開grid1
如此,就會鎖在grid1.column3.text1中。(真好,連setfocus都不用做)
終於解決一個大問題了,謝謝各位前輩的協助!

另外幾個問題,尚請討論區內的前輩們幫幫忙。謝謝!
回頂端
檢視會員個人資料 發送私人訊息
bigear



註冊時間: 2004-12-19
文章: 162
來自: 網路的另一端

第 9 樓

發表發表於: 星期三 四月 13, 2005 7:20 pm    文章主題: 引言回覆

joyjoy 寫到:
請問bigear前輩:關於第三部份,
在thisform.grid1.column1.text1.when 的事件中 做 變數=THIS.PARENT.NAME的方式。
只要移到該儲存格上WHEN事件就會運作(因為焦點移到它上面了),
可是我尚未編輯該儲存格的內容。有沒有別的方法更適合。


那就再多一個變數判斷是否為編輯狀態阿 Very Happy
新增或修改的時候,變數=.T.
存檔或取消的時候,變數=.F.

_________________
以上淺見,歡迎批評指教
________________________________________________
山不轉路轉,路不轉人轉,人不轉頭轉,頭不轉眼睛轉,眼睛不轉眼珠轉
眼珠再不轉就去睡覺,睡起來繼續轉
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站
joyjoy



註冊時間: 2003-09-29
文章: 24


第 10 樓

發表發表於: 星期四 四月 14, 2005 11:36 am    文章主題: 引言回覆

關於第三部份
我想應該是我的做法不合理(不知是不是我誤會別人的作法),
---------------------------------------------------------------------
我目前的做法(部份還只是想法)是:上階(訂單主檔)、下階(訂單明細檔)。
在上階按了編輯後,EDITMODE=.T.(變數),此時可以修改上階內容及對下階作增、刪、修;
當我移到某儲存格(用鍵盤或滑鼠點的第一下),儲存格只是擁有"焦點",而未。

當我用"ENTER"鍵或滑鼠再點一下時,才會真的點入儲存格(內容值被選取)、編輯該儲存格,
此時按"DEL"、"INSERT"鍵為一般的動作(刪除游標後的字元;插入、覆蓋),
改完後再按ENTER鍵或用滑鼠點別的控件(移動焦點),那該儲存格就回復成"未進入編輯"的狀態;

若未用"ENTER"鍵或滑鼠再點一下時,按了"DEL"鍵,我想引發刪除單筆明細紀錄功能、按"INSERT"鍵引發新增單筆明細功能。
------------------------
如bigear前輩所言,
我想我再加一個變數來識別GRID(明細資料)是否處於儲存格編輯狀態好了,
並以KEYPRESS事件判斷使用者按了什麼鍵來控制變數(TF)(是否為編輯狀態),
...感覺上,好像要做不少控制.....,我會努力試試看,再回覆到這裡,
-------------------------------------------------
各位前輩有類似的作法(構想)嗎?可否指點一下,看看我是哪裡想錯了。

謝謝各位!
回頂端
檢視會員個人資料 發送私人訊息
jeff25



註冊時間: 2004-10-22
文章: 76
來自: taiwan

第 11 樓

發表發表於: 星期四 四月 14, 2005 11:47 am    文章主題: 引言回覆

你已經有了 EDITMODE=.T.變數就可以用來控制要不要執行
按了"DEL"鍵,引發刪除單筆明細紀錄功能、按"INSERT"鍵引發新增單筆明細功能
只要在刪除單筆明細紀錄功能的開頭加上
if editmode
return
endif
這樣就不會執行到刪除的程序

_________________
jeff
回頂端
檢視會員個人資料 發送私人訊息
joyjoy



註冊時間: 2003-09-29
文章: 24


第 12 樓

發表發表於: 星期四 四月 14, 2005 12:05 pm    文章主題: 引言回覆

TO JEFF25前輩,
我用的那個EDITMODE被用來控制上、下階編輯狀態,只有EDITMODE=.T.才能在下階(明細)做編輯。
而編輯時
若未進入任一儲存編輯,想用按鍵"DEL"、"INS"鍵來引發明細紀錄之新增及刪除功能;
若已進入任一儲存格,則按鍵"DEL"、"INS"鍵只是原來的"刪除游標後的字元"及切換插入/覆蓋模式。

所以,EDITMODE似乎不適合用在儲存模式的判斷。

無論如何,謝謝您的指導!
回頂端
檢視會員個人資料 發送私人訊息
andy.flower



註冊時間: 2005-04-20
文章: 3


第 13 樓

發表發表於: 星期四 四月 21, 2005 12:18 am    文章主題: 引言回覆

可以利用Form的KeyPreview
當Form.Keypreview=.T.
按任何鍵都會先觸發 Form.Keypress Event
若Form.Keypreview=.F.
則會觸發所在 Object.Keypress Event
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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