zoukankan      html  css  js  c++  java
  • ext+dwr DynamicGridPanel 封装 态创建ext grid

    封装一个动态grid 继承Ext.grid.GridPanel
    1.一般只需定义gridcolumns属性即可动态生成grid ,支持各列renderer自定义,
    支持store自定义. 其中默认的store,用的是dwrproxy,dwr函数前三个默认参数为(qname,start,pagesize)其他参数在这三个参数之后,
    通过DWRfuncParams属性传入。
    2.需dwr。
    约定:root为data, totalProperty为totalSize

    Js代码

    1. Ext.namespace("Ext.ux.grid");   
    2. /**  
    3.  * @class Ext.ux.grid.DynamicGridPanel  
    4.  * @extends Ext.grid.GridPanel  
    5.  * @author  wujuncheng  
    6.  * @constructor  
    7.  * @param {Object} config A configuration object.  
    8.  */  
    9.     
    10.  /**  
    11.   * demo:  
    12.   * var demoManage = {  
    13.       
    14.    return {  
    15.     init1:function(){  
    16.         //grid 列表头及列表头属性,用于数据映射和表头相关属性定义  
    17.         var gridcolumns =[  
    18.           {dataIndex: 'arArticleId', header:'arArticleId1',200,hidden:false,renderer:demoManage.toArticleRenderer},  
    19.           {dataIndex: 'arShort',header:'arShort2',200,hidden:false},  
    20.           {dataIndex: 'arIscommend', header:'arIscommend3',200,hidden:false},       
    21.           {dataIndex: 'arIshot',header:'arIshot4',200,hidden:false},    
    22.           {dataIndex: 'arIstop',header:'arIstop5',200,hidden:false},  
    23.           {dataIndex: 'arHits',header:'arHits6',200,hidden:false},  
    24.           {dataIndex: 'arStatus',header:'arStatus7',200,hidden:false},  
    25.           {dataIndex: 'arCreatetime',header:'arCreatetime8',200,hidden:false}  
    26.        ]  
    27.        //grid 的配置属性 大部分属性按默认即可,一般只需定义gridcolumns属性  
    28.        this.datagrid = new Ext.ux.grid.DynamicGridPanel({  
    29. //          store:this.store(), //自定store 用法  
    30.           gridcolumns:gridcolumns,  
    31.           DWRfuncParams:[],  
    32.           DWRfunc:demoManageAction.getArticles  
    33.        });  
    34.        this.datagrid.loadData();  
    35.       },  
    36.   toArticle:function (articleId){  
    37.       var url = "articleUpdate.jsp?arArticleId="+articleId;  
    38.       window.location.href=url;  
    39.   },  
    40.   toArticleRenderer:function (articleId){  
    41.         return "<a href='#' class='' onclick='demoManage.toArticle(\""+articleId+"\")'>修改</a>"  
    42.         
    43.   },  
    44.   store:function(){  
    45.       storepage = this;  
    46.       return new Ext.data.GroupingStore({         
    47.            proxy:new Ext.cheping.data.DWRProxy({  
    48.                         dwrFunction: this.Action.getArticles,  
    49.                         listeners: {  
    50.                             'beforeload': function(dataProxy, params){  
    51. //                          storepage.storeParams = storepage.setStoreParams(params.start);  
    52.                             var loadArgs = [  
    53.                                 params.query,  
    54.                                 params.start,  
    55.                                 storepage.defaultPageSize,  
    56.                            ];  
    57.                            params[dataProxy.loadArgsKey] = loadArgs;      
    58.                            }  
    59.                     }  
    60.         })  
    61.        sortInfo:{field: 'fielname', direction: "ASC"}, //使用GroupingStore时必须指定sortInfo信息  
    62.       });  
    63.     },  
    64.   };  
    65.   }  
    66.   */  
    67.   
    68.  Ext.ux.grid.DynamicGridPanel=Ext.extend(Ext.grid.GridPanel, {   
    69.     enableChecked:true, //是否有CheckBox。   
    70.     singleSelect: true,   
    71.     'auto',   
    72.     height:document.body.clientHeight, //高度   
    73.     iconCls :'icon-grid',   
    74.     stripeRows: true,   
    75.     collapsible: true,   
    76.     loadMask: true,   
    77.     animCollapse: false,   
    78.     DWRfuncParams:[],   
    79.     DynamicGridPanel_fields:[],   
    80.     DynamicGridPanel_columns:[],   
    81.     hiddenDefaultTbar:true,   
    82.     GroupingViewConfig:{   
    83.       markDirty: false,    
    84.       forceFit:false,   
    85.       sortAscText :'正序',   
    86.       sortDescText :'倒序',   
    87.       columnsText:'列显示/隐藏',   
    88.       groupByText:'依本列分组',   
    89.       showGroupsText:'分组显示',   
    90.       groupTextTpl: '{text} ({[values.rs.length]} 条记录)'  
    91.       },   
    92.            
    93.     //private      
    94.     initComponent: function(){   
    95.         this.initDynamicGridPanelFields();   
    96.         this.initDynamicGridPanelStore();   
    97.         this.DynamicGridPanel_bbar();   
    98.         Ext.ux.grid.DynamicGridPanel.superclass.initComponent.call(this);   
    99.         this.iniDynamicGridPanelGrid();   
    100.         this.initDynamicGridPanel_cm_tbr();   
    101.         this.view= new Ext.grid.GroupingView(this.GroupingViewConfig)   
    102.     },   
    103.     pagingConfig:{       
    104.         pageSize:20,                       
    105.         store: this.store,              
    106.         displayInfo:true,   
    107.         plugins: [new Ext.ux.PageSizePlugin()],   
    108.         displayMsg: "当前记录:{0} - {1} 条  总共{2} 条",   
    109.         emptyMsg: "<b>0</b> 条记录"  
    110.     },   
    111.     //private   
    112.     iniDynamicGridPanelGrid:function(){   
    113.         this.DynamicGridPanelstoreParams = this.setDynamicGridPanelStoreParams(0);   
    114.         if(this.container){   
    115.             this.width = Ext.get(this.container).getComputedWidth(); //宽度   
    116.             this.renderTo=Ext.get(this.container);   
    117.         }   
    118.     },   
    119.     //private   
    120.     initDynamicGridPanelStore:function(){   
    121.         if(this.store){   
    122.             this.store.reader=this.DynamicGridPanel_reader();   
    123.         }else{   
    124.             this.store= this.DynamicGridPanel_store();   
    125.         }   
    126.         this.pagingConfig.store = this.store;    
    127.         this.store.load({params:{start:0,limit:this.pagingConfig.pageSize}});      
    128.     },   
    129.     //private   
    130.     initDynamicGridPanel_cm_tbr:function(){   
    131.         if(!this.cm)   
    132.             if(!this.colModel)    
    133.                 this.colModel=this.DynamicGridPanel_cm();   
    134.           
    135.         if(!this.hiddenDefaultTbar)   
    136.           this.tbar=this.DynamicGridPanel_ToolBar();   
    137.     },   
    138.        
    139.     setDynamicGridPanelStoreParams:function(start){   
    140.             var Params = { params: { start:start} };   
    141.             return Params;   
    142.     },   
    143.     //private   
    144.     initDynamicGridPanelFields:function(){   
    145.         for (var i = 0; i < this.gridcolumns.length; i++) {   
    146.                  this.DynamicGridPanel_fields.push({name:this.gridcolumns[i].dataIndex});   
    147.                  this.DynamicGridPanel_columns.push(this.gridcolumns[i]);   
    148.          }   
    149.     },                
    150.     //private   
    151.     DynamicGridPanel_cm:function(){   
    152.          if (this.enableChecked) {   
    153.                      this.DynamicGridPanel_sm = new Ext.grid.CheckboxSelectionModel({ singleSelect: this.singleSelect, moveEditorOnEnter: true, sortable: false });   
    154.                      var arr = [this.DynamicGridPanel_sm];   
    155.                      arr.push(new Ext.grid.RowNumberer({header:'序号',40}))   
    156.                      var sunfish = this.DynamicGridPanel_columns;   
    157.                      for (var i = 0; i < sunfish.length; i++) {   
    158.                          arr.push(sunfish[i]);   
    159.                      }   
    160.                  }   
    161.                  else {   
    162.     //                 arr = eval('([' + this.columns + '])');   
    163.                      arr = this.DynamicGridPanel_columns;   
    164.                  }   
    165.                  var col = new Ext.grid.ColumnModel(arr);   
    166.                  col.defaultSortable = true;   
    167.            return col;         
    168.     },   
    169.     //private       
    170.     DynamicGridPanel_store:function(){   
    171.          var DynamicGridPanelStoreParams = this;   
    172.            return  new Ext.data.GroupingStore({       
    173.                proxy:new Ext.cheping.data.DWRProxy({   
    174.                             dwrFunction: DynamicGridPanelStoreParams.DWRfunc,   
    175.                             listeners: {   
    176.                                 'beforeload': function(dataProxy, params){   
    177.                                 DynamicGridPanelStoreParams.DynamicGridPanelstoreParams = DynamicGridPanelStoreParams.setDynamicGridPanelStoreParams(params.start);   
    178.                                 var loadArgs = [   
    179.                                     params.qname,   
    180.                                     params.start,   
    181.                                     DynamicGridPanelStoreParams.pagingConfig.pageSize      
    182.                                ];   
    183.                                if(DynamicGridPanelStoreParams.DWRfuncParams.length>0){   
    184.                                   for(var i=0;i<DynamicGridPanelStoreParams.DWRfuncParams.length;i++){   
    185.                                     loadArgs[loadArgs.length]=DynamicGridPanelStoreParams.DWRfuncParams[i];   
    186.                                   }   
    187.                                }   
    188.                                   
    189.                                params[dataProxy.loadArgsKey] = loadArgs;      
    190.                 
    191.                                }   
    192.                         }   
    193.             }),   
    194. //------------------------------------------------------------------------------------------------ //分组表所需       
    195. //     groupField:this.DynamicGridPanel_fields[0],   
    196. //     groupOnSort:true,   
    197.        
    198.      sortInfo:{field: this.gridcolumns[0].dataIndex, direction: "ASC"}, //使用GroupingStore时必须指定sortInfo信息   
    199. //------------------------------------------------------------------------------------------------    
    200.          reader:  this.DynamicGridPanel_reader()   
    201.           });   
    202.     },   
    203.     //private   
    204.     DynamicGridPanel_reader:function(){   
    205.          return new Ext.data.JsonReader({   
    206.                 totalProperty: "totalSize",   
    207.                 root: "data",   
    208.                 fields:this.DynamicGridPanel_fields   
    209.                 });   
    210.     },   
    211.     //private       
    212.     DynamicGridPanel_bbar:function(){   
    213.         this.bbar = new Ext.PagingToolbar(this.pagingConfig);    
    214.     },   
    215.        
    216.     DynamicGridPanel_ToolBar:function(){   
    217.             
    218.      return new Ext.Toolbar(   
    219.          {     
    220.             hidden:this.hiddenDefaultTbar,    
    221.             items:[    
    222.              '->','关键字: ',    
    223.             this.DynamicGridPanel_Search()   
    224.                 ]    
    225.           }   
    226.         );    
    227.     },   
    228.        
    229.     DynamicGridPanel_Search:function(){   
    230.            return srch = new Ext.app.SearchField({   
    231.                     store: this.store,   
    232.                     220,   
    233.                     paramName : 'qname',   
    234.                     Align:'right'  
    235.                 });   
    236.     },   
    237.     loadData:function() {   
    238.         this.getStore().load(this.DynamicGridPanelstoreParams);   
    239.     },   
    240.     getInsertRecord:function(){   
    241.         var obj={};   
    242.         for(var i=0;i<this.DynamicGridPanel_fields.length;i++){   
    243.             obj[this.DynamicGridPanel_fields[i].name]=null;   
    244.         }   
    245.         var record = Ext.data.Record.create(this.DynamicGridPanel_fields);   
    246.         var InsertRecord = new record(obj);   
    247.         return InsertRecord;   
    248.     },   
    249.     getSelectionObjsByName:function(dataName) {   
    250.         if(this.getSelectionModel().getCount()<1){   
    251.             Ext.MessageBox.alert('提示', '请选择数据,可以是多选!');   
    252.             return;                        
    253.         }else{    
    254.                
    255.             var getSelectionRecordsrList=[];   
    256.             for(var i=0; i<this.getSelectionModel().getSelections().length;i++){    
    257.                 if(null!=this.getSelectionModel().getSelections()[i].data[dataName]    
    258.                     && ""!=this.getSelectionModel().getSelections()[i].data[dataName].trim())   
    259.                 getSelectionRecordsrList.push(this.getSelectionModel().getSelections()[i].data[dataName]);   
    260.             }   
    261.             return  getSelectionRecordsrList;   
    262.         }   
    263.     },   
    264.        
    265.     getSelectionObjByName:function(dataName) {   
    266.         if(this.getSelectionModel().getCount()==1){                        
    267.             return  this.getSelectionModel().getSelections()[0].data[dataName];   
    268.         }else{    
    269.             Ext.MessageBox.alert('提示', '请选择数据,并且只能选一条!');   
    270.             return;   
    271.         }   
    272.     },   
    273.     getSelectedObj:function() {   
    274.         if(this.getSelectionModel().getCount()==1){    
    275.             return  this.getSelectionModel().getSelections()[0].data;   
    276.         }else{    
    277.             Ext.MessageBox.alert('提示', '请选择数据,并且只能选一条!');   
    278.             return;   
    279.         }   
    280.     },   
    281.      getFormRecord:function() {   
    282.         if(this.getSelectionModel().getCount()==1){    
    283.             return  this.getSelectionModel().getSelections()[0];   
    284.         }else{    
    285.             Ext.MessageBox.alert('提示', '请选择数据,并且只能选一条!');   
    286.             return;   
    287.         }   
    288.     }   
    289.   
    290. });  

    * @class Ext.ux.grid.DynamicGridPanel

    * @extends Ext.grid.GridPanel

    * @author wujuncheng

    * @constructor

    * @param {Object} config A configuration object.

    */

    /**

    * demo:

    * var demoManage = {

    return {

     init1:function(){

         //grid

        var gridcolumns =[

    {dataIndex: 'arArticleId', header:'arArticleId1',200,hidden:false,renderer:demoManage.toArticleRenderer},

    {dataIndex: 'arShort',header:'arShort2',200,hidden:false},

    {dataIndex: 'arIscommend', header:'arIscommend3',200,hidden:false},    

    {dataIndex: 'arIshot',header:'arIshot4',200,hidden:false}, 

    {dataIndex: 'arIstop',header:'arIstop5',200,hidden:false},

    {dataIndex: 'arHits',header:'arHits6',200,hidden:false},

    {dataIndex: 'arStatus',header:'arStatus7',200,hidden:false},

    {dataIndex: 'arCreatetime',header:'arCreatetime8',200,hidden:false}

    ]

    //grid 属性

    this.datagrid = new Ext.ux.grid.DynamicGridPanel({

    store:this.store(), //用法

    gridcolumns:gridcolumns,

    DWRfuncParams:[],

    DWRfunc:demoManageAction.getArticles

    });

    this.datagrid.loadData();

       },

    toArticle:function (articleId){

    var url = "articleUpdate.jsp?arArticleId="+articleId;

    window.location.href=url;

    },

    toArticleRenderer:function (articleId){

     return "<a href='#' class='' onclick='demoManage.toArticle(\""+articleId+"\")'>

    },

    store:function(){

    storepage = this;

    return new Ext.data.GroupingStore({    

    proxy:new Ext.cheping.data.DWRProxy({

    dwrFunction: this.Action.getArticles,

    listeners: {

    'beforeload': function(dataProxy, params){

    storepage.storeParams = storepage.setStoreParams(params.start);

    var loadArgs = [

      params.query,

    params.start,

    storepage.defaultPageSize,

    ];

    params[dataProxy.loadArgsKey] = loadArgs;  

    }

                    }

    })

    sortInfo:{field: 'fielname', direction: "ASC"}, //时必须指定sortInfo信息

    });

    },

    };

    }

    */

    Ext.ux.grid.DynamicGridPanel=Ext.extend(Ext.grid.GridPanel, {

    enableChecked:true, //。

    singleSelect: true,

    'auto',

    height:document.body.clientHeight, //

    iconCls :'icon-grid',

    stripeRows: true,

    collapsible: true,

    loadMask: true,

    animCollapse: false,

    DWRfuncParams:[],

    DynamicGridPanel_fields:[],

    DynamicGridPanel_columns:[],

    hiddenDefaultTbar:true,

    GroupingViewConfig:{

     markDirty: false, 

    forceFit:false,

    sortAscText :'

    sortDescText :'

    columnsText:'隐藏',

    groupByText:'

    showGroupsText:'

         groupTextTpl: '{text} ({[values.rs.length]}

    },

    //private  

    initComponent: function(){

     this.initDynamicGridPanelFields();

     this.initDynamicGridPanelStore();

     this.DynamicGridPanel_bbar();

     Ext.ux.grid.DynamicGridPanel.superclass.initComponent.call(this);

     this.iniDynamicGridPanelGrid();

     this.initDynamicGridPanel_cm_tbr();

     this.view= new Ext.grid.GroupingView(this.GroupingViewConfig)

    },

    pagingConfig:{   

    pageSize:20,                    

    store: this.store,          

    displayInfo:true,

    plugins: [new Ext.ux.PageSizePlugin()],

    displayMsg: "条 总共{2} 条",

        emptyMsg: "<b>0</b>

    },

    //private

    iniDynamicGridPanelGrid:function(){

     this.DynamicGridPanelstoreParams = this.setDynamicGridPanelStoreParams(0);

     if(this.container){

         this.width = Ext.get(this.container).getComputedWidth(); //

            this.renderTo=Ext.get(this.container);

     }

    },

    //private

       initDynamicGridPanelStore:function(){

     if(this.store){

        this.store.reader=this.DynamicGridPanel_reader();

        }else{

         this.store= this.DynamicGridPanel_store();

        }

     this.pagingConfig.store = this.store;

     this.store.load({params:{start:0,limit:this.pagingConfig.pageSize}});  

    },

    //private

    initDynamicGridPanel_cm_tbr:function(){

     if(!this.cm)

       if(!this.colModel)

                this.colModel=this.DynamicGridPanel_cm();

      

        if(!this.hiddenDefaultTbar)

          this.tbar=this.DynamicGridPanel_ToolBar();

    },

    setDynamicGridPanelStoreParams:function(start){

            var Params = { params: { start:start} };

            return Params;

    },

    //private

    initDynamicGridPanelFields:function(){

        for (var i = 0; i < this.gridcolumns.length; i++) {

                 this.DynamicGridPanel_fields.push({name:this.gridcolumns[i].dataIndex});

    this.DynamicGridPanel_columns.push(this.gridcolumns[i]);

         }

    },            

    //private

    DynamicGridPanel_cm:function(){

         if (this.enableChecked) {

                     this.DynamicGridPanel_sm = new Ext.grid.CheckboxSelectionModel({ singleSelect: this.singleSelect, moveEditorOnEnter: true, sortable: false });

                     var arr = [this.DynamicGridPanel_sm];

                     arr.push(new Ext.grid.RowNumberer({header:'

                     var sunfish = this.DynamicGridPanel_columns;

                     for (var i = 0; i < sunfish.length; i++) {

                         arr.push(sunfish[i]);

                     }

                 }

                 else {

    //                 arr = eval('([' + this.columns + '])');

                     arr = this.DynamicGridPanel_columns;

                 }

                 var col = new Ext.grid.ColumnModel(arr);

                 col.defaultSortable = true;

           return col;     

    },

    //private   

    DynamicGridPanel_store:function(){

         var DynamicGridPanelStoreParams = this;

           return new Ext.data.GroupingStore({   

               proxy:new Ext.cheping.data.DWRProxy({

                            dwrFunction: DynamicGridPanelStoreParams.DWRfunc,

                            listeners: {

                                'beforeload': function(dataProxy, params){

                                DynamicGridPanelStoreParams.DynamicGridPanelstoreParams = DynamicGridPanelStoreParams.setDynamicGridPanelStoreParams(params.start);

                                var loadArgs = [

                                    params.qname,

                                    params.start,

                                    DynamicGridPanelStoreParams.pagingConfig.pageSize  

                               ];

                               if(DynamicGridPanelStoreParams.DWRfuncParams.length>0){

                                  for(var i=0;i<DynamicGridPanelStoreParams.DWRfuncParams.length;i++){

                                   loadArgs[loadArgs.length]=DynamicGridPanelStoreParams.DWRfuncParams[i];

                                  }

                               }

                              

                               params[dataProxy.loadArgsKey] = loadArgs;  

            

                               }

                        }

            }),

    groupField:this.DynamicGridPanel_fields[0],

    groupOnSort:true,

    sortInfo:{field: this.gridcolumns[0].dataIndex, direction: "ASC"}, //时必须指定sortInfo信息

         reader: this.DynamicGridPanel_reader()

          });

    },

    //private

    DynamicGridPanel_reader:function(){

         return new Ext.data.JsonReader({

                totalProperty: "totalSize",

                root: "data",

                fields:this.DynamicGridPanel_fields

                });

    },

    //private   

    DynamicGridPanel_bbar:function(){

    this.bbar = new Ext.PagingToolbar(this.pagingConfig);

    },

    DynamicGridPanel_ToolBar:function(){

        

     return new Ext.Toolbar(

         { 

            hidden:this.hiddenDefaultTbar,

            items:[

             '->','

            this.DynamicGridPanel_Search()

                ]

          }

        );

    },

    DynamicGridPanel_Search:function(){

           return srch = new Ext.app.SearchField({

                    store: this.store,

                    220,

                    paramName : 'qname',

                    Align:'right'

                });

    },

    loadData:function() {

     this.getStore().load(this.DynamicGridPanelstoreParams);

    },

    getInsertRecord:function(){

     var obj={};

     for(var i=0;i<this.DynamicGridPanel_fields.length;i++){

       obj[this.DynamicGridPanel_fields[i].name]=null;

     }

     var record = Ext.data.Record.create(this.DynamicGridPanel_fields);

     var InsertRecord = new record(obj);

     return InsertRecord;

    },

    getSelectionObjsByName:function(dataName) {

     if(this.getSelectionModel().getCount()<1){

       Ext.MessageBox.alert('请选择数据,可以是多选!');

    return;               

    }else{

     

     var getSelectionRecordsrList=[];

     for(var i=0; i<this.getSelectionModel().getSelections().length;i++){

       if(null!=this.getSelectionModel().getSelections()[i].data[dataName]

           && ""!=this.getSelectionModel().getSelections()[i].data[dataName].trim())

     getSelectionRecordsrList.push(this.getSelectionModel().getSelections()[i].data[dataName]);

       }

    return getSelectionRecordsrList;

    }

    },

    getSelectionObjByName:function(dataName) {

     if(this.getSelectionModel().getCount()==1){               

    return this.getSelectionModel().getSelections()[0].data[dataName];

    }else{

    Ext.MessageBox.alert('请选择数据,并且只能选一条!');

    return;

    }

    },

    getSelectedObj:function() {

     if(this.getSelectionModel().getCount()==1){

    return this.getSelectionModel().getSelections()[0].data;

    }else{

    Ext.MessageBox.alert('请选择数据,并且只能选一条!');

    return;

    }

    },

    getFormRecord:function() {

     if(this.getSelectionModel().getCount()==1){

    return this.getSelectionModel().getSelections()[0];

    }else{

    Ext.MessageBox.alert('请选择数据,并且只能选一条!');

    return;

    }

      }

     

    Java代码

    1. public Map extFind(final String hql,final int start,final int pagesize) {   
    2.         List temp = this.getHibernateTemplate().find(getCounthql(hql));   
    3.         long totalSize = temp!=null&&temp.size()>0?Long.parseLong(temp.get(0)+""):0L;   
    4.         //long totalSize = ((Long)this.getHibernateTemplate().find(counthql).iterator().next()).longValue();   
    5.            
    6.         List lst = getHibernateTemplate().executeFind( new  HibernateCallback() {    
    7.              public  Object doInHibernate(Session s)  throws  HibernateException, SQLException {    
    8.                    Query query  =  s.createQuery(hql);    
    9.                    query.setFirstResult(start);    
    10.                    query.setMaxResults(pagesize);                     
    11.                    List list  =  query.list();    
    12.                    return  list;    
    13.                    }    
    14.              });   
    15.         HashMap map = new HashMap();   
    16.         map.put("totalSize", totalSize);   
    17.         map.put("data", lst);   
    18.         return  map;    
    19.     }  
  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/hannover/p/1924473.html
Copyright © 2011-2022 走看看