2012-06-05 45 views
1

我有一個MDI應用程序,我正在使用TActionManager來管理我的應用程序中的操作,這也意味着它包含了我的MDIChild窗體的操作。MDI應用程序中的TActionManager。丟失操作

下面是一個簡單爲例重現我的問題:

創建一個新的VCL窗體應用程序有2種形式。 Form1 & Form2 通過Form1拖放一個TButton和一個TActionManager。 使用TActionManager的彈出式編輯器創建2個TA。 爲Form1設置FormStyle:= fsMDIForm。 爲Form2設置FormStyle:= fsMDIChild。

將此代碼添加到通訊員事件:

// Form1 
procedure TForm1.Action1Execute(Sender: TObject); 
begin 
    ShowMessage('Action1'); 
end; 
procedure TForm1.Action2Execute(Sender: TObject); 
begin 
    ShowMessage('Action2'); 
end; 
procedure TForm1.Button1Click(Sender: TObject); 
var 
    oForm2: TForm2; 
begin 
    oForm2 := TForm2.Create(Application); 
end; 

// Form 2 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caFree; 
end; 

跌幅超窗體2一TActionToolBar。 使用TActionManager彈出式編輯器在此TActionToolBar上放置Action1和Action2。 保存&運行。 單擊Form1上的按鈕以顯示Form2。 一切按預期工作。現在關閉Form2並將其打開。 操作失蹤...

有沒有辦法避免失去我的行動知道我真的需要使用TActionManager?

回答

2

我會盡力解釋我最理解的問題。

首先,你的行爲斷開不「走」,它們仍然存在。換句話說,ActionManager1.ActionCount仍然會返回2.

就是說,你在設計時做的是將一個表單變量上的動作列表連接到另一個表單變量上的工具欄。換一種說法。 Form1.ActionList正在附加到Form2.ToolBar。這就是爲什麼它在您第一次運行的時候運行,下次創建TForm2的實例時,它不再是默認創建的Form2,因此也沒有連接到變量Form1。這是我多年來最好的猜測,並且我遇到了與DataModules類似的問題。

我的答案是,將行動列表放在子窗體上。如果您需要在所有子窗體上共享操作,則操作列表和工具欄屬於MDI父級。這對於MDI應用程序來說是相當標準的。

+0

那麼我的問題比這個更大,因爲我需要每個窗體上的TActionManager來允許自定義ToolBars,而這些組件是不可能的。我會用TMS組件來做。 – CharleyXIV