Страница 1 из 2
Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFINTRF
Добавлено: 17 апр 2015, 14:10
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;
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 17 апр 2015, 15:32
Den
Там embedded - область. А встроен в нее Nakl501
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 17 апр 2015, 15:54
zna
Den писал(а):Там embedded - область. А встроен в нее Nakl501
Да, вижу. И как быть?
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 17 апр 2015, 16:50
edward_K
Обсуждалось уже как то.
Самый простой путь - послать Notify во встроенном фейсе и поймать его в главном.
Сложный - связать события - и там наверняка эта связь есть - у вас же чего нибудь обновляется в головном фейсе.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 17 апр 2015, 17:05
zna
edward_K писал(а):Обсуждалось уже как то.
Самый простой путь - послать Notify во встроенном фейсе и поймать его в главном.
Сложный - связать события - и там наверняка эта связь есть - у вас же чего нибудь обновляется в головном фейсе.
Вот, нашёл описание Notify:
http://www.tyumbit.ru/gal_forum/viewtop ... ify#p36445
Дочерний интерфейс- Nakl501, так?
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 20 апр 2015, 14:07
edward_K
В вашем случае видимо да.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 29 май 2015, 16:48
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./*
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 29 май 2015, 17:00
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;
}
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 10:31
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..
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 10:43
edward_K
ischange сие кусок из моего кода - просто там дофига событий и связанных табл - приходится ловить все.
В простом случае хватит cmUpdateRecord + cmInsertRecord - это самое правильное. И сначала inherited , потом ваше.
Не по теме - контейнер лучше ставить устанавливать через cfsGetCurrentContainerSelf - так как то надежней. А то вдруг у вас второй экземпляр будет - промахнетесь.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 13:53
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..
Контейнер в главном интерфейсе установился нормально.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 14:01
edward_K
1. Notify(cmTableChanged, longint(999999)); поставте в cmUpdateRecord и вы видимо путаете.
Зачем вам события окна? Вам надо перехватывать события в самом встроенном фейсе. В вашем коде должно быть 2 фейса! И события сии табличные - то есть Tableevent table ?????
Ловить событие нужно в том фейсе, где надо - в родителе, генерить в дочернем.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 16:19
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.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 01 июн 2015, 20:25
edward_K
ну мне влом смотреть. Но почему RescanPanel(#spsopr)? Включаете конфигуратор. Добавляете поле - та таблица, что красная она главная в этом окне - по ней и нужно обновлять(при условии что эта панель в том фейсе где надо!).
Если же вам нужно кол-во в spsopr обновить - то тогда зачем такие сложности? Там же бы и обновили. Обратно тоже можно через Notify - с другим событием или идентификатором. Вообще эта функция из кадровского модуля - типа чтобы все окна сразу обновить.
Правильней все таки юзать связку событий - ищите event bindevent здесь и в vipprogr.chm. Но это немножко сложновато и легко можно зациклить процесс.
Re: Докомпиляция интерфейса наклад-х на отпуск в пр-во IMNFI
Добавлено: 05 июн 2015, 14:44
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.