каз вызвать другое событие из первого события

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

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

BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

каз вызвать другое событие из первого события

Сообщение BlazeBio »

Мне нужно отменить выполнение события cmMAKEORDER, если вызвано событие cmCancel (скорее всего сmСancel, так как в дорабатываемом интерфейсе вылезает сообщение с кнопками ОК и Отмена). Как это можно сделать? Может можно как-то вызвать событие из события?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

PutCommand
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Ясно. Но при вызове PutCommand произодёт явный вызов события. Но нужно, чтобы произошла отмена события cmMAKEORDER, а не передача выполнения в cmCancel. Но если делать так, то может в cmCancel можно как-то запретить выполнения cmMAKEORDER ?
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Сообщение Алексей »

может сделать alter интерфейс и при определенных условиях отменять выполнение события cmMakeOrder ?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

У меня и так происходит alter interface. Меня именно и волнует, что бы при определённых условиях, когда появляется сообщение c кнопками OK и Отмена, то при нажатии Отмена происходила остановка cmMAKEORDER или вообще оно не выполнялась. Можно ли вот как-то так сделать ?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

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

Сообщение Den »

Не совсем понятен смысл что Вы хотите сделать. Т.е. в стандартном фейсе при запуске cmMAKEORDER в момент его прерывания стандарной реализацией (вызовом диалога на прерывание выполнения с нажатием в нем кнопки "отмена") Вы хотите поймать это нажатие и обработать свою процедуру ?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Да, я хочу поймать момент, когда нажата кнопка отмена.
Вот исходник

#component "L_SKLAD"
const
cmButDistributionValue = 55676;
end;

