Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFINTRF

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFINTRF

Сообщение zna »

Доброго всем. Есть желание "улучшить" сей интерфейс обработкой событий:
1. Изменение количества в спецификации, поле SPSOPR.KOLFACT,
2. Закрытие окна SCRHEADER.
Прошу подсказать, к какому окну/ панели привязать события cmCheckField и cmCancel (правильно?).
Попытка привязать эти события в главном HandleEvent к успеху не привела, реакции нет:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
end;
alter interface IMNFINTRF;
..
HandleEvent 


cmCancel:
{
  inherited::handleEvent(cmCancel);
  message('Main: cmCancel!');
}
  end;

Изображение
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение Den »

Там embedded - область. А встроен в нее Nakl501
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Den писал(а):Там embedded - область. А встроен в нее Nakl501
Да, вижу. И как быть?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

Обсуждалось уже как то.
Самый простой путь - послать Notify во встроенном фейсе и поймать его в главном.
Сложный - связать события - и там наверняка эта связь есть - у вас же чего нибудь обновляется в головном фейсе.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

edward_K писал(а):Обсуждалось уже как то.
Самый простой путь - послать Notify во встроенном фейсе и поймать его в главном.
Сложный - связать события - и там наверняка эта связь есть - у вас же чего нибудь обновляется в головном фейсе.
Вот, нашёл описание Notify: http://www.tyumbit.ru/gal_forum/viewtop ... ify#p36445
Дочерний интерфейс- Nakl501, так?
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

В вашем случае видимо да.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Испробовал несколько вариантов работы с Notify по мотивам нашего форума, но целостной картины в уставшей голове не складывается.
Непонятки, в частности, с тем, как вызвать метод Notify в дочернем интерфейсе Nakl501. По Ctrl +F4 на поле "количество" имею M_UP::IMNFINTRF.SCEDITWINDOW.M_UP::NAKL501.EDITSOPR.BRSPECIF1.SPSOPR.KOLFACT
Видно, что два интерфейса, но как событие в дочернем поймать? Вот заготовка, поправьте, пож.:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
end;
objInterface iNotifier;
  function Notify: boolean;
  event function OnNotify: boolean;
end;
vipinterface Notifier implements iNotifier;              
interface Notifier;
  create view Dummy;
  function INotifier.Notify: boolean;
  {
    Result := OnNotify;
  }
end.
alter interface IMNFINTRF;
HandleEvent  //События главного окна
cmInit:
{ inherited::handleEvent(cmInit);
  message('Событиe главного окна-cmInit Main!');

}
cmCancel:         //Срабатывает при выходе из интерфейса НОС
{
  inherited::handleEvent(cmCancel);
  message('Main: cmCancel!');
}
  end;
