全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1494
推到 Plurk!
推到 Facebook!

StringGrid + ComboBox + Control Problem

尚未結案
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-06 00:29:44 IP:203.218.xxx.xxx 未訂閱
小弟原意是想用一個grid去讓user輸入資料,在某時,會有一個combox彈出來供使用者選擇,所以我在stringgrid的drawcell procedure那裏,寫了code,指名如果gdfocused 的話就會將個combox彈出黎,然後再將combobx set了focus,那樣就可以模擬到當user按下或選了某一欄位時,就會彈一個combobx出來...不過如果只是單單的欄位,當user按下tab或上鍵/下鍵都會移動foucs,不過如果user 選了一個會彈combox的欄位時,就會set了combox為setfoucs...我試著控制combox的keypress,當user按下enter時就會跳至右手邊的欄位,但keypress/keydown都detect不到tab鍵,而且如果我想做到按shift tab可以跳回上個control或前一個欄位就做不到...請問有什麼解決方法呢?謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-06 07:59:43 IP:202.39.xxx.xxx 未訂閱
參考:  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=23961 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=32885    -- 悟嗎? 發表人 -
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-06 13:03:37 IP:203.185.xxx.xxx 未訂閱
看完範例我也明白其用途,但是我想知道這個 procedure CMDialogKey(Var Msg: TWMKey); message CM_DIALOGKEY; 是什麼procedure? 是delphi內定嗎? 還有"inherited"一字的意思為何?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-06 14:00:34 IP:202.39.xxx.xxx 未訂閱
1.以下摘自 Delphi 4 業界標準手冊 ..., Delphi 並不讓一個程序(procedure)掌握所有的訊息處理, 而是透過內部的訊息機制, 讓每一個訊息各有其處理程序, 使訊 息的處理工作便得簡明. 用來處理訊息的程序必須滿足以下三大 需求:  
  • 必須是一個物件的方法
  • 必須具有一個以 var 宣告的 TMessage 型態參數(其或它針對特定訊息以 TMessage 型態衍生宣告的結構記錄)
  • 必須以 message 保留字宣告它打算處理哪一個訊息
2.inherited
procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
  if msg.Charcode <> VK_TAB then
    inherited;
end;
以上例而言, 當程式執行到 inherited 這一行時, 它會去找 TForm( 因 TForm1 繼承自 TForm) 中有處理 CM_DialogKey 這個程序, 如果有就 執行, 若當中再遇到 inherited 保留字的話, 它就再去找 TCustomForm (TForm 繼承自 TCustomForm)中處理 CM_DialogKey 這個程序, 一直這樣 往上推. -- 悟嗎?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-06 23:25:20 IP:218.102.xxx.xxx 未訂閱
Thank You
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-06 23:43:49 IP:218.102.xxx.xxx 未訂閱
不好意思想補充少少... 1. 如果加了inherit,即是話default的設定,對嗎? 2. 如果想做到按著shift tab,那麼該如何detect呢?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-07 08:59:26 IP:202.39.xxx.xxx 未訂閱
引言: 不好意思想補充少少... 1. 如果加了inherit,即是話default的設定,對嗎? 2. 如果想做到按著shift tab,那麼該如何detect呢?
1.懂意思就好 2.以如下的方式判斷試試:
  If GetKeyState(VK_SHIFT ) < 0 Then
    // 按下 shift 鍵
-- 悟嗎?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-07 09:24:05 IP:203.185.xxx.xxx 未訂閱
1. 那inherited 是預設, 對嗎???? 2. 那句應該放在那裏呢? "CMDialogKey" 嗎 ?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-08 00:59:17 IP:203.218.xxx.xxx 未訂閱
有人能回答嗎?
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-08 08:28:59 IP:202.39.xxx.xxx 未訂閱
引言: 1. 那inherited 是預設, 對嗎???? 2. 那句應該放在那裏呢? "CMDialogKey" 嗎 ?
1.inherited 是執行父代的行為 2. 試試:
procedure TForm1.CMDialogKey(var msg: TCMDialogKey);
begin
  if msg.Charcode <> VK_TAB then
  begin
    inherited;
    If GetKeyState(VK_SHIFT ) < 0 Then
      // 按下 shift 鍵
  end;
end;
-- 悟嗎?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-08 13:17:34 IP:218.103.xxx.xxx 未訂閱
procedure TForm1.CMDialogKey(Var Msg: TWMKEY); begin inherited; if (ActiveControl = ComboBox) Then Begin If (GetKeyState(VK_SHIFT ) < 0) And (Msg.Charcode = VK_TAB) Then Begin Form1.TabOrder := Form1.TabOrder - 1; End; If (Msg.Charcode = VK_RETURN) Then begin StringGrid.Col := 4; StringGrid.SetFocus; End; End; end; 這是我的代碼, 因為我將combox 和stringgrid連在一起,當user focus在某一個欄位時就會focus on combobox,當user按下enter,就會向右移一格,如果按下shift tab 就會跳去上個taborder,但結果好像不太明顯,要按兩下tab shift才有反應,why?
BorlandUser
中階會員


發表:148
回覆:217
積分:73
註冊:2004-02-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-09 21:05:04 IP:218.103.xxx.xxx 未訂閱
有人能解答嗎?
系統時間:2024-07-05 6:52:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!