alter interface ACTCOMPL;
var butMy_var: longint;
fMy_var, fMy_var2 : longint ;
cenaKOMPL , summak, summaTemp : double;
pos_nrec :comp;
b,a:integer;
fullname: string;
create view
(osum,osum2)
as select
spsopr.rprice * spsopr.kol,
prv * spsopr.kol,
katparty.* ,soprorda.* , katmc.* , spsopr.*
from katparty , spsopr, soprorda, katmc;
//'L_SKLAD::ACTCOMPL.SPECIFINFO.SCRSPECIFINFOKOMPL.b_SCRSPECIFINFOKOMPL_Расчет_цен_для_комплекта
window SPECIFINFO;
handleEvent
cmInit :
{
inherited::handleEvent(cmInit);
var i : integer;
for (i := 0; i < 2; i++)
{
cfsSetCurrentContainer('ACTCOMPL.SPECIFINFO.SCRSPECIFINFOKOMPL');

cfsCreateObject('button', 'SCRSPECIFINFOKOMPL', 'ButDistributionValue', FALSE, butMy_var);
cfsSetProp('ButDistributionValue','Visible',TRUE);
if (i = 0)
{
cfsSetProp('ButDistributionValue','Visible',FALSE);
}
else
{
cfsSetProp('ButDistributionValue','Visible',TRUE);
}
cfsSetProp('ButDistributionValue','Size_X',176);
cfsSetProp('ButDistributionValue','Size_Y',25);
cfsSetProp('ButDistributionValue','Origin_X', 400);
cfsSetProp('ButDistributionValue','Origin_Y', 105);
cfsSetProp('ButDistributionValue','Command', cmButDistributionValue);
cfsSetProp('ButDistributionValue','Title','Простановка цен');
cfsSetCurrentContainer('ACTCOMPL.SPECIFINFO.BRRASPREDMC');
cfsSetProp('c_BRRASPREDMC_SOPRORDA.PRICE_Цена_МЦ','Skip',false);
cfsSetProp('c_BRRASPREDMC_SOPRORDA.KOL_Количество_в_1','Protect',true);
cfsSetProp('c_BRRASPREDMC_SOPRORDA.KOL_Количество_в_1','Skip',false);
}

}
cmButDistributionValue :
//'L_SKLAD::ACTCOMPL.SPECIFINFO.BRRASPREDMCRAZ.KATPARTY2.NAME'
{ pos_nrec:=spsopr.nrec;
cenaKOMPL:= 0 ;
summak:= 0 ;
startnewvisual(vtRotateVisual, vfTimer + vfBreak + vfConfirm , 'Проставляются цены' , 1 );
pushpos ( BRRASPREDMCRAZ ) ;
If ( Modifier Getfirst soprorda where (( spsopr.nrec == soprorda. cspsopr))=Tsok )
{
do
{
If (Modifier Getfirst katparty where ((soprorda.cparty == katparty.nrec)) = Tsok)
{
do
{
soprorda.price := katparty.CENAZAV;
cenaKOMPL := cenaKOMPL + soprorda.price ;
spsopr.rprice:= cenaKOMPL;
Update current spsopr;
Update current soprorda;
rescanpanel(#spsopr);
rescanpanel(SCRSPECIFINFOKOMPL);
rescanpanel(BRRASPREDMCRAZ)
}
While (Modifier Getnext katparty where ((soprorda.cparty == katparty.nrec)) = Tsok);
}
else
{
cenaKOMPL := cenaKOMPL + soprorda.price ;
spsopr.rprice:= cenaKOMPL;
Update current spsopr;
Update current soprorda;
rescanpanel(#spsopr);
rescanpanel(SCRSPECIFINFOKOMPL);
rescanpanel(BRRASPREDMCRAZ)
}
}
While ( Modifier getnext soprorda where (( spsopr.nrec == soprorda. cspsopr))=Tsok )
}

If (Modifier Getfirst spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok)
{
do
{
summaTemp:=spsopr.rprice*spsopr.kol;
summak := summak + summaTemp;
katsopr.summa:=summak;
update current katsopr;
rereadrecord (#katsopr) ;
rescanpanel (BRBYNAMERAZ);
rescanpanel (BRBYNAME);
}
while (Modifier getnext spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok);
}
getfirst spsopr where ((pos_nrec==spsopr.nrec))=tsok;
rescanpanel(BRRASPREDMCRAZ);
PopPos(BRRASPREDMCRAZ);
StopVisual( '', 0);
}
cmDone:
{
pos_nrec:=spsopr.nrec;
If (Modifier Getfirst spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok)
{
summak:=0;
do
{
summaTemp:=spsopr.rprice*spsopr.kol;
summak := summak + summaTemp;
katsopr.summa:=summak;
update current katsopr;
rereadrecord (#katsopr) ;
rescanpanel (BRBYNAMERAZ);
}
while (Modifier getnext spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok);
}
getfirst spsopr where ((pos_nrec==spsopr.nrec))=tsok;
rescanpanel(BRBYNAMERAZ);
}
end;
end;
window editsopr
handleevent
cmInit:
{
if (inherited :: handleEvent(cmInit)=heOk)
{
var i: integer;
for (i:=0; i<2; i++)
{
cfsSetCurrentContainer('ACTCOMPL.editsopr.brbynameraz');
cfsDestroyObject('c_BRBYNAMERAZ_SUMPRICE_Стоимость');
cfsCreateObject('Column','brbynameraz','osum',FALSE, fMy_var) ;
cfsSetProp('osum','Visible',TRUE);
if (i =0)
{
cfsSetProp('osum','Visible', FALSE );
}
else
{
cfsSetProp('osum' , 'Visible', TRUE ) ;
}
cfsSetProp('osum' , 'Title' , 'Стоимость' ) ;
cfsSetProp('osum' , 'PrecisionVarName' , 'digitToch');
cfsSetProp('osum' , 'PassiveFormat' , '[|-]366`666`666`666`666.88');
SetPrecisionGroup('digitToch',2);
cfsSetProp('osum' , 'MaxLen' , 18 );
cfsSetProp('osum','Protect',true);
cfsSetProp('c_BRBYNAMERAZ_PRV_Цена','Protect',true);
cfsSetProp('c_BRBYNAMERAZ_PRV_Цена','Skip',false);
cfsSetProp('c_BRBYNAMERAZ_SUMPRICE_Стоимость','FieldName','osum');
cfsSetCurrentContainer( 'ACTCOMPL.editsopr.BRBYNAME');
cfsDestroyObject('c_BRBYNAME_SUMPRICE_Стоимость');
cfsCreateObject('Column','BRBYNAME','osum2',FALSE, fMy_var2) ;
cfsSetProp('osum2','Visible',TRUE);
if (i =0)
{
cfsSetProp('osum2','Visible', FALSE );
}
else
{
cfsSetProp( 'osum2' , 'Visible', TRUE ) ;
}
cfsSetProp( 'osum2' , 'Title' , 'Стоимость' ) ;
cfsSetProp( 'osum2' , 'PrecisionVarName' , 'digitToch2');
cfsSetProp( 'osum2' , 'PassiveFormat' , '[|-]366`666`666`666`666.88');
SetPrecisionGroup('digitToch2',2);
cfsSetProp( 'osum2' , 'MaxLen' , 18 );
cfsSetProp('osum2','Protect',true);
cfsSetProp('c_BRBYNAME_PRV_Цена','Protect',true);
cfsSetProp('c_BRBYNAME_PRV_Цена','Skip',false);
cfsSetProp('c_BRBYNAME_SUMPRICE_Стоимость','FieldName','osum2');
}
}
}
cmMAKEORDER:
{
cfsSetCurrentContainer('ACTCOMPL');
cfsGetProp('ACTCOMPL','Title',fullname);
If (fullname='Акты на разукомплектование (распакетирование)')
{
b:=1;message('1 '+b);
}
If (fullname='Акты на комплектование (пакетирование)')
{
b:=0;message('0 '+b);
}
if (inherited :: handleEvent(cmMAKEORDER)=heOk)
{
If (Modifier Getfirst sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/)) =tsok)
{
do
{
If ( Modifier Getfirst soprorda where (( spsopr.nrec == soprorda.cspsopr))=Tsok )
{
do
{
If (Modifier Getfirst sporder where ((sklorder.nrec == sporder.csklorder))=tsok)
{
do
{
//'L_SKLAD::ACTCOMPL.EDITSOPR.SCRHEADERFROM.b_SCRHEADERFROM_Формирование_ордеров'
if (b=1 and 0=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('РО1 '+sporder.rsrprice);
}
if (b=1 and 1=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('РО2 '+sporder.rsrprice);
}
if (b=0 and 1=sklorder.vidorder)
{
sporder.rsrprice:=soprorda.price;
update current sporder;
rescanpanel(#sporder);
message('ПО1 '+sporder.rsrprice);
}
if (b=0 and 0=sklorder.vidorder)
{
sporder.rsrprice:=spsopr.rprice;
update current sporder;
rescanpanel(#sporder);
message('ПО2 '+sporder.rsrprice);
}
//'L_SKLAD::ACTCOMPL.EDITSOPR.SCRHEADERTO.b_SCRHEADERTO_Формирование_ордеров'
}
while (Modifier Getnext sporder where ((sklorder.nrec == sporder.csklorder))=tsok);
}
}
While ( Modifier getnext soprorda where ((spsopr.nrec==soprorda.cspsopr))=Tsok );
}

}
while (Modifier Getnext sklorder where ((katsopr.nrec == sklorder.csopr /*and 1==sklorder.vidorder*/))=tsok);
}
pos_nrec:=spsopr.nrec;
If (Modifier Getfirst spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok)
{
summak:=0;
do
{
summaTemp:=spsopr.rprice*spsopr.kol;
summak := summak + summaTemp;
katsopr.summa:=summak;
update current katsopr;
rereadrecord (#katsopr) ;
rescanpanel (BRBYNAMERAZ);
}
while (Modifier getnext spsopr where ((katsopr.nrec == spsopr.csopr)) = Tsok);
}
getfirst spsopr where ((pos_nrec==spsopr.nrec))=tsok;
rescanpanel(BRBYNAMERAZ);
}
}
end
end;
end.
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

В код не всматривался (глаза разбегаются), но может завести какую-нибудь глобальную переменную? В событии cmMakeOrder в начале каждой итерации проверять ее значение, если переменная, допустим = false, цикл прерывать. Устанавливать значение переменной по нажатию кнопок Ok или Отмена. Или как-нибудь использовать стандартные возможности визуализации с флагом vfBreak.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Здесь нет многопоточности. Т.е. cmCancel не придет, пока не отработает cmMakeOrder. И Cancel в том фейсе не прерывает операцию, а просто возвращает назад как было, т.е. по сути делает откат
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

т.е. можешь просто переопределить cmValue20, это событие приходит после нажатия Отмены и там делать откат по своим действиям, не забудь только предварительно вызвать inherited::handleEvent(cmValue20)
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

Ну да, срабатывает cmMAKEORDER, в котором прописано это сообщение "Документы содержать ордера. Удалить их ?"(сообщение было раньше в интерфейсе - в том то и проблема!). При нажатии на кнопку отмена происходит откат, событие попросту не выполняется не происходит удаление ордеров. А у меня при нажатии Отмена выполняется мой код в cmMAKEORDER. То есть получается никак нельзя выловить это сообщение и оменить мой код в if (inherited :: handleEvent(cmMAKEORDER)=heOk) {...} ?
BlazeBio
Местный житель
Сообщения: 386
Зарегистрирован: 27 апр 2010, 14:31
Контактная информация:

Сообщение BlazeBio »

cmValue20 - это какое-то стандартное событие или я чего-то не знаю? Если оно нестандартное, то как оно может среагировать - через PutCommand в cmMakeOrder? (Идентификатор кнопки Отмена я не знаю.)
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

попробуй перехватить cmValue20 и там выставь свой флаг, потом уже анализируй его

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

cmValue20:
{
   inherited::handleEvent(cmValue20);
   _wasAborted := true;
}
cmMakeOrder:
{
   inherited::handleEvent(cmMakeOrder);
   if (_wasAborted)
   {
       Abort();
       exit;
   }
   else ...
}
Vik
Местный житель
Сообщения: 370
Зарегистрирован: 28 сен 2006, 15:43
Откуда: Санкт-Петербург
Контактная информация:

Сообщение Vik »

А мне кажется, что так ничего не выйдет. При отрицательном ответе на вопрос "Документу соответствуют ордера. Удалить их?", скорее всего, просто получим выход из родительского события cmMakeOrder..
Ответить