window NAKL501;
HandleEvent
cmInit:
{ inherited::handleEvent(cmInit);
  message('Событиe главного окна-cmInit Main!');
    if (cfsSetCurrentContainer('M_UP::NAKL501.EDITSOPR.BRSPECIF1') <> cfOk)           // Здесь ошибка
      { Message(''#3'Ошибка установки контейнера M_UP::NAKL501.EDITSOPR.BRSPECIF1', Error); }
      else {message('M_UP::NAKL501.EDITSOPR.BRSPECIF1 => Ok!');}

}
cmCancel:
{
  inherited::handleEvent(cmCancel);
  message('cmCancel!');
}

end;
end;
end./*
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

Notify отдельная функция - зачем ее где то описывать?
Она отправляет событие всем фейсам и ваша задача всего лишь обработать сие в нужных.
Более сложное - это примерно что вы сделали, но фейс должен быть объявлен и связан с функциями в обоих фейсах ( bindevent и прочая фигня - поиск в viprogr.chm рулит). Чуть проще, но в своих фейсах можно сделать однонаправленною связку(по тому же принципу, только связываете дочку сразу родителем). Если в обе стороны, то то через связующий фейс.
вот вам пример

Код: Выделить всё

   if isChange
        Notify(cmTableChanged, longint(999999));
В нужном ловим

Код: Выделить всё

cmTableChanged:
{ var ww_nrec:comp;
  ww_nrec:=GetNotificationInfoPtr
  case ww_nrec of
  999999: {}
  end;
}

zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Сделал так:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
alter interface IMNFINTRF;
HandleEvent  //События главного окна
cmTableChanged:
{
    var ww_nrec:comp;
    ww_nrec:=GetNotificationInfoPtr
    case ww_nrec of
    999999: {message(999999);}
    end;
}
  end;
window NAKL501;
HandleEvent
cmInit:
{ inherited::handleEvent(cmInit);
  message('Событиe главного окна-cmInit Main!');
    if (cfsSetCurrentContainer('M_UP::NAKL501.EDITSOPR.BRSPECIF1') <> cfOk)           // Здесь ошибка
      { Message(''#3'Ошибка установки контейнера M_UP::NAKL501.EDITSOPR.BRSPECIF1', Error); }
      else {message('M_UP::NAKL501.EDITSOPR.BRSPECIF1 => Ok!');}

}
cmTblRefresh:
{if IsNew() or IsModified() then
 {
   Notify(cmTableChanged, longint(999999));
   message('NAKL501 ==> cmTblRefresh!')
 }
}
end;
end;
end.
- никаких сообщений при модификации записи в спецификации накладной не получаю..
на isChange ругается..
Какое событие в NAKL501 использовать?
Вообще, нет реакции ни на одно событие в этом интерфейсе. Пробовал :cmTblRefresh, cmUpdateRecord, cmPositionChanged..
Последний раз редактировалось zna 01 июн 2015, 10:52, всего редактировалось 1 раз.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

ischange сие кусок из моего кода - просто там дофига событий и связанных табл - приходится ловить все.
В простом случае хватит cmUpdateRecord + cmInsertRecord - это самое правильное. И сначала inherited , потом ваше.
Не по теме - контейнер лучше ставить устанавливать через cfsGetCurrentContainerSelf - так как то надежней. А то вдруг у вас второй экземпляр будет - промахнетесь.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Поправил, но результат не изменился:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
end;
alter interface IMNFINTRF;
HandleEvent  //События главного окна
cmInit:
{ inherited::handleEvent(cmInit);
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)           //нормально
      { Message(''#3'Main: Ошибка установки контейнера ==> '+cfsGetCurrentContainerSelf, Error); }
      else {message('Main: '+cfsGetCurrentContainerSelf+' ==> Ok!');}
}
cmCancel:         //нормально..
{
    inherited::handleEvent(cmCancel);
    message('Main: cmCancel!');
}
cmTableChanged:
{
    var ww_nrec:comp;
    ww_nrec:=GetNotificationInfoPtr
    case ww_nrec of
    999999: {message(999999);}
    end;
}
  end;
window NAKL501;
HandleEvent
cmInit:
{ inherited::handleEvent(cmInit);
 // message('Событиe главного окна-cmInit Main!');
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)           //cfsGetCurrentContainerSelf
      { Message(''#3'NAKL501: Ошибка установки контейнера ==> '+cfsGetCurrentContainerSelf, Error); }
      else {message('NAKL501: '+cfsGetCurrentContainerSelf+' ==> Ok!');}
}
cmCancel:
{
  inherited::handleEvent(cmCancel);
  message('NAKL501 ==> cmCancel!');
}
cmTblRefresh:
{
  inherited::handleEvent(cmTblRefresh);
  message('NAKL501 ==> cmTblRefresh!')
  if IsNew() or IsModified() then
   {
     Notify(cmTableChanged, longint(999999));
   }
}
cmUpdateRecord:
{
  inherited::handleEvent(cmUpdateRecord);
  message('NAKL501 ==> cmUpdateRecord!')
}
cmPositionChanged:
{message('NAKL501 ==> cmPositionChanged!')}
end;
end;
end.

Нет реакции ни на одно событие в NAKL501, в том числе и на Init..
Контейнер в главном интерфейсе установился нормально.
Последний раз редактировалось zna 01 июн 2015, 14:01, всего редактировалось 1 раз.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

1. Notify(cmTableChanged, longint(999999)); поставте в cmUpdateRecord и вы видимо путаете.
Зачем вам события окна? Вам надо перехватывать события в самом встроенном фейсе. В вашем коде должно быть 2 фейса! И события сии табличные - то есть Tableevent table ?????
Ловить событие нужно в том фейсе, где надо - в родителе, генерить в дочернем.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Отлично, получилось! Благодарю Эдварда за терпение. :-)
Теперь: событие поймал в родительском интерфейсе, в нём же модифицировал количество, и послал rescanpanel(#spsopr). Но- запись не обновилась и не сохранилась. Наверное, делать update надо в дочернем интерфейсе, т.е. организовать двусторонний обмен данными. Было такое здесь. Пока так:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
end;
var cSpSoprNrec: comp;
alter interface IMNFINTRF;
create view
as select katsopr.*, spsopr.*
  from  katsopr,spsopr;
HandleEvent  //События главного окна
cmTableChanged:
{
    var ww_nrec:comp;
    ww_nrec:=GetNotificationInfoPtr
    case ww_nrec of
    999999:
     { 
        if getfirst spsopr where((cSpSoprNrec == spsopr.nrec)) = tsOk then
         {
            spsopr.kolopl:= 555;
            if update current spsopr = tsOk {}
            rescanpanel(#spsopr);                                    //Нет обновления в дочернем интерфейсе
         }
     }
    end;
}
end;
end.
//---------------------------------------------------------------------------------------------------
alter interface NAKL501;
HandleEvent
//if isChange then {Notify(cmTableChanged, longint(999999));}
cmInit:
{ inherited::handleEvent(cmInit);
 // message('Событиe главного окна-cmInit Main!');
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) <> cfOk)           //cfsGetCurrentContainerSelf
      { Message(''#3'NAKL501: Ошибка установки контейнера ==> '+cfsGetCurrentContainerSelf, Error); }
      else {message('NAKL501: '+cfsGetCurrentContainerSelf+' ==> Ok!');}
}
cmCancel:
{
  inherited::handleEvent(cmCancel);
  //message('NAKL501 ==> cmCancel!');
}
end;
TableEvent Table spsopr
cmUpdateRecord:
{
  inherited::handleEvent(cmUpdateRecord);
       if isvalid(#spsopr) then
         {
            cSpSoprNrec:= spsopr.nrec
            Notify(cmTableChanged, longint(999999));
            //message('cSpSoprNrec = '+cSpSoprNrec);
         }
}
end;
end.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5185
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение edward_K »

ну мне влом смотреть. Но почему RescanPanel(#spsopr)? Включаете конфигуратор. Добавляете поле - та таблица, что красная она главная в этом окне - по ней и нужно обновлять(при условии что эта панель в том фейсе где надо!).
Если же вам нужно кол-во в spsopr обновить - то тогда зачем такие сложности? Там же бы и обновили. Обратно тоже можно через Notify - с другим событием или идентификатором. Вообще эта функция из кадровского модуля - типа чтобы все окна сразу обновить.
Правильней все таки юзать связку событий - ищите event bindevent здесь и в vipprogr.chm. Но это немножко сложновато и легко можно зациклить процесс.
zna
Местный житель
Сообщения: 552
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Челябинск
Контактная информация:

Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI

Сообщение zna »

Итак, вопрос обновления спецификации решён. Событие cmUpdateRecord берётся из M_UP::NAKL501.editsopr, всё модифицировалось и обновилось.
Далее, хотелось бы понять, как добавить объект (колонку, кнопку) в "дочерний" интерфейс? На событие cmInit реакции нет. Пытался также связку событий построить по документации, но непонятно, как делать в "дочернем" alter interface, в частности, как привязать его к объектному интерфейсу.
Может, у кого- нить есть пример по alter interface NAKL501 c добавлением элементов? Сейчас так:

Код: Выделить всё

#Component "M_UP"
#include Galnet.inc
end;
var cSpSoprNrec, cKatSoprNrec     : comp;
    scur_obj, scont_inf, sObjType : string;
    lcur_obj, MyFieldNum          : longint;
objInterface Emb_Events;
  event procedure PosChanged (nrec : comp);
  procedure pPrint;
end;
alter interface IMNFINTRF;
HandleEvent  //События главного окна
cmTableChanged:
{
    var ww_nrec:comp;
    ww_nrec:=GetNotificationInfoPtr
    case ww_nrec of
    999998: {message('Запись в спецификации обновлена!');}
    999999: {message('SELECTNAKL ==> lcur_obj = '+lcur_obj);}
    end;
}
end;
end.
alter interface NAKL501;
function _Zaknar: string; forward;
create view
(ZakNar) as select _Zaknar;
function _Zaknar: string;
{
  _Zaknar:= '_ZakNar';
}
HandleEvent
cmInit:
{
    if inherited::handleEvent(cmInit) != heOk then {abort; exit;}
    if (cfsSetCurrentContainer(cfsGetCurrentContainerSelf) = cfOk)           //cfsGetCurrentContainerSelf
      {
        if cfsGetObjInfo('SELECTNAKL', scur_Obj, lcur_obj, scont_inf, sObjType) = cfOk then
           {

           }
        Notify(cmInit, longint(999999));
        Message('NAKL501: '+cfsGetCurrentContainerSelf+' ==> Ok!');
        cfsCreateObject('Column', 'SELECTNAKL', 'ZakNar', FALSE, MyFieldNum);
        cfsSetProp ( MyFieldNum, cfpVisible,TRUE);
        cfsSetProp ( MyFieldNum, cfpTitle, 'Заказ-наряд');
        cfsSetProp ( MyFieldNum, cfpFieldName,'ZakNarТекст');
        cfsSetProp ( MyFieldNum, cfpMaxLen, 30 );
        cfsSetProp ( MyFieldNum, cfpProtect,true);
      }
 }
end;
TableEvent Table spsopr
cmPositionChanged : {PosChanged (katsopr.nrec);}
end;
window editsopr;
TableEvent Table spsopr
cmUpdateRecord:
{
  if inherited::handleEvent(cmUpdateRecord) != heOk then {abort; exit;}
  if isvalid(#spsopr) then
  {
    cSpSoprNrec:= spsopr.nrec
    Notify(cmTableChanged, longint(999998));
    spsopr.kolopl:= 1111;
    spsopr.kolfact:= 1111;
    if update current spsopr = tsOk rescanpanel(#spsopr);
  }
}
end;
end;
end.
Ответить