Здравствуйте.
Решила написать в эту тему. Вообще о работе с ВА типа переключатель удалось мало чего найти на форуме. А надо работать именно с ВА этого типа.
Очень надеюсь на Вашу помощь.
Пишу Alter интерфейса M_UP:: NAKL502 (накладные на приход ГП).
В частности надо добавить в список НПГ новый столбец с ВА к табл.Katsopr типа переключатель. И этот же ВА добавить в режиме редактирования НПГ в верхнюю панель. Сделала это.
Все работает, если после закрытия интерфейса редактирования НПГ переходим в список НПГ, переходим к нужной НПГ, открываем ее на редактирование и меняем или нет переключатель.
Но есть проблема, когда в режиме редактирования НПГ перехожу к другой НПГ по PgUp / PgDn. В этом случае переключатель не показывает корректное состояние: состояние должно измениться, т. к. изменилась позиция НПГ и значение переключателя должно соответствовать значению ВА для измененной позиции НПГ.
Ниже исходник.
Код: Выделить всё
#Component "M_UP"
//Список НПГ:
//-Browser SELECTNAKL. В список НПГ добавление новой колонки 'Проба'
//с ВА 'Наличие пробы' типа переключатель к табл.KatSopr.
//-Интерфейс EDITSOPR - редактирование НПГ. Screen SCRHEADER.
//В верхней панели НПГ добавление PanelRadioButton с ВА 'Наличие пробы'
//к KatSopr с 2 кластерами и меткой.
Alter interface NAKL502;
Var cAttrNalPr : Comp;
var1 : iExtAttr;
aself : Longint;
cur_o, cont_i, aObjType : String;
st : Integer;
aSelf1_Pr, aSelf2_Pr : Longint;
flagCh, flagE : Boolean;
cRB : Comp;
//Получение значения ВА типа переключатель
Function GetAttrValueS( wTabl_: Word; cRec_: Comp; cAttrnam_: Comp ): Word;
Var res_ : Word;
{
res_:= 0;
If Getfirst AttrVal Where (( wTabl_ == AttrVal.Wtable and cRec_ == AttrVal.Crec and cAttrnam_ == AttrVal.cAttrNam )) = tsOk
res_:= Word( AttrVal.Vcomp );
GetAttrValueS:= res_;
} //GetAttrValueS
Create view
as select
If(( var1.ValueExistsID( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ) = False ), 'Нет'
, If( GetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr )= 1, 'Да', 'Нет' ))
( Fieldname=CheckNalPr ) // для Browse списка НПГ
, If(( var1.ValueExistsID( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ) = False ), 0
, GetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr ))
( Fieldname=CheckNalPr1 ) // для редактирования НПГ
;
//Установка значения ВА типа переключатель
Function SetAttrValueS( wTabl_: Word; cRec_: Comp; cAttrnam_: Comp; cRB_: Comp ): Boolean;
Var res_ : Boolean;
{
res_:= False;
If Getfirst AttrVal Where (( wTabl_ == AttrVal.Wtable and cRec_ == AttrVal.Crec and cAttrnam_ == AttrVal.cAttrNam )) = tsOk
{
AttrVal.Vcomp:= cRB_;
If Update Current AttrVal = tsOk
res_:= True;
}
else // нет записи в AttrVal
{
ClearBuffer( #AttrVal );
AttrVal.Atl_LastDate:= Cur_Date;
AttrVal.wTable:= wTabl_;
AttrVal.cRec:= cRec_;
AttrVal.cAttrnam:=cAttrnam_;
AttrVal.vComp:= cRB_;
If Insert current AttrVal = tsOk
res_:= True;
}
SetAttrValueS:= res_;
} // func SetAttrValueS
// Изменение последовательности столбцов в списке НПГ.
Procedure ChangeObjIndex;
{
cfsSetProp( 'c_SELECTNAKL_KATPODR_SF.NAME_Из_подразделения', 'Index', Integer(6) );
cfsSetProp( 'c_SELECTNAKL_KATPODR_SI.NAME_Куда', 'Index', Integer(7) );
cfsSetProp( 'c_SELECTNAKL_KATNAZNASELECT.NAME_Назначение', 'Index', Integer(8) );
cfsSetProp( 'c_SELECTNAKL_SUM_S_Сумма', 'Index', Integer(9) );
cfsSetProp( 'c_SELECTNAKL_VALUT_S_Валюта', 'Index', Integer(10) );
cfsSetProp( 'c_SELECTNAKL_NAM_ZAKAZ_Заказ', 'Index', Integer(11) );
cfsSetProp( 'c_SELECTNAKL_SBDNOM_ДО', 'Index', Integer(12) );
cfsSetProp( 'c_SELECTNAKL_KATSOPRSELECT.NAME_Наименование', 'Index', Integer(13) );
cfsSetProp( 'c_SELECTNAKL_KATSOPRSELECT.DOPR_Дата_оприходования', 'Index', Integer(14) );
cfsSetProp( 'c_SELECTNAKL_NALPOS_Сырьё', 'Index', Integer(15) );
cfsSetProp( 'c_SELECTNAKL_П', 'Index', Integer(16) );
cfsSetProp( 'c_SELECTNAKL_IMAGEONARCHIVE_А', 'Index', Integer(17) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'Index', Integer(5) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'DefaultWidth', Integer(8) );
cfsSetProp( 'c_SELECTNAKL_CHECKNALPR_Проба', 'NoAutoSize', True );
} // proc ChangeObjIndex
// Работа с ВА в окне редактирования НПГ
Procedure CreateObjInNPG;
{
// Получить параметры объекта. 1-ый параметр - входящий, остальные - возвращаемые. Рез-т - код ошибки выполнения
st:= cfsGetObjInfo(
'SCRHEADER' , // Имя объекта, инфо о котором надо получить
cur_o , // строка с именем объекта
aself , // указатель объекта
cont_i , // имя группы, в которую вставлен объект
aObjType // имя типа объекта
);
If st = 0 // cfOk
{
// Создание и регистрация объекта.
// Пар-ры: 1 - имя типа создаваемого объекта, 2 - указатель объекта (контейнер), куда вставляется объект,
// 3 - Уникальное имя объекта, 4 - создание и регистрация объекта и вставка его в контейнер, 5 - указатель на созданный объект.
//------ Объект ВА "Наличие пробы" типа переключатель
st:= cfsCreateObject( 'PanelRadioButton', aself, 'CheckNalPr1', False, aself2_Pr );
If st = 0
{
cfsSetProp( aself2_Pr, 'Visible', True );
cfsSetProp( aself2_Pr, 'Protect', False );
cfsSetProp( aself2_Pr, 'Skip', False );
cfsSetProp( aself2_Pr, 'HelpLine', 'Наличие пробы' );
cfsSetProp( aself2_Pr, 'Left', 14 );
cfsSetProp( aself2_Pr, 'Top', 11.5 );
cfsSetProp( aself2_Pr, 'Width', 7.8 );
cfsSetProp( aself2_Pr, 'Height', 1 );
flagCh:= If( CheckNalPr1=0, False, True );
st:= cfsCreateObject( 'ClusterItem', aself2_Pr, 'ci_'
+ 'CheckNalPr1' + '_New_Cluster_Item_1', False, aself1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Нет' );
cfsSetProp( aself1_Pr, 'Visible', True );
cfsSetProp( aself1_Pr, 'Skip', False );
cfsSetProp( aself1_Pr, 'Index', 0 );
cfsSetProp( aself1_Pr, 'DataIndex', 0 );
cfsSetProp( aself1_Pr, 'Checked', flagCh );
cfsSetProp( aself1_Pr, 'ModifiedState', False );
}
st:= cfsCreateObject( 'ClusterItem', aself2_Pr, 'ci_'
+ 'CheckNalPr1' + '_New_Cluster_Item_2', False, aself1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Да' );
cfsSetProp( aself1_Pr, 'Visible', True );
cfsSetProp( aself1_Pr, 'Skip', False );
cfsSetProp( aself1_Pr, 'Index', 1 );
cfsSetProp( aself1_Pr, 'DataIndex', 1 );
cfsSetProp( aself1_Pr, 'Checked', not flagCh );
cfsSetProp( aself1_Pr, 'ModifiedState', False );
}
}
// метка и ее св-ва
st:= cfsCreateObject ( 'label', aself, 'lbCheckNalPr1', False, aSelf1_Pr );
If st = 0
{
cfsSetProp( aself1_Pr, 'Title', 'Наличие пробы' );
cfsSetProp( aself1_Pr, 'Left', 1 );
cfsSetProp( aself1_Pr, 'Top', 12 );
cfsSetProp( aself1_Pr, 'Width', 13 );
cfsSetProp( aself1_Pr, 'Height', 1 );
}
} // cfOk
} // proc CreateObjInNPG
ExtendFormats SELECTNAKL;
Browse SELECTNAKL;
Table KATSOPRSELECT;
Fields
CheckNalPr 'Проба' :[ 8 ], Protect, Skip;
end;
TableEvent
Table KATSOPRSELECT;
cmPositionChanged:
{
// Message( 'cmPositionChanged' ); //попадаю сюда
Inherited::HandleEvent( cmPositionChanged );
RescanPanel( #KATSOPRSELECT );
} // cmPositionChanged
end; // TableEvent
Window EDITSOPR EscClose;
HandleEvent // window
cmInit:
{
Case Inherited::HandleEvent( cmInit ) of
heAbort : Abort;
heStop : Exit;
end;
} // cmInit
end; // HandleEvent
end; // window
HandleEvent // for interface
cmInit :
{
// Message('cmInit'); //не попадаю сюда
Case Inherited::HandleEvent( cmInit ) of
heAbort : Abort;
heStop : Exit;
end;
} // cmInit
cmOnVipLoad:
{
flagE:= False;
cAttrNalPr:= var1.AttrID( coKatSopr, 'Наличие пробы' ); // Nrec ВА к KatSopr
//Message( 'cmOnVipLoad' ); // попадаю сюда
If Inherited:: HandleEvent( cmOnVipLoad ) != heOk then
{
Abort;
Exit;
}
ChangeObjIndex;
CreateObjInNPG;
} // cmOnVipLoad
cmCheckField:
{
//Message( 'cmCheckField' ); // попадаю сюда
Case CurField of
#CheckNalPr1:
{
//нужна эта проверка, иначе при 1-ом открытии списка НПГ у текущей
//записи меняется значение ВА
If flagE = False
flagE:= True
else
{
cRB:= If( CheckNalPr1 = 0, Comp( 1 ), Comp( 0 ) );
If SetAttrValueS( coKatSopr, KatSoprSelect.Nrec, cAttrNalPr, cRB ) {}
Set CheckNalPr1;
RescanPanel( #KatSoprSelect );
}
}
end; // case
} // cmCheckField
end; // HandleEvent for interface
end. // interface