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

請問如何讓TStringGrid對Tab鍵有反應?

尚未結案
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-20 12:24:55 IP:210.64.xxx.xxx 未訂閱
弟已經在StringGrid的OnKeyPress中使用
IF (KEY = #9) AND (StringGrid1.Col = 1)
THEN
   BEGIN
      Do Something.....; 
      StringGrid1.MoveTo(2,StringGrid1.Row);
   END;
但是當按下Tab鍵僅是跳到下一個元件(如果有的話),而不是執行設定的流程,請問如何解決這個問題?
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-20 19:47:46 IP:222.93.xxx.xxx 未訂閱
由于Tab建默认用于切换控件焦点,所以Tab键已经在窗体消息循环中处理掉,因此控件的OnKeyPress不能捕捉Tab。 为了在TStringGrid中实现用Tab来切换单元格,一般都是用一个TEdit来作为Inplace Editor,用以接收TStringGrid单元格中的数据、编辑修改数据再传回数据到TStringGrid。在TEdit失去焦点时设定TStringGrid获得焦点,移动当前单元格即可。 实现的原理当然还是消息处理了,下面时部分源代码。
//这段代码使InplaceEditor生效
procedure TfrmMain.StringGrid1SelectCell(Sender: TObject; Col, Row: Integer;
  var CanSelect: Boolean);
var R: TRect;
begin
  if ((Col = 1) and (Row <> 0)) then
  begin
    {Size and position the combo box to fit the cell}
    R := StringGrid1.CellRect(Col, Row);
    R.Left := R.Left   StringGrid1.Left;
    R.Right := R.Right   StringGrid1.Left;
    R.Top := R.Top   StringGrid1.Top;
    R.Bottom := R.Bottom   StringGrid1.Top;        {Show the combobox}
    with cbInplaceComboBox do
    begin
      Left := R.Left   1;
      Top := R.Top   1;
      Width := (R.Right   1) - R.Left;
      Height := (R.Bottom   1) - R.Top;          ItemIndex := Items.IndexOf(StringGrid1.Cells[Col, Row]);
      Visible := True;
      SetFocus;
    end;
  end;
  CanSelect := True;
end;
//这段代码获取用户键入消息
//procedure CMDialogKey(var msg: TCMDialogKey); message CM_DIALOGKEY;
procedure TfrmMain.CMDialogKey(var msg: TCMDialogKey);
begin
  if (ActiveControl = cbInplaceComboBox) then
  begin
    if (msg.CharCode = VK_TAB) then
    begin
      //set focus back to the grid and pass the tab key to it
      cbInplaceComboBox.SetFocus;
      cbInplaceComboBox.Perform(WM_KEYDOWN, msg.CharCode, msg.KeyData);
      // swallow this message
      msg.result := 1;
      Exit;
    end;
  end;      inherited;
end;
Justin Shen ================================= 如果能帮到您,我会很开心;如果能得到您的帮助,是我的荣幸 =================================
------
====================
我为一切作努力!
Justin Shen

NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-25 09:34:44 IP:210.64.xxx.xxx 未訂閱
感謝您能撥空解答弟的問題,您的寫法弟尚需消化驗證. 在等待有心人援助的期間,弟找到了一個元件"IMPGRID1",是個可以藉由按下"Tab"而移動欄位的TStringGrid元件,同樣的是"只能前進,不能回頭".
JustinShen
中階會員


發表:22
回覆:104
積分:80
註冊:2003-09-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-25 11:44:47 IP:218.94.xxx.xxx 未訂閱
引言: 感謝您能撥空解答弟的問題,您的寫法弟尚需消化驗證. 在等待有心人援助的期間,弟找到了一個元件"IMPGRID1",是個可以藉由按下"Tab"而移動欄位的TStringGrid元件,同樣的是"只能前進,不能回頭".
如果需要回头只要再inplace editor处理tab时判断grid的当前col,row就可以作相应的处理。 Justin Shen ============================================= 如果能帮到您,我会很开心;如果能得到您的帮助,是我的荣幸 =============================================
------
====================
我为一切作努力!
Justin Shen

系統時間:2024-11-25 8:52:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!