zoukankan      html  css  js  c++  java
  • 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);
    }

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

    主体类框架

  • 相关阅读:
    EntityFramework优缺点
    领导者与管理者的区别
    七个对我最好的职业建议(精简版)
    The best career advice I’ve received
    Difference between Stored Procedure and Function in SQL Server
    2015年上半年一次通过 信息系统项目管理师
    Difference between WCF and Web API and WCF REST and Web Service
    What’s the difference between data mining and data warehousing?
    What is the difference between a Clustered and Non Clustered Index?
    用new创建函数的过程发生了什么
  • 原文地址:https://www.cnblogs.com/edong/p/1738494.html
Copyright © 2011-2022 走看看