2013年2月10日星期日

How to using class remake splitter control on Form

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 控件
}

没有评论:

发表评论