Zaxis数据编程方法
每一个数据项包括3部分
组包类、解码器类和界面
一、界面
1、在“资源解决方案管理器”中右单击SetupUI目录。菜单“添加”->“用户控件”。
出现添加新项对话框,输入名称,这里假设叫C_F13_zyd。确定。
3、出现新建用户控件的设计视图,按下F7键转换到代码视图。引用的命名空间加上
using Zaxis.ControlBase;
using PkgBuilder.Foundation;
将这个控件的父类改为SetupCommonUI:
public partial class C_F13_zyd : SetupCommonUI
这时的设计视图已变为开发所需要的形式,在上半部分的区域中拖入需要的控件。
4、修改bin\stipulation.xml文件,加入
<AFN_0xC>
<stext>F13每日0点综合数据</stext>
<FunID>13</FunID>
<fn>13</fn>
<pn>0</pn>
<UIClass>Zaxis.SetupUI.C_F13_zyd</UIClass>
</AFN_0xC>
注意类名要写全名Zaxis.SetupUI.C_F13_zyd。到这儿这个数据项的界面就新建完成了。
二、组包类
在Encode目录右键单击,选“添加”->“类”。输入类名。
先加入命名空间
using PkgBuilder;
using PkgBuilder.Foundation;
将此类继承自TerminalPackage。
A_F3_SetupPkg:TerminalPackage
在此文件中再写一个类封装此类数据所有的项目,继承自TerminalParameters。
加上对应TerminalParameters(MSA, TerminalAreaCode, TerminalID, AFN, Pn, Fn)的构造函数。
public A_F3_TerminalParameter(byte MSA, ushort TerminalAreaCode, ushort TerminalID, byte AFN, byte Pn, byte Fn,
string _mainIP, ushort _mainPort, string _bakIP, ushort _bakPort, string _netgateIP, ushort _netgatePort, string _proxyIP, ushort _proxyPort, string _APN)
: base(MSA, TerminalAreaCode, TerminalID, AFN, Pn, Fn)
{
this.mainIP = _mainIP;
this.mainPort = _mainPort;
this.bakIP = _bakIP;
this.bakPort = _bakPort;
this.netgateIP = _netgateIP;
this.netgatePort = _netgatePort;
this.proxyIP = _proxyIP;
this.proxyPort = _proxyPort;
this.APN = _APN;
AppendParas = new ArrayList();
}
**调用你写的类形成数据包
定义一个你定义的参数
A_F3_TerminalParameter tep = new A_F3_TerminalParameter(……)
A_F3_SetupPkg pkg = new A_F3_SetupPkg(tep, null, null);
byte[] byts= pkg.Buffer;
三、解码器
在Decryptor目录右键单击,选“添加”->“类”。输入类名。
加入Zaxis.Encode命名空间。
所有的解码类继承自DecryptorBase,重写DoDecrypt方法。
public override void DoDecrypt()
{
先定义一个本数据类的参数,
A_F3_TerminalParameter p = new A_F3_TerminalParameter();
将_strAry数组的内容按编码规则翻译成p的各项数据
最后一定要 _TEParameter = p;
}
写个解码器
每一个数据项包括3部分
组包类、解码器类和界面
SetupCommonUI的属性QueryEncodeBytes当被子类重写时的显示问题。
TerminalParameters类的重要性
它是终端下发包的基类,包含MSA, TerminalAreaCode, TerminalID, AFN, Pn, Fn这些信息,可以继承它添加新的成员。
*******************************************************************
1、DecryptHandler负责查找解码器,利用正则表达式匹配特征码。
找到以后用Activator.CreateInstance创建实例。
2、解码器的抽象基类DecryptorBase 中3个成员变量,供子类解析出数据保存。
//要解析出的数据结构 用类表示(数据成员)抽象
protected PackageParameters _TEParameter;
protected PackageParameters _TRParameters;
protected PackageParameters _CWParameters;
DecryptorBase类在构造函数中调用DoDecrypt方法。
DecryptorBase的子类必须实现DoDecrypt方法和ToString方法,
public override void DoDecrypt() 具体
{
//定义自己的数据类的实例,这个类必须是上面3个之一的子类。
A_F16_TerminalParameter A_F16_Parameter = new A_F16_TerminalParameter();
//进行解析,为各个数据项赋值
A_F16_Parameter.xnzwUserName = _strAry[0];
A_F16_Parameter.xnzwPasswd = _strAry[1];
//保存在_TEParameter变量中 抽象
_TEParameter = A_F16_Parameter;
}
调用事件程序
DecryptHandler.Decrypted(_decryptor, dmap.UIClassName, onepack, _decryptor.ToString());
主窗体中有Decrypted事件的代码,将解析的结果转给对应的窗体。先用UIClassName找到页签。
scui.Decrypt2UIAnsy(decryptor.TEParameter,OriginalPkgs); 抽象
实际是异步调用:
SetupCommonUI类中:
public virtual void Decrypt2UI(PackageParameters DecryptedPara, string OriginalPkgs)
{
ShowPkgInGrid((byte)1, OriginalPkgs);
//this.Invoke(new ShowPkgInGridD(ShowPkgInGrid), new object[] { (byte)1, OriginalPkgs });
}
子类中(也就是实际的界面)
public override void Decrypt2UI(PackageParameters DecryptedPara, string OriginalPkgs)
{
//先将DecryptedPara还原成特定的数据类
A_F16_TerminalParameter p = DecryptedPara as A_F16_TerminalParameter; 具体
textBox1.Text = p.xnzwUserName.ToString();
textBox2.Text = p.xnzwPasswd.ToString();
//一定要再调用父类的这个过程
base.Decrypt2UI(DecryptedPara, OriginalPkgs);
}
**************************************************************