最近在做一個 Host+DLL 的插件系統,每個DLL模塊都繼承一個基類模塊TBaseForm , 然後再基類模塊裡定義了增F1、刪F2、改F3、查F4等功能,每個功能定義了一個快捷鍵,
在主程序這邊通過PageControl來加載每個DLL模塊,問題來了,當我打開多個模塊時,按下 F1 時,系統調用的不是我當前激活的 TabSheet 模塊,而是第一個打開的模塊的新增
功能,原來快捷鍵被第一個模塊注冊後,後面打開的模塊再注冊就無效了。後來想到一個方法,就是再 TabSheet的 OnHide 事件裡把當前模塊的快捷鍵取消,在 onShow 事件裡
再把當前模塊的快捷鍵關聯起來,經過測試成功!!!,以下是部分代碼:
1 procedure TBaseForm.bidingshortcut; //綁定快捷鍵 2 begin 3 al_new.ShortCut:=TextToShortCut('F5'); 4 al_edit.ShortCut:=TextToShortCut('F6'); 5 al_delete.ShortCut:=TextToShortCut('F7'); 6 al_refdata.ShortCut:=TextToShortCut('F8'); 7 al_query.ShortCut:=TextToShortCut('F3'); 8 al_report.ShortCut:=TextToShortCut('F2'); 9 al_export.ShortCut:=TextToShortCut('F10'); 10 al_import.ShortCut:=TextToShortCut('F4'); 11 al_gridset.ShortCut:=TextToShortCut('F9'); 12 end; 13 14 procedure TBaseForm.unbidingshortcut; //解除綁定快捷鍵 15 begin 16 al_new.ShortCut:=TextToShortCut('none'); 17 al_edit.ShortCut:=TextToShortCut('none'); 18 al_delete.ShortCut:=TextToShortCut('none'); 19 al_refdata.ShortCut:=TextToShortCut('none'); 20 al_query.ShortCut:=TextToShortCut('none'); 21 al_report.ShortCut:=TextToShortCut('none'); 22 al_export.ShortCut:=TextToShortCut('none'); 23 al_import.ShortCut:=TextToShortCut('none'); 24 al_gridset.ShortCut:=TextToShortCut('none'); 25 end;
然後在Host程序中的onHide和onShow分別調用unbidingshortcut和bidingshortcut即可。
這裡有一個基類的轉換過程,因為我事先在tabsheet的tag裡保存了當前窗體,所以只要做以下轉換:
TBaseForm(TabSheet.tag).bidingshourtcut 就可以了。