2012-06-05 2 views
1

У меня есть приложение MDI, и я использую TActionManager для управления действиями в моем приложении, что также означает, что он содержит действия для моих форм MDIChild.TActionManager в приложении MDI. Пропущенные действия

Вот простой Exemple воссоздать мою проблему:

Создать новый VCL Forms приложений с помощью 2-х формах. Form1 & Form2 Опустите TButton и TActionManager над Form1. Создайте 2 TActions, используя редактор PopUp TActionManager. Set FormStyle: = fsMDIForm для Form1. Set FormStyle: = fsMDIChild для формы2.

Добавьте этот код в correspondant событий:

// 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; 

Опустить TActionToolBar над Form2. Drop Action1 и Action2 над этим TActionToolBar, используя редактор Popup. Сохранить & Запустить. Нажмите кнопку на Form1, чтобы показать Form2. Все работает так, как ожидалось. Теперь закройте Form2 и откройте его. Действия отсутствуют ...

Есть ли способ избежать потери моих действий, зная, что мне действительно нужно использовать TActionManager?

ответ

2

Я попытаюсь объяснить, насколько лучше я понимаю проблему.

Прежде всего, ваши действия отключены, а не «ушли», они все еще существуют. Другими словами, ActionManager1.ActionCount по-прежнему будет возвращаться. 2.

С учетом сказанного, то, что вы делаете во время разработки, соединяет один список действий с одной переменной формы с панелью инструментов другой переменной формы. Другими словами. Form1.ActionList прикрепляется к Form2.ToolBar. Вот почему он работает при первом запуске, при следующем создании экземпляра TForm2 он больше не является созданным по умолчанию Form2 и поэтому не связан с переменной Form1. Это было мое лучшее предположение на протяжении многих лет, и у меня возникли аналогичные проблемы с DataModules.

Мой ответ: укажите список действий на дочернюю форму. Если вам нужны действия, которые должны быть доступны для всех дочерних форм, то список действий и панель инструментов принадлежат родителям MDI. Это довольно стандартно для MDI Apps.

+0

Ну, моя проблема больше, чем это, потому что мне нужен TActionManager на каждой Форме, чтобы позволить настраивать панели инструментов, и это не будет возможно с помощью этих компонентов. Я сделаю это с помощью компонентов TMS. – CharleyXIV

Смежные вопросы