AX2009中有关 splitter 控件的示例应用在 AOT\form\tutorial_Form_Split中能够找到,基本思路如下:
1:首先在需要被 Split 的两个控件中的第一个控件之后加入一个 Group;
2:在该 form 中申明一个变量(如 SysFormSplitter_Y _formSplitter),然后在 Init 事件中进行初始化( _formSplitter = new SysFormSplitter_Y(groupSplitter,groupTop,element) );
3:重载创建 Group控件中的方法:MouseUP、MouseDown 和 MouseMove;
偶尔使用一两个 Splitter 控件这样也可以了。如果经常使用 Splitter 控件,都要创建一个“没用的” Group 控件,并且都要重载并重复 copy 、plaste 相同的 MouseUP、MouseDown 和 MouseMove 代码,实在是太麻烦。
其实完全可以改造,基本思想如下:
1:创建一个 Class,重写 new 方法,并传入一个控件,该控件为需要被 Split 的两个控件中的第一个控件;
2:在 new 方法中,用代码创建一个 Group 控件,该 Group 控件当然要放在参数控件之后, 并设置好相应的属性;
3:在 new 方法中,用代码为 Group 控件增加事件处理接口;
4:加入Group控件的 MouseUP、MouseDown 和 MouseMove 处理代码;
5: 在需要 split 的 form 的 init 事件中调用该 Class 的 new 方法。
class PushCsSplitterY
{
SysFormSplitter_Y splitterY;
FormRun formRun;
}
void new(FormControl _control)
{
// Add splitter Y between _control and its next control
FormGroupControl groupControl;
;
formRun = _control.owner(); //根据传入的控件,得到相应的 formRun
groupControl = formRun.design().control(_control.containerId()); // 根据传入的控件,得到它的父控件
if (!groupControl)
return; // 如果没有父控件直接返回,否则下面的代码要出错
groupControl = groupControl.addControl(formControltype::Group,'SplitterGroup',_control); // 在传入控件后面的位置新创建一个 Group 控件
groupControl.autoDeclaration(true); // 设置新创建的 Group 控件的相应属性
groupControl.widthMode(FormWidth::ColumnWidth);
groupControl.height(5);
groupControl.alignControl(true);
groupControl.frameType(formFrameType::Raised3D);
groupControl.backgroundColor(windowspalette::WindowBackground);
groupControl.hideIfEmpty(false);
groupControl.alignChild(false);
formRun.controlMethodOverload(true); // 表示该窗口中的事件要进行重载
if (!formRun.controlMethodOverloadObject())
formRun.controlMethodOverloadObject(this); /* 指明窗口中事件的响应代码在什么地方寻找,这里就是这个 Class。注意,寻找具体的响应代码方法名称规则: 控件名称+下划线+事件名称。该 Class 中,自动增加的控件名称为 SplitterGroup,事件 MouseUp 的响应代码的方法名称为:SplitterGroup_mouseUp ,也即需要增加一个名为 SplitterGroup_mouseUp 的方法,否则相应的事件不能响应了。*/
splitterY = new SysFormSplitter_Y(groupControl,_control,formRun);
}
int SplitterGroup_mouseUp(int x, int y, int button, boolean ctrl, boolean shift)
{
;
formRun.controlCallingMethod().mouseUp(x, y, button, ctrl, shift); // 先响应调用者本来的方法,这里就是调用用代码创建的 Group 控件的MuseUp方法
Return splitterY.mouseUp(x, y, button, ctrl, shift); // 然后才调用 Splitter 本身的方法
}
int SplitterGroup_mouseDown(int x, int y, int button, boolean ctrl, boolean shift)
{
;
formRun.controlCallingMethod().mouseDown(x, y, button, ctrl, shift);
Return splitterY.mouseDown(x, y, button, ctrl, shift);
}
int SplitterGroup_mouseMove(int _x, int _y, int _button, boolean _Ctrl, boolean _Shift)
{
;
formRun.controlCallingMethod().mouseMove(_x,_y,_button,_Ctrl,_Shift);
return splitterY.mouseMove(_x,_y,_button,_Ctrl,_Shift);
}
只需在每一个需要使用 splitter 的 form 的 init 事件中用一句代码调用即可, 一劳永逸,Enjoying ~~~~~~~~ !
public void init()
{
super();
new PushCsSplitterY(BOMConfiguration); // BOMConfiguration 为一 grid 控件,其后面还有一个 grid 控件
}
没有评论:
发表评论