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

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

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

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

一、批量定义属性:

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

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

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

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

// 定义属性表模板
elistbar._metaProperty = ..util.metaProperty()

// 定义属性名称“表”
var props = {	"Visible","Disable","MousePointer","BackColor","RangeStyle",
			    "/FolderFontName","/ItemFontName","/ImgFileName"}

// 批量进行属性表处理
for(i=1;#props;1){
    var isText = ..string.startWith(props[i],"/")   // 返回值是否为文本型
	var propName = ..string.trimleft(props[i],"/")  // 取函数名称
	elistbar._metaProperty[propName] = {
		_set = function(v){
            if isText v = ..string.fromto(v:"");
            owner.dll.setProp(owner.tag,propName,v);
		};
		_get = function(){
            var rv = owner.dll.getProp(owner.tag,propName);
            if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
            return rv;
		};		
	};		
}

二、批量定义方法:

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

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

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

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

		// 批量定义函数
		// 返回值通常为数值型、布尔型、null
		// 如果返回值为文本型,定义时在函数前加/标记

        // 先定义一个函数表
		var funcs = {"setChecked","getChecked","setCaret","/getText","/getTitle"}

        // 将函数表中的每个函数进行定义
		for(i=1;#funcs;1){
			var isText = ..string.startWith(funcs[i],"/")   // 返回值是否为文本型
			var funcName = ..string.trimleft(funcs[i],"/")  // 取函数名称
			this[funcName] = function(...){
				// 构造参数表
				var tb = {...}
                // 如果dll采用ansi编码,便将参数中的字符串转码一下
				for(n=1;#tb;1){
					if type(tb[n])=type.string{
						tb[n]=..string.fromto(tb[n]);
					}
				}
				// 获取返回值
				var rv = this.dll[funcs[i]](this.tag,..table.unpack(tb)); 
				// 如果返回值是文本型,就将其ansi转utf8
				if isText rv = ..string.fromto(..raw.tostring(topointer(rv)),0,65001);
				return rv; 
			}
		}

你可能感兴趣的:(aardio,aardio,属性,编程)