本文对应word文档地址http://download.csdn.net/source/645651
系统的dimension display功能很强大,如果在做维度显示时直接使用系统的函数是最好不过了。本文只演示如何使用继承自系统函数的dimension控制函数来控制新建的FORM的dimension显示,与维度想关的汇总属于更高级的内容了-_-!!!
新建FORM如图1-1,现在需要添加一个系统标准的dimension display按钮,效果如图1-2,点击按钮Dimensions display后弹出标准维度设定框如图1-3.
|
|
|
(1) 首先需要继承系统类InventDimCtrl_Frm得到我们自己的控制函数,有关InventDimCtrl_Frm的细节请自行研究吧。
我们继承的来的类命名为InventDimCtrl_Frm_CancelLog,该函数需要被继承、修改的函数列表如图1-4.
|
方法classDeclaration:
class InventDimCtrl_Frm_CancelLog extends InventDimCtrl_Frm
{
FormControl ctrlGridItemId;
}
只需要声明一个FormControl. 由于ItemId是不属于InventDimension的,而在图1-3中我们可以看到是否显示ItemId也是可选的,所以就需要声明一个FormControl 的变量,后面会用它来操作显示或隐藏ItemId.
方法construct:
static InventDimCtrl_Frm_CancelLog construct()
{
return new InventDimCtrl_Frm_CancelLog();
}
方法parmCtrlItemId:
void parmCtrlItemId(FormControl _ctrlGridItemId)
{
ctrlGridItemId = _ctrlGridItemId;
}
方法initFromCaller(该方法通过Caller来初始inventDimParm,并使用该inventDimparm来定制维度的显示,下边的代码中,Caller是一个含有SalesTable为数据源的FORM,表CancelLog和SalesTable的关系为cancelLog.SalesId == salesTable.SalesId,也可以参考InventDimCtrl_Frm_OnHand类):
void initFromCaller()
{
ItemId itemId = "";
Common common;
InventDimCombination inventDimCombination;
InventDimParm _dimParmVisibleGrid_tmp;
InventDimParm _dimParmVisibleGrid;
boolean overrideSetup = false;
CancelLog _CancelLog;//表变量
;
_dimParmVisibleGrid.ItemIdFlag = true;
if (this.mustInventDimParmVisibleBeInit())
{
//要想switch,必须将Dimensions Display按钮的DataSource进行设置
//这里设为salesTable
switch(callingElement.args().dataset())
{
case tablenum(SalesTable):
while select _CancelLog
orderby _CancelLog.salesId
{
if(itemId != _CancelLog.ItemId)
{
itemId = _CancelLog.ItemId;
_dimParmVisibleGrid_tmp.initPrimaryDim(InventTable::find(ItemId).DimGroupId);
_dimParmVisibleGrid = InventDimParm::orParms(_dimParmVisibleGrid,_dimParmVisibleGrid_tmp);
_dimParmVisibleGrid.ItemIdFlag = _dimParmVisibleGrid_tmp.ItemIdFlag == NoYes::Yes ? NoYes::Yes : _dimParmVisibleGrid.ItemIdFlag;
}
}
break;
default:
break;
}
}
this.parmDimParmVisibleGrid(_dimParmVisibleGrid, overrideSetup);/*最重要的就是这句了,使用我们前边得到的inventDimParm来定制界面*/
}
这个方法主要是通过获取ITEMID从而的的INVENTDIM来设置INVENTDIMPARM,至于里边怎么实现那就看具体了
方法mustInventDimParmVisibleBeInit(Determines if the dimension visible grid should be controlled depend on the form caller.):
boolean mustInventDimParmVisibleBeInit()
{
boolean ret;
;
if (!callingElement)
{
throw Error::wrongUseOfFunction(funcname());
}
ret = !(callingElement.args().record() == null && callingElement.args().lookupRecord());
return ret;
}
方法updateControls:
void updateControls()
{
super();
if (ctrlGridItemId)
ctrlGridItemId.visible(dimParmVisibleGrid.ItemIdFlag);
}
Override该方法主要是为了控制itemId的显示,Super方法之后的代码就是修改是否显示ItemId.
方法newFromForm:
public static InventDimCtrl_Frm_CancelLog newFromForm(FormRun _formRun)
{
InventDimCtrl_Frm_CancelLog inventDimCtrl = InventDimCtrl_Frm_CancelLog::construct();
InventDimAxFormAdapter adapter = InventDimAxFormAdapter::newFromForm(_formRun);
;
inventDimCtrl.parmCallingElement(adapter);
inventDimCtrl.init();
return inventDimCtrl;
}
(2) 我们的类到这里就OK了,接下来需要给form上增加几个方法,如图1-5,使我们的类能够用于控制form的显示。
|
Form的classDeclaration:
public class FormRun extends ObjectRun
{
InventDimCtrl_Frm_CancelLog inventDimFormSetup;
}
声明一个类变量。
方法updateDesign:
void updateDesign(InventDimFormDesignUpdate mode)
{
switch (mode)
{
case InventDimFormDesignUpdate::Init :
case InventDimFormDesignUpdate::LinkActive :
element.inventDimSetupObject().initFromCaller();
element.inventDimSetupObject().parmCtrlItemId(CancelLog_ItemId);/*CancelLog_ItemId是用于显示ItemId的控件的名称,该控件的自动声明属性需要设为YES)*/
if (mode == InventDimFormDesignUpdate::Init)
{
if (element.inventDimSetupObject().parmDimParmVisibleGrid().ItemIdFlag == NoYes::No)
CancelLog_ItemId.visible(false);
}
case InventDimFormDesignUpdate::Active :
element.inventDimSetupObject().formActiveSetup();
element.inventDimSetupObject().formSetControls(true,true);
break;
default : throw error(strfmt("@SYS54195",funcname()));
}
}
方法init:
void init()
{
;
super();
element.updateDesign(InventDimFormDesignUpdate::Init);
}
方法inventDimSetupObject:
InventDimCtrl_Frm_CancelLog inventDimSetupObject()
{
if (!inventDimFormSetup)
{
inventDimFormSetup = InventDimCtrl_Frm_CancelLog::newFromForm(element);
inventDimFormSetup.parmLargeRightClickForm(NoYes::Yes);
}
return inventDimFormSetup;
}
这个方法会被Form: InventDimParmFixed使用,用于获得控制form显示的类InventDimCtrl_Frm_CancelLog的变量
(3) 最后将MenuItem: InventDimParmFixed拖到FORM里作为按钮就可以实现功能了。