Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Внизвызов методов MDIChild из MDIForm Найти похожие ветки
← →
msguns © (2004-11-18 16:27) [0]В панели управления Гл.формы есть 2 группы кнопок: кнопки 1-й группы открыват дочерние формы, кнопки 2-й группы предназначены для управления собственно внутри дочерних окон (работа с БД). Все элементы управления Гл.формы "завязаны" на акции в TActionList, "лежащему" в Гл.форме.
Вопрос в том, как мне "подменить" экшн 2-й группы на вызов нужного метода класса дочерней формы ? Естественно, в каждой дочерней форме этой кнопке должны соответствовать свои действия, т.е. в гл.форме прописать некий единый для всех "дочек" метод невозможно.
Пытался делать через внешнюю процедуру, но, в отличие от метода класса, она не видит свойств и методов класса, в юните с которым определена, и надо передавать все необходимое кучей параметров, а это очень неудобно.
Помогите, пожалуйста, мастера !
← →
Семен Сорокин © (2004-11-18 16:35) [1]подойдет вариант с неким общим предком для всех Child"ов, с подменой методов в самих Child"ах.
← →
msguns © (2004-11-18 16:58) [2]>Семен Сорокин © (18.11.04 16:35) [1]
Ксть у меня общий предок. Правда не один, т.к. "дочки" делятся на 3 осн.группы, поэтому и базовых формы тоже 3. И трабла в том числе заключается в том, что вот эти самые экземпляры дочек сами создают формы (модальные), в которых и надо выполнить, например, позиционирование самой себя на основании, к примеру текущей ячейки грида вызвавшей дочерней формы. Метод же выравнивания универсален и я забабахал его в Гл.форму. Т.е. по кликанию кнопки 2-й группы в панели Гл.формы должна создаться модальная форма класса, известного в текущей дочерней форме. При этом в качестве исходных данных этот метод (позиционирования) должен взять координаты тек.ячейки грида, запомненной в переменной класса доч.формы. Уффф.. Непонятно объясняю ?
Ну тогда проще: как мне в соотв.экшне Гл.формы прописать ссылку на метод класса 2-й формы ? Причем сделать это надо из 3-й форме.
← →
Игорь Шевченко © (2004-11-18 17:07) [3]msguns © (18.11.04 16:27)
Я делал следующим образом (сразу с примером):
Каждая из дочерних форм реализует интерфейс.unit SmToolbarInterface;
interface
type
TCommandType = (ctFind, ctGoto);
TCommandTypes = set of TCommandType;
IToolbarCommands = interface
["{D97A7812-091F-4E2F-84DA-08A394646BC2}"]
function SupportedCommands : TCommandTypes;
procedure FindCommand;
procedure GotoCommand;
function GotoEnabled : Boolean;
end;
implementation
end.
И в главной форме:procedure TfrmMain.actGotoExecute(Sender: TObject);
var
IC : IToolbarCommands;
begin
if Assigned(ActiveMDIChild) and
ActiveMDIChild.GetInterface(IToolbarCommands, IC) then
IC.GotoCommand();
end;
procedure TfrmMain.actFindExecute(Sender: TObject);
var
IC : IToolbarCommands;
begin
if Assigned(ActiveMDIChild) and
ActiveMDIChild.GetInterface(IToolbarCommands, IC) then
IC.FindCommand();
end;
procedure TfrmMain.ActionList1Update(Action: TBasicAction;
var Handled: Boolean);
var
Supported: TCommandTypes;
IC: IToolbarCommands;
GotoEnabled: Boolean;
begin
GotoEnabled := false;
if Assigned(ActiveMDIChild) and
ActiveMDIChild.GetInterface(IToolbarCommands, IC) then begin
Supported := IC.SupportedCommands;
GotoEnabled := (ctGoto in Supported) and IC.GotoEnabled();
end else
Supported := [];
actFind.Enabled := ctFind in Supported;
actGoto.Enabled := GotoEnabled;
end;
Соответственно, в дочерней форме реализация выглядит следующим образом:
type
TfrmProcView = class(TForm, IToolbarCommands)
...
private
procedure FindCommand;
procedure GotoCommand;
function GotoEnabled : Boolean;
function SupportedCommands : TCommandTypes;
....
end;
Может, этот способ подойдет
← →
msguns © (2004-11-18 17:17) [4]Блин, интерфейсы еще не юзал Э8(0)
Буду пробовать. Спасибо !
← →
Игорь Шевченко © (2004-11-18 17:24) [5]msguns © (18.11.04 17:17) [4]
Удобно тем, что не надо объявлять общий класс, наследников, и т.д. Интерфейс может быть реализован любым объектом.
← →
Семен Сорокин © (2004-11-18 17:27) [6]
> Игорь Шевченко © (18.11.04 17:24) [5]
> Удобно тем, что не надо объявлять общий класс, наследников,
> и т.д. Интерфейс может быть реализован любым объектом.
Красивое решение согласен, однако если методов много и не все они будут нужны в детях - то здесь, имхо, базовый класс лучше будет смотреться.
← →
vuk © (2004-11-18 17:35) [7]У меня была похожая реализация, в смысле - с интерфейсами. Но идея была немного другая. Дочерние формы/фреймы реализовывали интерфейс, при помощи которого главная форма запрашивала у них наборы команд и их желаемое представление - меню или кнопка на панели инструментов...
← →
msguns © (2004-11-18 17:40) [8]Игорь, а вот такая идея (може проще будет ?):
2-я форма (дочка) определяет некоторое событие, которое связано с флажком, определенным в ней же. Когда она (форма) получает фокус, флаг поднимается, а когда теряет - то опускается.
При нажатии кнопки в Гл.форме посылается сообщение, что это событие произошло и в "дочке" выполнится связанная с этим событием действие.
Только вот как это воплотить ? На самом примитивном примере, если не затруднит.
← →
Игорь Шевченко © (2004-11-18 17:50) [9]msguns © (18.11.04 17:40) [8]
Можно посылать пользовательское сообщение.
Например, так:
в общем unit"е для дочек и главной формы
const
UM_EXECUTECHILDACTION = WM_USER + 666;
в главной форме:
TfMain.SomeActionExecute (Sender: TObject);
begin
if Assigned(ActiveMDIChild) then
PostMessage(ActiveMDIChild.Handle, UM_EXECUTECHILDACTION,
TAction(Sender).Tag, 0);
end;
и в дочке:
type
TChildForm = class(TForm)
private
procedure UmExecuteChildAction (var Message: TMessage); message UM_EXECUTECHILDACTION);
...
end;
procedure TChildForm.UmExecuteChildAction (var Message: TMessage);
begin
case Message.WParam of
.....
end;
end;
Но в этом случае не очень удобно устанавливать Enable|Disable для кнопок, на мой взгляд - связь односторонняя. Кроме того, каждому TAction в главной форме устанваливать свой уникальный tag, что тоже не очень интересно.
← →
msguns © (2004-11-18 18:00) [10]>Семен Сорокин © (18.11.04 17:27) [6]
>Красивое решение согласен, однако если методов много и не все они будут нужны в детях - то здесь, имхо, базовый класс лучше будет смотреться.
Уточню цель.
Приложение работает с БД учетного плана. На Гл.форму вынесено 90% управления, в т.ч. и с объектами БД (добавление, удаление, редактирование, обновление, поиски, сортировки и пр.). Для форм интерфейса с БД у меня есть 3 базовых класса: для справочников, для документов, для отчетов-запросов. Все конкретные формы работы с различными частями БД (журналами, справочниками и т.д. в общем данными списочного плана) происходят от этих базовых классов.
Кроме того, есть формы дополнительные: формы отображения записи (для вставки-редактирования), формы отображения документов. Эти формы модально вызываются из дочерних, описанных выше. Формы также происходят от своих предков, специально для них спроектированных. Вызов выполняется из панели управления Гл.формы из контекстного меню, привязанного к гридам форм 2-й группы (списков). Естественно, что в зависимости от конкретной дочерней формы список доступных функций (кнопок панели Гл.формы)
будет разный. Например, для справочников не нужна кнопка "показать движение по документу", а для журналов накладных нужна.
← →
msguns © (2004-11-18 18:08) [11]>Игорь Шевченко © (18.11.04 17:50) [9]
Это мне намного понятнее ;)
Что касается тэгов, то я решу проблему проще: для каждой акции пропишу собственное сообщение и, соответственно, в дочках столько процедур обработки сообщений, сколько нужно обрабатывать акций. Попробую, потом доложу о результатах.
Спасибо большое
← →
Игорь Шевченко © (2004-11-18 18:09) [12]
> Естественно, что в зависимости от конкретной дочерней формы
> список доступных функций (кнопок панели Гл.формы)
> будет разный. Например, для справочников не нужна кнопка
> "показать движение по документу", а для журналов накладных
> нужна.
Вот я бы и сделал через подобный моему интерфейс, в котором описывается, какие именно команды поддерживает текущая дочерняя форма.
← →
msguns © (2004-11-18 18:14) [13]>Игорь Шевченко © (18.11.04 18:09) [12]
>Вот я бы и сделал через подобный моему интерфейс, в котором описывается, какие именно команды поддерживает текущая дочерняя форма.
Не сомневаюсь ;)
Но я ж не ты. Мне до тебя еще.. ;(
Придет время, разберусь и тоже сделаю. А сейчас надо срочно.
← →
msguns © (2004-11-19 10:32) [14]Сделал через сообщения.
Все работает, немного громоздко, но работает !
Спасибо всем. Игорю особенное - с кисточкой !
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c