当前位置:   article > 正文

aardio - 封装dll时,批量设置类的属性和函数__metaproperty aardio

_metaproperty aardio

        在封装dll时,通常会定义一个类,用来定义dll的各种功能。

        如果在类里出现 大量的、模式一样的 属性或函数(方法),如果一个一个去定义,会感觉很累。

        这里介绍一种简单方法,可以批量进行定义。

一、批量定义属性:

        1、先用 ..util.metaProperty() 初始化一下属性表模板,

        2、定义属性“表”,利用循环进行批量设置

        3、如果属性为文本型,定义时在函数前加/标记

        这得益于aardio灵活的属性定义功能和强大的util.metaProperty库

  1. // 定义属性表模板
  2. elistbar._metaProperty = ..util.metaProperty()
  3. // 定义属性名称“表”
  4. var props = { "Visible","Disable","MousePointer","BackColor","RangeStyle",
  5. "/FolderFontName","/ItemFontName","/ImgFileName"}
  6. // 批量进行属性表处理
  7. for(i=1;#props;1){
  8. var isText = ..string.startWith(props[i],"/") // 返回值是否为文本型
  9. var propName = ..string.trimleft(props[i],"/") // 取函数名称
  10. elistbar._metaProperty[propName] = {
  11. _set = function(v){
  12. if isText v = ..string.fromto(v:"");
  13. owner.dll.setProp(owner.tag,propName,v);
  14. };
  15. _get = function(){
  16. var rv = owner.dll.getProp(owner.tag,propName);
  17. if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
  18. return rv;
  19. };
  20. };
  21. }

二、批量定义方法:

        对于一般的dll函数,参数和返回值的类型最常用的为数值型、逻辑型、文本型(字符串),对于自定义结构型,会返回指针(数值型)。

        通常数值型、逻辑型、文本型三个类型就基本能满足需要。

        在类构造函数 ctor 中,可以批量定义dll的函数。

        这得益于aardio强大的不声明直接调用API的功能。

  1. // 批量定义函数
  2. // 返回值通常为数值型、布尔型、null
  3. // 如果返回值为文本型,定义时在函数前加/标记
  4. // 先定义一个函数表
  5. var funcs = {"setChecked","getChecked","setCaret","/getText","/getTitle"}
  6. // 将函数表中的每个函数进行定义
  7. for(i=1;#funcs;1){
  8. var isText = ..string.startWith(funcs[i],"/") // 返回值是否为文本型
  9. var funcName = ..string.trimleft(funcs[i],"/") // 取函数名称
  10. this[funcName] = function(...){
  11. // 构造参数表
  12. var tb = {...}
  13. // 如果dll采用ansi编码,便将参数中的字符串转码一下
  14. for(n=1;#tb;1){
  15. if type(tb[n])=type.string{
  16. tb[n]=..string.fromto(tb[n]);
  17. }
  18. }
  19. // 获取返回值
  20. var rv = this.dll[funcs[i]](this.tag,..table.unpack(tb));
  21. // 如果返回值是文本型,就将其ansi转utf8
  22. if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
  23. return rv;
  24. }
  25. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号