上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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就能做到 |
|
回頂端 |
|
 |
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 |
|
回頂端 |
|
 |
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事件就會運作(因為焦點移到它上面了),
可是我尚未編輯該儲存格的內容。有沒有別的方法更適合。 |
那就再多一個變數判斷是否為編輯狀態阿
新增或修改的時候,變數=.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 |
|
回頂端 |
|
 |
|