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

PopupMenu的Esc鍵,是否可用其他鍵代替

尚未結案
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-01 15:40:44 IP:203.73.xxx.xxx 未訂閱
請問各位大大 在PopupMenu中,按Esc可以離開PopupMenu的視窗,是不是可以加入其它鍵,讓其它鍵有類似的功能,例如開了PopupMenu後,按F1可以跟Esc的功能一樣。 ========================================= 程式有問題並不可怕,最怕是不知問題出在那 不知問題在那不可怕,更怕是不知如何問問題 寫程式要從最簡單的開始
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
wameng
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-01 21:00:31 IP:61.31.xxx.xxx 未訂閱
目前我認為可以做到的方式: 第一種:使用投機取巧方式。POPUPMENU 中新增"關閉"項目,並定義為 F1。 ShortCut 可配合 TActionList 處理快速鍵。 在 Action1.Execute 中 ,加入關閉 PopupMenu 的動作。 缺點: 會多一個顯示項目。 第二種:利用 PopupList 接管 WndProc 並判斷 WM_MENUCHAR。 缺點: 只能接受數字或字母字元。F1....F12 不行。 第三種:利用 HotKey 。 缺點: 需註冊熱鍵。RegisterHotKey 可能會干擾別的程式。 最後補充一點: 若要使POPUPMENU 關閉。可使用 PostMessage(Handle,WM_LBUTTONDOWN,0,0); PostMessage(Handle,WM_LBUTTONUP,0,0); 這樣的方法。 參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-02 09:28:36 IP:61.59.xxx.xxx 未訂閱
謝謝wameng大大的回覆,想請問一下第一種方式的設定,因為我有拉一個 PopupMenu與ActionList,並設Action1為關閉 PopupMenu 的動作,並設定 ShortCut為F1,但是我按F1並不會關閉PopupMenu說。 ========================================= 程式有問題並不可怕,最怕是不知問題出在那 不知問題在那不可怕,更怕是不知如何問問題 寫程式要從最簡單的開始
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
wameng
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-02 10:05:38 IP:61.222.xxx.xxx 未訂閱
Sorry ! 有點秀斗。    第一種 方式只適用於POPUPMENU尚未展開。    我用第二種方式做到。
  ...
  private
    DefMenuProc: TFarProc;
    procedure MenuWndProc(var Message: Tmessage);
  .....    procedure TForm1.FormCreate(Sender: TObject);
begin
  DefMenuProc:=Pointer(GetWindowLong(PopupList.Window,GWL_WNDPROC));
  SetWindowLong(PopupList.Window,GWL_WNDPROC,LongInt(MakeObjectInstance(MenuWndProc)));
end;    procedure TForm1.MenuWndProc(var Message:Tmessage);
var
  F1KeyDn :Boolean;
begin
  With Message do
    Result:=CallWindowProc(DefMenuProc,PopupList.Window,Msg,WParam,LParam);      F1KeyDn := (GetKeyState(VK_F1) and not $7FFF) <> 0;
  if F1KeyDn then
  begin
    PostMessage(Handle,WM_LBUTTONDOWN,0,0);
    PostMessage(Handle,WM_LBUTTONUP,0,0);
  end;
end;
參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-02 13:06:56 IP:203.73.xxx.xxx 未訂閱
非常感謝wameng大大,問題已經解決了。 剛剛試了,關掉視窗時會有錯誤。 在Form的Destroy加入以下代碼,就不會出現了。 SetWindowLong(PopupList.Window,GWL_WNDPROC,LongInt(DefMenuProc)); ========================================= 程式有問題並不可怕,最怕是不知問題出在那 不知問題在那不可怕,更怕是不知如何問問題 寫程式要從最簡單的開始 發表人 - shinjie 於 2005/06/02 14:42:03
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
系統時間:2024-06-02 19:09:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!