我们到底需要什么样的控件?
我想无非是创建、显示和修改数据内容。
总体设计:
如上图所示,整个流程由Initialize(初始化)开始,可以通过Uninitialize来重新设定;初始化之后,提供三个功能,Validate Inputs(输入校验),Set Current Content(设置值)和Save Changes(保存修改)。
0. Mode支持的模式
预定义了以下模式:
Creating 创建模式
ReadOnlyDisplay 只读模式
ChangableDisplay 修改模式
Customizing 自定义模式
Customizing2 自定义模式2
Customizing3 自定义模式3
1. Initialize(初始化)。
初始化流程会调用如图所示的virtual methods。对于无法支持的Mode,派生类中只需要返回false就会迫使初始化失败。
最后的ClearModifyFlags用来清除所有的内部标志。ACUIBaseControl已经定义了一个flagMajorMod,通过public的Property——MajorModifyFlag可以查看该标志值。
2. Save Changes保存修改
流程图:
如图所示,虚拟函数IsNeedSave决定了是否需要保存。对于Creating模式,该函数默认返回true.
ValidateInputs见下节。
GetCurrentObjectDataImpl方法负责把UI上的控件数值导入内存。
Save开头的一系列方法用于在各个模式保持。
最后同样会清除修改标志:ClearModifyFlag. ACUIBaseControl还提供Event来执行成功保存后的操作。
3. Validate Inputs 输入校验
4. Set Current Content 设置当前值
流程图:
在Creating模式下无法设置,因为创建模式应该只允许从空白开始。
这里还会首先判断一把IsNeedSave,如果是,会首先进行保存。
成功设置之后,还会清除修改标志位。
5. Uninitialize 反初始化。
反初始化会扔掉当前所有的修改标志位信息,而直接调用Cleanup系列的Virtual Methods。
成功操作后,会清除所有的标志位。
代码就不贴了,有了这些流程图,无论是C++, C#应该都分容易写出代码了。