Из одной формы вызвать обработчик события в другой

Morfeuz
Дата: 08.06.2009 18:09:01
Есть проект с подобием 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 главной формы = ноль, так задуман интерфейс, и менять его нельзя.

В общем, застрял пока на первом варианте...
Petro123
Дата: 08.06.2009 19:24:22
Morfeuz,

. . . В стиле Out. . . . это как? Сделай конструктор шаблон форм.
Гаджимурадов Рустам
Дата: 08.06.2009 19:29:15
Лично я даже вопрос не понял. В заголовке топика одно, в сабжевом посте - другое... Бардак.
Morfeuz
Но как правильно переназначить события нажатия кнопок на новой форме обработчику acOpenExecute?
А зачем?
Morfeuz
Дата: 08.06.2009 21:40:01
Petro123
. . . В стиле Out. . . . это как? Сделай конструктор шаблон форм.

Outlook Bar - интерфейс навигационной панели Microsoft Outlook (использовал JVCL-компонент TJvOutlookBar, но это не к сути вопроса имеет мало отношения). А как "конструктор шаблон форм"? :)
Гаджимурадов Рустам
Лично я даже вопрос не понял. В заголовке топика одно, в сабжевом посте - другое... Бардак.
Morfeuz
Но как правильно переназначить события нажатия кнопок на новой форме обработчику acOpenExecute?
А зачем?

А мне казалось заголовок и вопрос вполне себе коррелируют. Может, не вполне понятно изъясняюсь, спросите, что непонятно.
А зачем... 1) В acOpenExecute работа с другими элементами формы, так бы запихнул внутрь обработчика новой формы и не думал, ан нет 2) Про AV написал, возможно, это как-то связано с механизмом работы TAction. Пробовал наследовать новую форму от формы главного окна, всё хокей, работает на ура, без всяких AV, но очень много лишнего унаследовалось от главной формы, практически всё) Разбираться с тонкостями ООП, чтобы поотключать лишнее, ради разовой задачи не хочется, но, чувствую, придётся... 3) Как-то некрасиво это: по идее дочерняя форма ничего не должна знать про главную, а тут, на тебе, пожалуйста, вызывает её метод
Гаджимурадов Рустам
Дата: 08.06.2009 23:25:06
Morfeuz
А мне казалось заголовок и вопрос вполне себе коррелируют.
Может, не вполне понятно изъясняюсь, спросите, что непонятно.
Да я даже не знаю, что спрашивать, потому что вопросов Вы назадавали
много, текста тоже много, а с чем проблема - непонятно.

Есть Form1 и Form2. Action в первой вызывает вторую.
Нужно чтобы при этом во второй форме у определенных
кнопок переназначились обработчики на какой-то
Action (или тот же самый) из первой формы? Если да, то

1. Чем не устраивает uses Form1 во второй форме и
назначением нужным кнопкам нужных обработчиков
в design-time ?

2. Если что-то не устраивает либо там возможны
ветвления, то чем не устраивает то же самое, но
выполняемое динамически?

Вопрос, извините, какой-то чересчур тривиальный.
Тут ООП, наследованием форм и пр. и не пахнет.
Petro123
Дата: 08.06.2009 23:59:51
Morfeuz

Может, не вполне понятно изъясняюсь, спросите, что непонятно.

приведи скриншот и разбери любой простейший пример Demo MDI
Док
Дата: 09.06.2009 11:14:21
Если я правильно понял суть проблемы, то не проще создать отдельный модуль, где закодить публичные процедуры, а затем просто добавить в uses (в секции implementation) заинтересованных юнитов и тягать их оттуда?

=================
Док.
Morfeuz
Дата: 12.06.2009 03:44:49
Гаджимурадов Рустам, спасибо огромное! Всем остальным спасибо за участие!
Гаджимурадов Рустам

Есть Form1 и Form2. Action в первой вызывает вторую.
Нужно чтобы при этом во второй форме у определенных
кнопок переназначились обработчики на какой-то
Action (или тот же самый) из первой формы? Если да, то

1. Чем не устраивает uses Form1 во второй форме и
назначением нужным кнопкам нужных обработчиков
в design-time ?

2. Если что-то не устраивает либо там возможны
ветвления, то чем не устраивает то же самое, но
выполняемое динамически?

Вопрос, извините, какой-то чересчур тривиальный.
Тут ООП, наследованием форм и пр. и не пахнет.

Вот, всё именно так и обстоит!!! Растёкся я мыслью по древу... По вашей наводке сделал чистый проект с двумя формами, убедился, что технология (по п. 2) работает на ура, значит, ошибка в логике работы новой формы, стал копать, нашёл ошибку в сопоставлении обработчиков кнопкам формы... ООП тут и не пахнет :)