Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.059 c
1-1101111515
BaDeVlad
2004-11-22 11:18
2004.12.05
Непечатаемые символы в RichEdit


1-1100687999
Chuk
2004-11-17 13:39
2004.12.05
Туплю по заголовку формы


1-1100861315
hgd
2004-11-19 13:48
2004.12.05
Как измерить время процедуры в милисек


1-1100801044
self001
2004-11-18 21:04
2004.12.05
переменные файла


1-1100889661
markers
2004-11-19 21:41
2004.12.05
Как вызвать процедуру находящуюся в переменной.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский