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

請問Combobox下拉選單展開後,在form上任一元件按一下會自動收起來問題?

尚未結案
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-27 13:07:43 IP:203.204.xxx.xxx 未訂閱
請問Combobox下拉選單展開後,在form上任一元件按一下,展開的下拉選單會自動的消失,這個功能不知怎麼做的.是否是收到某一特定訊息呢,因為正在寫一個類似這種功能的元件,但不知展開後如何在點到別的元件時能自動收起來,謝謝。
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-27 13:34:07 IP:210.243.xxx.xxx 未訂閱
引言: 請問Combobox下拉選單展開後,在form上任一元件按一下,展開的下拉選單會自動的消失,這個功能不知怎麼做的.是否是收到某一特定訊息呢,因為正在寫一個類似這種功能的元件,但不知展開後如何在點到別的元件時能自動收起來,謝謝。
你可以攔WM_ACTIVATE, 這個事件會在你取得焦點或 失焦時(點其它地方)告訴你. 去MSDN或本站查查就有了.
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-27 16:09:14 IP:61.222.xxx.xxx 未訂閱
好像不是用 WM_ACTIVATE 。"下拉選單會自動的消失" SETFOCUS、或ONEXIT 並不是主要的依據。 主要因素在點擊視窗空白處,也會導致選單消失。    如果您要繼承 ComBobox 的元件。那麼,就要瞭解:
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure TCustomComboBox.CNCommand(var Message: TWMCommand);
begin
  case Message.NotifyCode of
    CBN_DBLCLK:
      DblClick;
    CBN_EDITCHANGE:
      Change;
    CBN_DROPDOWN:
      begin
        FFocusChanged := False;
        DropDown;
        AdjustDropDown;
        if FFocusChanged then
        begin
          PostMessage(Handle, WM_CANCELMODE, 0, 0);
          if not FIsFocused then PostMessage(Handle, CB_SHOWDROPDOWN, 0, 0);
        end;
      end;
    CBN_SELCHANGE:
      begin
        Text := Items[ItemIndex];
        Click;
        Change;
      end;
    CBN_SETFOCUS:
      begin
        FIsFocused := True;
        FFocusChanged := True;
        SetIme;
      end;
    CBN_KILLFOCUS:
      begin
        FIsFocused := False;
        FFocusChanged := True;
        ResetIme;
      end;
  end;
end;
因此我們得知若Combobox 選單消失,將會觸發 CB_SHOWDROPDOWN Message 攔截這個訊息。試試
Zard
尊榮會員


發表:24
回覆:396
積分:539
註冊:2003-11-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-10-27 17:04:10 IP:210.243.xxx.xxx 未訂閱
引言: 好像不是用 WM_ACTIVATE 。"下拉選單會自動的消失" SETFOCUS、或ONEXIT 並不是主要的依據。 主要因素在點擊視窗空白處,也會導致選單消失。 如果您要繼承 ComBobox 的元件。那麼,就要瞭解:
procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
procedure TCustomComboBox.CNCommand(var Message: TWMCommand);
begin
  case Message.NotifyCode of
    CBN_DBLCLK:
      DblClick;
    CBN_EDITCHANGE:
      Change;
    CBN_DROPDOWN:
      begin
        FFocusChanged := False;
        DropDown;
        AdjustDropDown;
        if FFocusChanged then
        begin
          PostMessage(Handle, WM_CANCELMODE, 0, 0);
          if not FIsFocused then PostMessage(Handle, CB_SHOWDROPDOWN, 0, 0);
        end;
      end;
    CBN_SELCHANGE:
      begin
        Text := Items[ItemIndex];
        Click;
        Change;
      end;
    CBN_SETFOCUS:
      begin
        FIsFocused := True;
        FFocusChanged := True;
        SetIme;
      end;
    CBN_KILLFOCUS:
      begin
        FIsFocused := False;
        FFocusChanged := True;
        ResetIme;
      end;
  end;
end;
因此我們得知若Combobox 選單消失,將會觸發 CB_SHOWDROPDOWN Message 攔截這個訊息。試試
我的意思是收到WM_ACTIVATE 失焦的Message後就可以把元件隱藏或關閉.
iamjsn
初階會員


發表:78
回覆:95
積分:44
註冊:2002-08-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-10-27 22:00:03 IP:203.204.xxx.xxx 未訂閱
感謝兩位大大的幫忙,測試了一下WM_ACTIVATE,不過看了一下這個訊息的說明,似乎不太適用於這裏,因為它好像只會發給最上層視窗,再來就是因為我元件並不是繼承combobox,只是想要達成它自動消失的功能,所以combobox的訊息也不適用於我的元件。我已經用計時器,在滑鼠離開下展選單後一段時間就自動去關掉它。如果各位大大有發現combobox所用的方法,還請告知,謝謝。
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-10-28 03:55:50 IP:61.222.xxx.xxx 未訂閱
事實上可以考慮用 procedure CMCancelMode(var Message: TCMCancelMode); message CM_CANCELMODE; 這個訊息。 當焦點在您的物件上,滑鼠在點擊別處就會觸發這一個訊息事件。 除了這個訊息外,還是要處理 OnExit 事件。 主要是物件焦點轉移(FOCUSED),並不會觸發 CM_CANCELMODE 。
系統時間:2024-11-25 8:49:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!