Есть проект с подобием MDI, реализованным с помощью двух классов: главного и дочернего окна. На форме, унаследованной от класса главного окна имеется компонент TActionList, отвечающий за обработку событий меню, кнопок панели инструментов и т.д. При нажатий кнопки «Открыть», вызывается acOpenExecute, в котором создаётся диалоговое модальное окно для открытия нужной дочерней формы. Это окно показалось пользователям неудобным, сделай, говорят, в стиле OutlookBar. Не вопрос, добавил в проект новую форму, вызываемую из того же acOpenExecute, красота. Но как
правильно переназначить события нажатия кнопок на новой форме обработчику acOpenExecute?
Сделал первое, что пришло в голову: в форме главного окна добавил public процедуру
procedure TfmMainForm.OpenExecute(Sender: TObject);
begin
acOpenExecute(Sender);
end;
а из формы с кнопочками при событии нажатия на неё, вызываю её по имени главного окна, упрощённо так:
TfmMainForm(Application.FindComponent('fmMainForm')).OpenExecute(Sender);
Какую форму открывать, обработчик понимает из предустановленных по этому же событию public-свойств новой формы.
Но полезли Access Violation в самых неожиданных местах, при открытии дочерних форм... Подозреваю, что так делать неправильно :)
Стал думать дальше. Может, фиг с ней, с отдельной формой, покидаю всё на TPanel, созданную в главном окне, и буду таскать её, куда захочу. Но. ClientHeight главной формы = ноль, так задуман интерфейс, и менять его нельзя.
В общем, застрял пока на первом варианте...