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);
}

**************************************************************

主体类框架

原文地址:https://www.cnblogs.com/edong/p/1738494.html