線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2397
推到 Plurk!
推到 Facebook!

在DBGrid裡面按TAB (或SHIFT+TAB)的問題

答題得分者是:RootKit
tyw6455
一般會員


發表:7
回覆:9
積分:3
註冊:2005-06-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-23 12:30:41 IP:211.75.xxx.xxx 訂閱
在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-23 23:55:41 IP:58.216.xxx.xxx 訂閱
将DataSouce的AutoEdit属性设定一下。
------
====================
我为一切作努力!
Justin Shen

tyw6455
一般會員


發表:7
回覆:9
積分:3
註冊:2005-06-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-24 09:11:04 IP:211.75.xxx.xxx 訂閱
問題有解了,不過又產生新的問題出現
在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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-24 21:06:06 IP:61.222.xxx.xxx 訂閱
大概寫寫。

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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-24 22:50:45 IP:222.185.xxx.xxx 訂閱
只要判断(是否最后一格和TAB键)还有(第一格和Shift Tab键)就可以了,其他都是系统自己的动作不用修改的。
------
====================
我为一切作努力!
Justin Shen

編輯記錄
JustinShen 重新編輯於 2008-04-24 22:53:23, 註解 無‧
tyw6455
一般會員


發表:7
回覆:9
積分:3
註冊:2005-06-23

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-04-25 08:45:54 IP:211.75.xxx.xxx 訂閱
謝謝 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-04-25 11:02:05 IP:61.222.xxx.xxx 訂閱
我試很正常

===================引 用 tyw6455 文 章===================
謝謝 JustinShen 和 RootKit 兩位提供的方向
我也嘗試去寫出來相類似的東西,不過就是還有一個問題存在,

使用TAB鍵的時候動作都是OK的,但是使用SHIFT+TAB問題就出現了
以下描述都是使用SHIFT+TAB的情況
當在第一筆資料第一個可編輯欄位(或是第一個欄位)時可以很順利的
跳到最後一筆的最後一個可編輯欄位,
但是在最後一筆的最後一個可編輯欄位時(不管是不是最後一個欄位,只要是最後一個可編輯欄位
再按SHIFT+TAB在KEYDOWN事件裡面就是都只能抓到TAB的動作抓不到SHIFT+TAB
導致游標會再次跳到第一筆資料的第一個可編輯欄位

我使用的DELPHI6已經UpDate Pack 2了 OS是WINXP不知道這個問題是在哪裡?希望能指教一下
我的程式碼PO在三樓,後來也有按照RookKit 的方式稍稍修改一下,結果還是一樣
系統時間:2024-05-08 15:56:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!