在DBGrid裡面按TAB (或SHIFT+TAB)的問題 |
答題得分者是:RootKit
|
tyw6455
一般會員 發表:7 回覆:9 積分:3 註冊:2005-06-23 發送簡訊給我 |
在DBGrid中 遇到了兩個相類似的情形
(TDBGrid.Options.dgTabs) = true 1. 在DBGrid 中按 TAB 鍵 游標就會往下一個欄位移動 當在一筆資料的最後一個欄位的時候,游標會移到下一筆資料的第一個欄位, 可是當在最後一筆資料的最後一個欄位再按TAB鍵時, 游標會移到DBGrid自動新增的一筆空白資料的第一個欄位,但是這不是我想要的動作, 我希望游標能夠一道第一筆資料的第一個欄位,曾經試過 TDBGrid.Options.dgTabs = False 然後在DBGrid的 KeyDown 事件裡去寫程式自行控制,但是這樣子在按TAB鍵時根本觸發不了 KeyDown事件。我知道把DBGrid.ReadOnly = true就不會新增一筆資料, 但是我需要在 ReadOnly = false 的狀態下去做 TAB 的動作。 2. 相類似的情況是用 SHIFT+TAB 往前一格,當游標在第一筆資料的第一個欄位時再按SHIF+TAB 並不會移到最後一筆資料的最後一個欄位。 這兩種情不知道什麼辦法可以解決,希望有人可以指點一下迷津吧。 |
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
|
tyw6455
一般會員 發表:7 回覆:9 積分:3 註冊:2005-06-23 發送簡訊給我 |
問題有解了,不過又產生新的問題出現
在TAB鍵裡執行是OK的 但是在SHIFT+TAB鍵就有問題出現了, 在最後一筆的最後一個可編輯欄按 SHIFT+TAB 鍵時, 並不是如預期的再往同一筆資料的前面一個可編輯欄, 而是直接跳到第一筆的資料的第一個可編輯欄, 用DeBug抓過,發現在最後一筆的最後一個欄位按 SHIFT+TAB 在KeyDown裡面抓到的動作就只有 TAB 而已,不知道程式裡面哪裡出問題了 請各位指點一下吧!謝謝! 程式是寫在TDBGrid的KeyDown事件裡面 [code cpp] procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var iEndNotReadyOnly, iFirstNotReadyOnly : Integer; iNowIndex : Integer; iColumnsNo : Integer; begin iEndNotReadyOnly := 0; iFirstNotReadyOnly := 0; if ((((ssShift in Shift) and (Key = VK_TAB)) or (Key = VK_UP)) And((Sender as TDBGrid).DataSource.DataSet.RecNo = 1)) then begin iColumnsNo := (Sender as TDBGrid).Columns.Count - 1; iNowIndex := (Sender as TDBGrid).SelectedIndex; (Sender as TDBGrid).SelectedIndex := 0; ConsiderNotReadOnly(iFirstNotReadyOnly, iEndNotReadyOnly, iColumnsNo, Sender); (Sender as TDBGrid).SelectedIndex := iNowIndex; if (Key = VK_UP) then begin Key := 0; (Sender as TDBGrid).DataSource.DataSet.RecNo := (Sender as TDBGrid).DataSource.DataSet.RecordCount; end else if (((Shift = [ssShift]) and (Key = VK_TAB)) And ((Sender as TDBGrid).SelectedIndex = iFirstNotReadyOnly)) then begin Key := 0; (Sender as TDBGrid).DataSource.DataSet.RecNo := (Sender as TDBGrid).DataSource.DataSet.RecordCount; (Sender as TDBGrid).SelectedIndex := iEndNotReadyOnly; end; end else if (((ORD(Key) in [9]) or (Key = VK_DOWN)) and ((Sender as TDBGrid).DataSource.DataSet.RecordCount = (Sender as TDBGrid).DataSource.DataSet.RecNo)) then begin iColumnsNo := (Sender as TDBGrid).Columns.Count - 1; iNowIndex := (Sender as TDBGrid).SelectedIndex; (Sender as TDBGrid).SelectedIndex := 0; ConsiderNotReadOnly(iFirstNotReadyOnly, iEndNotReadyOnly, iColumnsNo, Sender); (Sender as TDBGrid).SelectedIndex := iNowIndex; if (Key = VK_DOWN) then begin Key := 0; (Sender as TDBGrid).DataSource.DataSet.RecNo := 1; end else if ((Key = VK_TAB) And ((Sender as TDBGrid).SelectedIndex = iEndNotReadyOnly)) then begin Key := 0; (Sender as TDBGrid).DataSource.DataSet.RecNo := 1; (Sender as TDBGrid).SelectedIndex := iFirstNotReadyOnly; end; end; end; procedure TForm1.ConsiderNotReadOnly(var viFirst, viEnd : Integer; viCount :Integer; Sender : TObject); var iTemp, I : Integer; bFirst : Boolean; begin iTemp := 0; bFirst := False; for I := 0 to viCount do begin if ((Not (Sender as TDBGrid).Columns.Items[I].ReadOnly) And (Sender as TDBGrid).Columns.Items[I].Visible = true) then begin iTemp := I; if Not(bFirst) then begin bFirst := true; viFirst := I; end; end; if (I = viCount) then begin viEnd := iTemp; end; end; end; [/code] |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
大概寫寫。
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_TAB then if Not (ssShift in Shift) then begin if DBGrid1.SelectedIndex = Pred(DBGrid1.Columns.Count) then begin Key := 0; DBGrid1.DataSource.DataSet.Next; DBGrid1.SelectedIndex := 0; if DBGrid1.DataSource.DataSet.Eof then DBGrid1.DataSource.DataSet.First; end; end else begin if DBGrid1.SelectedIndex = 0 then begin Key := 0; DBGrid1.DataSource.DataSet.Prior; DBGrid1.SelectedIndex := Pred(DBGrid1.Columns.Count); if DBGrid1.DataSource.DataSet.Bof then DBGrid1.DataSource.DataSet.Last; end; end; end; |
JustinShen
中階會員 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
只要判断(是否最后一格和TAB键)还有(第一格和Shift Tab键)就可以了,其他都是系统自己的动作不用修改的。
------
==================== 我为一切作努力! Justin Shen
編輯記錄
JustinShen 重新編輯於 2008-04-24 22:53:23, 註解 無‧
|
tyw6455
一般會員 發表:7 回覆:9 積分:3 註冊:2005-06-23 發送簡訊給我 |
謝謝 JustinShen 和 RootKit 兩位提供的方向
我也嘗試去寫出來相類似的東西,不過就是還有一個問題存在, 使用TAB鍵的時候動作都是OK的,但是使用SHIFT+TAB問題就出現了 以下描述都是使用SHIFT+TAB的情況 當在第一筆資料第一個可編輯欄位(或是第一個欄位)時可以很順利的 跳到最後一筆的最後一個可編輯欄位, 但是在最後一筆的最後一個可編輯欄位時(不管是不是最後一個欄位,只要是最後一個可編輯欄位) 再按SHIFT+TAB在KEYDOWN事件裡面就是都只能抓到TAB的動作抓不到SHIFT+TAB 導致游標會再次跳到第一筆資料的第一個可編輯欄位, 我使用的DELPHI6已經UpDate Pack 2了 OS是WINXP不知道這個問題是在哪裡?希望能指教一下 我的程式碼PO在三樓,後來也有按照RookKit 的方式稍稍修改一下,結果還是一樣 |
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
我試很正常
===================引 用 tyw6455 文 章=================== 謝謝 JustinShen 和 RootKit 兩位提供的方向 我也嘗試去寫出來相類似的東西,不過就是還有一個問題存在, 使用TAB鍵的時候動作都是OK的,但是使用SHIFT+TAB問題就出現了 以下描述都是使用SHIFT+TAB的情況 當在第一筆資料第一個可編輯欄位(或是第一個欄位)時可以很順利的 跳到最後一筆的最後一個可編輯欄位, 但是在最後一筆的最後一個可編輯欄位時(不管是不是最後一個欄位,只要是最後一個可編輯欄位) 再按SHIFT+TAB在KEYDOWN事件裡面就是都只能抓到TAB的動作抓不到SHIFT+TAB 導致游標會再次跳到第一筆資料的第一個可編輯欄位, 我使用的DELPHI6已經UpDate Pack 2了 OS是WINXP不知道這個問題是在哪裡?希望能指教一下 我的程式碼PO在三樓,後來也有按照RookKit 的方式稍稍修改一下,結果還是一樣 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |