2009-10-23 49 views
1

我有一個單位有很多的動作,一些動作有快捷方式,有些甚至有相同的快捷方式。這是因爲它們屬於應用程序中的不同模塊,並且它們不同時處於上下文中。有沒有辦法用快捷方式覆蓋先前註冊的操作?

現在我有一個全局非模態對話框(稱爲objectinspector),可以隨時隨地啓動。它有一些快捷方式與模塊中其他地方相同的動作。

所以我想暫時覆蓋當objectinspector處於活動狀態時共享相同快捷方式的操作,並在停用時釋放它。

我有這樣的代碼在objectinspectors OnActivate事件:

ClientActions.RegisterAction(ClientActions.actObjectInspectorNewWindow, ShowNewObject); 
  • ClientActions是包含行動單元。
  • RegisterAction是一種將事件與操作關聯的方法。
  • actObjectInspectorNewWindow是實際的操作。
  • ShowNewObject是執行操作時應該調用的事件。

因此,對於每個模塊和無模式對話框,都有上述方法註冊的一些操作。當兩個操作共享相同的快捷方式時,問題就來了。當用戶按下快捷鍵時,首先註冊的動作似乎取勝並執行。 我首選執行了使用該快捷方式註冊動作的最後一個動作。

這怎麼辦?

問候

+0

可以TAction.OnUpdate事件中使用快捷鍵使這種衝突可以得到解決? – 2009-10-23 17:50:27

回答

1

如果我理解你的問題正確,你在你的應用程序超過一個TActionList。不同操作列表中的操作可能使用相同的快捷鍵。你想要的動作,當

我會做到這一點的方法是指定形式的OnShortCut事件處理程序執行控制。在該事件處理程序中,按您希望操作列表具有的優先順序調用TActionList.IsShortCut()。當TActionList.IsShortCut()返回True時,將OnShortCut的Handled參數設置爲True並退出。當TActionList.IsShortCut()返回True時,它將實際執行該操作。

+0

謝謝,我不知道有一個快捷處理器。但在我的情況下,我在單元ClientActions中有一個大的全局TActionList。所以我認爲這在這種情況下不起作用。 – 2009-10-27 16:13:52

2

如果行動是在同一個TActionList,您必須分配給scNone要禁用,然後分配的快捷方式新動作的動作。例如:

acEditCopy.Enabled:=False; 
acEditCopy.ShortCut:=scNone; 

acShowCalculator.Enabled:=True; 
acShowCalculator.ShortCut:=ShortCut(Ord('C'), [ssCtrl]) 

通過這種方式,來檢查,如果presed鑰匙對應於的ActionList的快捷方式,當它發現分配第一Shourcut不破的代碼。我希望這可以幫助你,這個事情在一個月前讓我瘋狂。 :-)

+0

嗯,但在這種情況下,它可能很難找出禁用操作。 – 2009-10-27 16:23:06

+1

你可以寫類似的方法: EnableDiableShortcutsModule1(AEnabled:布爾) EnableDiableShortcutsModule2(AEnabled:布爾) EnableDiableShortcutsModuleX(AEnabled:布爾) 然後調用取決於你即將在aplication輸入/負載模塊的方法。傳遞AEnabled = true將爲模塊分配快捷方式以指定所需的操作,並清除所有其他類似的快捷操作,反之亦然 – 2009-10-27 16:30:58

相關問題