Wolfgang Chien's Homepage | Delphi學習筆記 - 問答篇 |
1.使用dbgrid 時如何得知mouse點在那一個field(focus)?
2.有沒有什方法能使在 dbgrid cell 中 edit 後按'enter' 後則移至下一個 field thanks!
不知道是什麼原因, DBGrid 並沒有 publish OnClick 這個事件,不過我們可以繼承 TDBGrid 後, 將 OnClick publish 出來, 然後利用 SelectedField 這個屬性得知在滑鼠 Click 時究意是哪一個欄位
>2.有沒有什方法能使在 dbgrid cell 中 edit 後按'enter' 後則移至下一個 field
將 DbGrid 的 OnKeyPress 事件中加入類似以下程式碼, 就可以解決您的問題, 同時, 它也避免了在最後一筆資料的最後一個欄位按下 Enter 後, DbGrid 自動加新列的困擾
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); var iNextIndex: integer; begin if Key = #13 then begin (* #13 Enter 鍵 *) with DBGrid1 do begin (* 判斷是否是在最右邊的欄位, 如果是, *) (* 循環到第一個欄位 *) if SelectedIndex < FieldCount - 1 then iNextIndex := SelectedIndex + 1 else iNextIndex := 0; SelectedField := Fields[iNextIndex]; Key := #0; end; end; end;
要同時解決上述問題, 可以參考 XDbGrid 單元(我在本信後會附上這個元件的原始碼)
以下是這個元件的使用示例:
[安裝]
![]() |
1. 將信後所附單元存成檔案: XDBGRID.PAS |
![]() |
2. 啟動 Delphi, 主選單 Option | Install Compontent點一下 'Add' 按鈕, 再點一下 'Browse' 按鈕, 在開 啟檔案對話盒中找到 XDBGrid.pas, 最後再點一下'Ok'按鈕, Delphi 即開始編譯連結這個元件 |
[試用]
![]() |
3. 新開一個 project |
![]() |
4. 在 form1 中安置 TTable, TDataSource, TXDbGrid 與 TLabel 各一 |
![]() |
5. with Table1 set DatabaseName = DBDEMOS TableName = ANIMALS.DBF Activate = True |
![]() |
6. DataSource1.DataSet = Table1 |
![]() |
7. XDbGrid1.DataSource = DataSource1 |
![]() |
8. 在 XDbGrid1 的 OnClick 事件中撰寫程式:
Label1.Caption := XDbGrid1.SelectedField.FieldName; |
![]() |
9. 執行這個程式 |
(* -------------------------------------------------- *) (* TXdbGrid (* ======== (* 一個在使用者按下 Enter 後移往下一個欄位的 DBGrid (* 將 OnClick 事件公開出來 (* -------------------------------------------------- *) unit XDbGrid; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids; type TXDbGrid = class(TDbGrid) private protected { TXDbGrid's KeyPress event handler } procedure KeyPress(var Key: Char); override; public published (* 將 OnClick 事件公開出來 *) property OnClick; end; procedure Register; implementation { Register XDbGrid} procedure Register; begin RegisterComponents('Samples', [TXDbGrid]); end; { TXDbGrid's KeyPress event handler } procedure TXDbGrid.KeyPress(var Key: Char); var iNextIndex: integer; begin if Key = #13 then begin (* 判斷是否是在最右邊的欄位, 如果是, *) (* 循環到第一個欄位 *) if SelectedIndex < FieldCount - 1 then iNextIndex := SelectedIndex + 1 else iNextIndex := 0; SelectedField := Fields[iNextIndex]; Key := #0; end; if key <> #0 then inherited KeyPress(Key); end; end.
首頁 | 學習筆記 | 主題公園 | 軟體下載 | 關於本站 | 討論信群 | 相約下次 |