BUG修正一般不写在下面的更新日志中,请参考BUG反馈页面。

aardio v16.03  更新(2018/1/17):
---------------------------------------------------------------------------
1、 custom控件的类名属性 - 可以直接指定一个用于加载子窗体的aardio文件路径。
使用这个功能,我们可以方便的把一个窗体放到另一个窗体上作为控件窗口。

在custom的属性面板的“类名”属性中增加“浏览文件”按钮。
如果custom控件的类名是一个aardio文件,那么在窗体设计器中双击custom控件
会自动打开指定的aardio文件。

custom控件以前就可以使用 loadForm() 函数加载子窗口,
并且可以加载多个窗口,并且可以实现类似选项卡的效果(例如win.ui.tabs就用到了custom控件)

但是,如果我们只是想最简单的加载一个子窗口,
使用 custom的loadForm函数就不合算了,因为这多创建了一个窗口,而且要多写几句代码。
新功能可以简化这些操作。



aardio v16.02  更新(2018/1/16):
---------------------------------------------------------------------------
1、修正win.ui.tabs可能导致进程无法退出的问题,感谢 Cui 反馈。

aardio v16.01  更新(2018/1/15):
---------------------------------------------------------------------------
1、修正部分系统向导窗口字体问题


aardio v16.0 发布(2018/1/15):
---------------------------------------------------------------------------

为迎接所有新学员,特昼夜兼程,终于赶在开课之前终推出aardio最新版本。

1、全新的工程向导

2、正式推出强大的高级选项卡( win.ui.tabs ),这可不仅仅是一个选项卡,部分范例参考帖子:http://bbs.aardio.com/forum.php?mod=viewthread&tid=22149 

3、大幅改进 plus控件,增强对自定义边框的支持,目前可以在窗口设计器中设置plus的边框,支持单独设置各方向的边框,支持自定义颜色,支持圆角边框,支持圆角裁剪背景。在代码中调用skin函数更可设定不同操作状态下的边框样式(可以同时方便的设置前景背景贴图)

4、工程向导增加“高级界面”,高级控件是以plus控件、win.ui.tabs等基于plus控件的界面组件编写的界面,灵活简洁,简单拖放就可以做出简洁、漂亮的界面,可以大幅提升软件开发效率。

5、增加“electron”工程向导。

6、窗体设计器右键菜单增加:“自动九宫格缩放布局”,
一键调整界面上所有控件到最佳布局效果,原理请参考文章:
https://mp.weixin.qq.com/s/W-1un6Q1n6r4ifOMgdcZxQ

7、修复已知BUG.



aardio v15.76 更新(2018/1/13):
---------------------------------------------------------------------------
1、 修正 string.xml 属性名未检测连字符的BUG


aardio v15.75 更新(2018/1/13):
---------------------------------------------------------------------------
1、 win.ui.tabs 修正笔误,感谢…幽筱\君寒反馈


aardio v15.74 更新(2018/1/13):
---------------------------------------------------------------------------
1、 win.ui.tabs 一些小细节的改进,
 修正窗口拖到不能显示选项卡抛异常的问题,改进点击下拉按钮等不获取焦点
感谢…幽筱\君寒反馈的意见。
 
2、plus控件改进对border属性类型的判断,感谢松江反馈。



aardio v15.73 更新(2018/1/13):
---------------------------------------------------------------------------
1、  win.ui.tabs 一些小细节的改进,禁止选项卡得到焦点,
在选项卡数目超出显示范围需要自动折叠时,总是显示当前选中选项卡.
感谢…幽筱\君寒反馈的意见。

aardio v15.72 更新(2018/1/12):
---------------------------------------------------------------------------
1、 改进 win.ui.simpleWindow 支持更多自定义参数

aardio v15.71 更新(2018/1/12):
---------------------------------------------------------------------------
1、修正关闭按钮出现时窗口会闪一下(抢焦点)

aardio v15.70 更新(2018/1/12):
---------------------------------------------------------------------------
1、增加自动移除窗体边框
范例已更新,增加调用选项卡打开网页的示例,感谢podes增加示例

aardio v15.69 更新(2018/1/12):
---------------------------------------------------------------------------
1、win.ui.tabs 改进窗口加载相关函数,
感谢…幽筱\君寒反馈选项卡超出显示范围自动折叠后,出现窗口与选项卡不对应BUG


aardio v15.68 更新(2018/1/12):
---------------------------------------------------------------------------
1、plus控件支持在样式中配置边框,圆角等
演示代码请点这里查看

aardio v15.67 更新(2018/1/12):
---------------------------------------------------------------------------
1、标准库增加高级选项卡控件( win.ui.tabs )

这是基于plus控件开发的增强版选项卡,这可不仅仅是一个选项卡,
这个库的代码量接近plus控件的代码量,也跟plus控件一样不但使用简单,而且功能强大。

1、可以非常快的开发出变化丰富的导航条效果。
2、按钮使用plus控件,所以可以做的非常漂亮。
3、自动识别设计器中模板控件的设置,自动判断是水平还是垂直选项卡
4、自动搜索附近的custom控件,如果找到,自动管理多窗口的切换显示。
5、在按钮数目太多超出显示范围时,可自动生成下拉菜单。
6、支持在选项卡上自动生成悬浮的关闭按钮,可以非常方便的动态添加、删除节点。
......

库函数文档已经写好,范例和教程后面再补上


aardio v15.66 更新(2018/1/10):
---------------------------------------------------------------------------
1、改进plus控件自绘接口,参考新版 onDrawBackground,onDrawContent文档

aardio v15.65 更新(2018/1/10):
---------------------------------------------------------------------------
1、修正新版固定底边距报错

aardio v15.64 更新(2018/1/10):
---------------------------------------------------------------------------
1、强力改进 winform.add / addCtrl 函数,
注意所有控件对象都有 addCtrl 函数,用法与 winform.add完全一样。
但是控件的 addCtrl 函数可以将其他控件添加为自己的子窗口。

现在可以非常方便的在创建控件时通过 
marginLeft,marginRight,marginTop,marginBottom指定外边距,

这几个参数非常有趣的地方在于他除了可以使用普通的数值指定边距以外,
也可以使用一个0到1之间的小数指明如何划分剩余可用空间的百分比作为边距。
例如,当我们把 marginTop 设为 0.5 ,这个控件就可以在运行时在父窗口中垂直居中了。
简单灵活,是不是有点感觉找到了写CSS的一些感觉呢?!

另外,还可以直接在创建控件的参数中通过width指定宽度,height指定高度。

本版同时新增范例详细讲了 winform.add / addCtrl 函数的用法。
因为这几个函数一直是通过窗口设计器来用的,所以文档基本没有写到。
范例位置:aardio范例->Windows窗口应用->动态添加控件

2、因为启动触发器init.aardio是不可修改的,
新版本增加了一个功能,init.aardio会检测同目录下是否存在 init-user.aardio,
如果有这个文件就自动执行。感谢松江反馈的意见。

请注意启动时加执行代码会影响到启动速度。 
	
3、修正access,sqlServer一处BUG,感谢晨阳反馈


aardio v15.63 更新(2018/1/10):
---------------------------------------------------------------------------
1、修正access,sqlServer新增的getRows函数BUG,感谢republican反馈。


aardio v15.62 更新(2018/1/9):
---------------------------------------------------------------------------
1、修正新版有时候不提示版本更新,感谢xauto反馈


aardio v15.61 更新(2018/1/9):
---------------------------------------------------------------------------
1、增加一个懒人库 win.ui.simpleWindow,
用于实现无边框窗口时,用一句代码就可以快速添加标题栏按钮、阴影、拖动边框等等。


aardio v15.60 更新(2018/1/9):
---------------------------------------------------------------------------
1、改进 electron.runtime 支持发布时打包asar文件、自动复制electron运行库。

aardio v15.58 更新(2018/1/9):
---------------------------------------------------------------------------
1、win.ui.grid 改为鼠标双击开始编辑,增加 readonlyColums 属性可用于设置只读列,感谢 KING 反馈的意见和部分代码。。

2、 web.socket.jsonServer 增加 hActiveSocket 属性可用于在服务端RPC回调函数中获取活动套接字句柄。

aardio v15.57 更新(2018/1/8):
---------------------------------------------------------------------------
1、改进aardio启动速度

2、工具栏的“扩展”选项卡改为“插件”,避免眼花看成“扩展库”,扩展库在右边。


aardio v15.56 更新(2018/1/6):
---------------------------------------------------------------------------
1、去掉开始页阻塞线程的一句win.invoke,换成线程异步回调。

2、优化win.peekPumpInputMessage()函数,快了那么一丁点,积少成多。



aardio v15.54 更新(2018/1/5):
---------------------------------------------------------------------------
1、修正inet.http导致报参数错误的BUG一处,感谢库拉反馈并协助测试一晚上。


aardio v15.53 更新(2018/1/5):
---------------------------------------------------------------------------
1、增加 wsock.udp.asynClient 异步UDP客户端
2、增加 UDP/SSDP 局域网发现设备示例

	import win.ui;
	
/*DSG{{*/
var winform = win.form(text="SSDP客户端 - 发现局域网设备";right=1044;bottom=715)
winform.add(
btnDiscover={cls="button";text="发现局域网设备";left=789;top=645;right=979;bottom=698;db=1;dr=1;z=2};
edit={cls="edit";left=15;top=23;right=1021;bottom=625;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

	
	import web.json;
	import wsock.udp.ssdpClient;
	var ssdpClient = wsock.udp.ssdpClient();
	
	//异步响应局域网设备应答的数据报文
	ssdpClient.onDeviceDiscovered = function(result){
		winform.edit.print(result)
	}
	
	//发起SSDP查询
	winform.btnDiscover.oncommand = function(id,event){
		ssdpClient.discover();
	}
	
	winform.show() 
	win.loopMessage();


aardio v15.52 更新(2018/1/4):
---------------------------------------------------------------------------
1、thread.table添加shift,unshift,append等函数
2、修正inet.httpFile一处BUG


aardio v15.51 更新(2018/1/4):
---------------------------------------------------------------------------
1、网站开发增加session功能,标准库中各个HTTP服务端实现已同步支持。
可以实现自定义的session实现,只要在sessionHandler名字空间下添加库并导入就可以了,
aardio已经默认提供了sessionHandler.default (使用文件存储session)。

session的使用非常简单,不需要像其他语言那样要搞一堆函数,
直接用 session["键名"] 就可以存取session键值了。

只要使用了 session,session功能就会自动启动。
如果不使用,session功能就会保持关闭状态,一切全自动,
不用多写一句代码。

	---------------------------------------------------------------------------
	session 的使用非常简单,
	直接用 session["键名"] 就可以存储键值了。
	
	如果页面代码中使用session,那么session功能就会自动启动,
	调用 session.start() 不是必须的。
	
	可选调用 session.start() 函数来启动session,
	这个函数的参数可以指定一个过期时间,以秒为单位,
	默认为1800秒,注意过期时间将应用于当前网站下的所有session。
	
	可选在 sessionHandler 名字空间下创建自定义的session加载器,
	只要该加载器导入网站应用,服务端会优先使用自定义的加载器。
	
	if(! session["count"] ){
		response.write("欢迎首次访问");
		session["count"]=1;
	}
	else {
		session["count"]=  session["count"] + 1;
		response.write("本次会话访问本站次数:",session["count"]);
	}

	---------------------------------------------------------------------------
	
	这里补充一下,为什么我用web.json存储session,而不是直接序列化table对象,
	table对象的语法比较复杂,在还原时要用到eval,而eval可以执行任何代码,所以这种用户可能从客户端提交数据的地方,
	调用eval是不太安全的。最后改用了更简单的JSON,因为JSON基于纯文本解析所以没有这个问题,
	原来json中有一处调用eval的非标准扩展,已经在本版被移除了。

	所以大家要注意,虽然table序列化方便,但不要在客户端服务端传来传去的,
	本机桌面软件当然没有问题,别人要捣乱,不如直接格式化他自己的硬盘更快点。


aardio v15.50 更新(2018/1/3):
---------------------------------------------------------------------------
1、优化WebSocket事件触发机制


aardio v15.49 更新(2018/1/3):
---------------------------------------------------------------------------
1、electron运行库改了国内CDN(感谢大淘宝),试了下可以闪电下载,

2、改进 inet.httpFile,修正某些网址不能下载,服务器未提供文件名时下载失败的问题。



aardio v15.47 更新(2018/1/3):
---------------------------------------------------------------------------
1、修正几处笔误,感谢艾克反馈


aardio v15.46 更新(2018/1/3):
---------------------------------------------------------------------------
1、添加 win.setTimeout() 函数用于异步延迟执行函数。
适合一些内部没有窗口的对象,但又需要调用setTimeout时使用。

2、 web.socket.jsonClient 在服务端断开以后发送出错,
不再抛出异常,而是改为触发 onError,end 等错误回调函数。


aardio v15.45 更新(2018/1/2):
---------------------------------------------------------------------------
1、修正com.DumpTypeInfo错误,感谢松江反馈

aardio v15.44 更新(2018/1/2):
---------------------------------------------------------------------------

1、修正FastCGI网站卡住的问题,感谢 133720331 反馈
2、修正sqlServer报错,感谢 晨阳 反馈


aardio v15.42 更新(2018/1/2):
---------------------------------------------------------------------------

1、2018新年第一次给力更新,aardio标准库增加了web.nativeMessaging,
用于写Chrome本地应用扩展,几句代码就可以写一个本地应用了,不用带巨大的运行库,
虽然chrome的协议是基于阻塞读写的管道实现,但在aardio中使用强大的多线程封装为了异步消息模式,
类似WebSocket,虽然底层以多线程实现,但调用时只要用最简单的单线程异步的事件模式写代码就可以了,
稍后我会发教程,简单例子:

	教程:http://bbs.aardio.com/forum.php?mod=viewthread&tid=22108

	//创建本地应用消息主机
	import web.nativeMessaging;
	var host = web.nativeMessaging();
	
	//客户端已连交接
	host.onOpen = function(extension,parentWindow){
		
    	winform.edit.print("客户端已连接:",extension)
	
    	//不能使用 win.setParent(),chrome会崩溃掉
		win.setOwner(winform.hwnd,parentWindow);
	}
	
	//客户端已关闭
	host.onClose = function(){
		winform.edit.print("客户端已断开,即将退出")
		win.quitMessage();//必须及时退出
	}
	
	//客户端发了JSON对象过来
	host.onMessage = function(data){
		winform.edit.print("收到数据",data);
		host.send("这是来自aardio的数据");
	}
	
	//遇到错误了
	host.onError = function(err){
		winform.edit.print(err);
	}
	
	//运行消息主机
	host.run();
	}

2、改进_ARGV自动解析参数为键值对的功能,如果参数有多个前导符则去除多个前导符,支持自动拆解使用等号分隔的键值对

3、io.open打开的文件流对象增加mode函数,可以修改文本的二进制或文本模式,并可以获取文件正在使用的模式。另外增加 type() 函数用于获取文件对象的类型(例如控制台,管道,本地文件....等等)


aardio v15.41 更新(2017/12/31):
---------------------------------------------------------------------------
1、win.ui.grid 增加按空格进入编辑状态,按ESC撤消等等....参考文档


aardio v15.40 更新(2017/12/31):
---------------------------------------------------------------------------
1、raw.buffer 支持传入参数为 { type="Buffer";data ={1;2;3;} } 格式的对象,并还原为buffer对象。aardio中的buffer对象以及node.js中的Buffer对象转换为JSON时都使用该格式。

2、其他一些细节上的代码优化


aardio v15.39 更新(2017/12/31):
---------------------------------------------------------------------------
1、listview控件增加 setTable() 函数,可用于将sqlite,access,sqlSever等数据库对象的
getTalbe()函数取出来结果直接显示在listview控件上。

2、增加 win.ui.grid 用于为listview增加编辑功能,
现在写一个简单的显示、编辑数据控件只要几句代码了。

3、access,sqlServer增加getRows函数,优化getTable函数,感谢 republican 提出的改进意见

	import win.ui;
	
/*DSG{{*/
var winform = win.form(text="简单数表表视图";right=1031;bottom=712)
winform.add(
edit={cls="edit";left=25;top=584;right=997;bottom=693;edge=1;multiline=1;z=2};
listview={cls="listview";left=24;top=27;right=996;bottom=555;edge=1;z=1}
)
/*}}*/

	
	import sqlite 
	var sqlConnection = sqlite("/testParameters.db");
	sqlConnection.exec( "CREATE TABLE IF NOT EXISTS @tablename(id INTEGER PRIMARY KEY, date, title);",{
    	tablename = "myTableName"
	} ) 
	
	var cmd = sqlConnection.prepare("INSERT INTO myTableName VALUES (NULL,@date,@title);" );
	for(i=1;10;1){
		cmd.step(
    		date = time().addday( math.random(1,30));
    		title = string.random(15);
 		)
	}
	
	import win.ui.grid;
	var grid = win.ui.grid(winform.listview);
	var dataTable = sqlConnection.getTable("SELECT * FROM [myTableName] ");
	
	////直接让liswview控件显示数据库的查询结果
	grid.setTable( dataTable )
	
	//编辑变更值会触发下面的事件
	grid.onEditChanged = function(text,iItem,iSubItem){
		var name = dataTable.fields[iSubItem]
		winform.edit.print(dataTable[iItem][name],"-->",text);
		dataTable[iItem][name] = text;
	} 
	
	winform.show() 
	win.loopMessage();


aardio v15.38 更新(2017/12/30):
---------------------------------------------------------------------------
1、增加sqlite.backup 
 
	import sqlite;
	import console 
	
	var db = sqlite(":memory:"); 
	db.exec("CREATE TABLE user( id  INTEGER PRIMARY KEY )");
	for(i=1;10) db.exec("INSERT INTO user VALUES (NULL)" )     
	
	// 备份内存数据库
	import sqlite.backup;
	var backup = sqlite.backup(db,"\backup.data")
	backup.step();
	
	// 查看备份结果
	var dbTest = sqlite("\backup.data")
	console.dumpJson( dbTest.getTable("SELECT  * from [user]") )
	console.pause();
	 
	
	
aardio v15.36 更新(2017/12/30):
---------------------------------------------------------------------------
1、修正 wsock.tcp.client 对象新增的 readAlloc() 一处可能导致程序崩溃的BUG,
这个BUG会影响到较多的其他库,建议尽快升级

aardio v15.35 更新(2017/12/30):
---------------------------------------------------------------------------
1、因为ini是基本被淘汰的格式,在aardio中用的很少,
确实我对这个没有对 json这些文件格式那么重视,库函数说明写的比较简单。
刚才我已经补充了一下fsys.ini的文档。

当然类似这种库本身就没几句代码,大家可以看一下库函数的源码都可以一目了然了,
有时候看文档反而不如直接看源码。

2、关于fsys.ini的函数失败返回null,之前我为什么没写, 
在aardio中有返回值的库函数失败基本都返回null,大多数我都写了,但少数的可能没写,
毕竟库函数那么多,千万遍的重复相同的一句话也没意义。

在aardio语句手册->函数返回值 
这一节我再加了一大段重点讲了一下关于这方面的问题。


aardio v15.34 更新(2017/12/30):
---------------------------------------------------------------------------
1、修正嵌入多个electron窗口的范例,在关闭窗口时electron进程不退出的问题,感谢xauto反馈。

electron不像aardio那样关闭所有窗口,并且没有代码再执行了以后会自动退出,你希望electron退出,
必须明确加上退出进程的代码,不然他就会一直在那里运行。所以请注意:electron主进程必须添加以下代码:

	//在所有窗口关闭时退出electron进程
	app.on('window-all-closed', () => app.quit() );


aardio v15.33 更新(2017/12/30):
---------------------------------------------------------------------------
1、 添加 winform.onDropFiles回调用于支持文件拖放,
不用去写 _WM_DROPFILES 回调,也不用再调用 win.getDropFile(wParam)了
示例:
	
	import win.ui;
	
/*DSG{{*/
var winform = win.form(text="请拖放一个或多个文件到窗口上";right=759;bottom=469)
winform.add(
edit={cls="edit";left=69;top=34;right=693;bottom=377;edge=1;multiline=1;z=1}
)
/*}}*/

	
	/*
	可以在窗口属性中设置接受拖放,
	也可以用DragAcceptFiles动态控制是否接受拖放
	*/
	::Shell32.DragAcceptFiles(winform.hwnd,true);
	
	//拖放会触发onDropFiles事件,files已经是处理好的文件路径数组了
	winform.onDropFiles = function(files){
		winform.edit.print(files) 
	}
	
	winform.show() 
	win.loopMessage()
	

aardio v15.32 更新(2017/12/29):
---------------------------------------------------------------------------

electron支持库重新换了个方法实现,用远进程API钩子的方法有些粗鲁了,
因为现在aardio与electron主进程可以更方便的交互,而electron提供了一个函数
win.getNativeWindowHandle().readInt32LE() 可以取到他的窗口句柄,所以改进了不再用API钩子。

而且elecron是多进程交互,多进程的交互需要方便的了解双方的状态,
例如RPC通道是否打通连接,窗口是否显示创建等等。我们必须改成按JS异步回调的思路来处理这些问题。

目前嵌入electron的功能已大幅简化,main.js最短只要几句代码就可以了。
在electron中可以用 aardio.on("ready") 来保证 A/E 双方都已经准备就绪。
而在aardio中可以用 app.onReady() 回调来保证 A/E 双方都已经准备就绪。

electron范例已经更新。
范例位置:aardio代码段 -> 范例程序 -> electron

本来下午就写好了,但是遇到了一个诡异的BUG,一切代码都正常,但很多代码都不执行了,
诡异的是,我随便找个地方加了一句 win.delay(100)就正常了,我满头大汗的找了三四个小时,
最后发现,原来是调试代码里试用electron调用winapi,然后弹了个MessageBox,因为electron取窗口句柄麻烦,
所以就没有设置父窗口,然后这个MessageBox藏到主窗口后面了,所以 electron停在那里了.......

不是简单的问题,就不需要工作量


aardio v15.31 更新(2017/12/29):
---------------------------------------------------------------------------
1、修正zlib.unzip报错,感谢xauto反馈

aardio v15.30 更新(2017/12/28):
---------------------------------------------------------------------------

1、增加asar文件解析器

electron用到一种asar的打包文件格式,
压缩工具都不支持这个,只能在node.js的命令行里搞,虽然我用node.js写了个工具,
不能直接查看文件列表,不能编辑,打包解包连个进度条都没有,闷声不响的.......
虽然码命令行能让人找到某种神圣的自豪感,但我还是受不了了,决定自己写一个。

标准库增加:
fsys.asar.reader 用于解包
fsys.asar.writer 用于打包生成asar文件。

范例增加:
aardio范例->文件操作->asar->打包解包工具
代码可以拿去当教程看看不错的。



2、文件流读写指针全部改用64位指针,size函数不再需要指定参数。
获取格式化的文件大小,请使用 size64函数。

3、json支持unint64位长整数(非标准不规范的写法,JS是支持不了的)

4、buffer在不指定初始值时,仍然初始化内存,不然有时候会带来一些诡异的问题。

5、其他一些代码细节上的优化改进,不一一列举。


aardio v15.29 更新(2017/12/26):
---------------------------------------------------------------------------

1、WebSocket的readyState属性增加到所有套接字对象,
所有套接字对象增加 isConnected()用于判断是否连接并准备就绪,
增加 isClosed()函数用于判断套接字是否关闭.

整理优化一些代码细节,改进部分文档、范例。


aardio v15.28 更新(2017/12/26):
---------------------------------------------------------------------------
1、改进WebSocket服务端对客户端群发消息时,自动忽略不在连接状态的客户端


aardio v15.27 更新(2017/12/26):
---------------------------------------------------------------------------
1、gdip.graphics增加drawArc函数,并修正BUG,感谢popdes


aardio v15.26 更新(2017/12/26):
---------------------------------------------------------------------------
1、electron又一波强劲的更新杀来了,
electron主进程也可以与aardio方便的互调函数了,写法跟渲染进程的用法一模一样。
再也不用担心主进程、渲染进程搞不清楚,交互吃力了。

请查看新增范例:aardio范例->electron->主进程交互
不用多写一句代码,不用自己安装模块,所以事情,由aardio帮你一键搞定。


nodeJs扩展库更新 更新(2017/12/26):
---------------------------------------------------------------------------
1、nodeJs扩展库改进代码,改进库函数说明文档,
执行命令支持传统命令行参数格式(使用一个字符串,空格分格式个参数),
也可 以使用原来的多函数参数格式(推荐,可以更好的自动处理转义),
增加通过nodeJs.workDir设计node.js工作目录的属性。


aardio v15.25 更新(2017/12/26):
---------------------------------------------------------------------------

1、改进 console.log() 输出数据长度超出控制台内存限制时改用 io.print输出。



aardio v15.24 更新(2017/12/26):
---------------------------------------------------------------------------

1、 web.socket.chrome 已改进增强, electron,chrome连接远程调试接口都使用这个对象实现。
chrome远程调试的范例也已经更新,并移动到新位置:aardio范例->Web应用->WebSocket->chrome


2、 electron强劲更新,
现在打开一个网址只要一句代码: app.start("http://bbs.aardio.com")
启用远程调试接口,也只要一句代码:app.remoteDebuggingPort = 0

aardio范例里增加了electron分类,增加了更多electron范例。
现在可以非常方便的支持Chrome的WebSocket远程调试协议。

这比调用chrome还要方便,chrome的调试接口是全系统只能有一个端口开放调试。
但我们使用electron,每个进程都可以有自己私有的远程调试接口,aardio会自动为
每个进程分配不会冲突的空闲端口,并且我们只要调用一句代码就可以连接到electron并且控制他了:

var ws = web.socket.chrome();
ws.waitForConnected()

上面的 ws.waitForConnected() 会等待electron打开调试接口,
即使 electron是随机分配的端口,该函数仍然能自动找到端口号,并且
自动检测electron开启的websocket服务地址,然后自动连接到指定id的页面。

这本来是好几十句代码的事,在aardio里只要一句!只要一句了!

3、所有WebSocket客户端增加waitForConnected()函数,可阻塞等待连接成功。
当然也可以在onOpen事件中异步等待连接成功。


4、增加table.keys() 可用于获取对象的自定义键名,支持 _keys,_defined等元方法,web.json使用该函数确定键名列表

5、改进table.eachName() 函数调用 table.keys() 获取字符串键名列表。 web.json使用该函数获取对象成员。

6、改进table.len() 函数,支持自动识别对象的length属性,支持 _length元方法。 web.json使用该函数确定数组长度。

7、增加 table.eachIndex() 迭代器用于遍历数组成员,此函数调用 table.len,
支持相关元方法。并支持在元属性中使用_startIndex自定义下标的对象

8、增加 table.type() 函数,用于获取表对象是aaray还是object。 web.json使用该函数确定对象的类型。

9、增加 web.json.strip() 函数,用于将一个对象转为JSON再转回来,可以用于web.kit里快速的将一个JS对象完全转换为普通的aardio对象。

10、web.kit扩展库改进(跟上面几个有关)

web.kit扩展库已改进,web.kit的JS对象可使用 table.eachName 遍历。
而 web.kit的数组可使用 tahble.eachIndex 遍历所有成员,非常方便。

也可以调用 web.json.strip(js对象),将webkit返回的JS对象直接转换为普通的aardio对象。

	import win.ui;
	
/*DSG{{*/
var winform = win.form(text="webkit - aardio操作js对象";right=1123;bottom=570)
winform.add(
edit={cls="edit";left=898;top=26;right=1363;bottom=539;db=1;dr=1;dt=1;edge=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

	
	import web.kit.form;  
	var wb = web.kit.form(winform); 
	
	//使用external接口定义网页脚本可调用的本地函数
	wb.external = {  
    	aardioCall = function(object){ 
        	
        	winform.edit.print("-----------------遍历JS对象的所有成员-----------------------");
        	for name,value in table.eachName(object){
            	winform.edit.print("对象",name,value);
        	}
        	
        	winform.edit.print("-----------------遍历JS数组的所有成员-----------------------");
        	for i,v in table.eachIndex(object.array){
            	winform.edit.print("数组",i,v);
        	
        	} 
        	
        	winform.edit.print("-----------------直接转换为普通的对象-----------------------");
        	var obj = web.json.strip(object);
        	winform.edit.print(obj);
    	};
	}
	
	wb.html = /**  
    	<a href='javascript:
    	external.aardioCall({
        	url:"服务端URL",
        	param:{a:1,b:2,c:3},
        	array:[11,12,13,14,15]
    	}); '>调用aardio函数external.aardioCall()操作JS对象、数组</a> 
	**/ 
	
	winform.edit.orphanWindow();
	
	winform.show() 
	win.loopMessage();



aardio v15.22 更新(2017/12/25):
---------------------------------------------------------------------------
1、修正WebSocket客户端数据量大时出现接收不完整的问题,感谢5e365反馈
2、修上access,sqlServer返回空记录集报错,感谢 yc51反馈
3、access,sqlServer增加stepQuery函数,用于快速返回结果记录集的第一行数据


aardio v15.21 更新(2017/12/24):
---------------------------------------------------------------------------

1、edit,richedit控件做了一个小改进(但很有用),
print函数支持序列化对象,如果当前导入了web.json,则自动使用json字符串化(并添加缩进、美化输出效果)

这个功能可以方便我们使用对话框输出变量值,因为JSON我们使用的频率非常高,
使用了任何基于JSON的模块,例如JSON RPC这些,文本框就自动支持直接以JSON显示对象的值了。

edit控件并不会自动导入web.json,
在写库的时候,我会尽量会减少模块之间不必要的依赖。
这样的好处是可以写出体积更小的程序(虽然aardio的模块已经都很小了,但还可以更小),
其次是避免程序的代码错缩复杂,相互纠缠,大家写代码的时候,尽量也保持这个习惯会更好。


aardio v15.20 更新(2017/12/24):
---------------------------------------------------------------------------

1、改进 electron支持库,修正启动时偶尔出现的崩溃问题。
再次改进 electron启动闪烁的问题,更丝滑,更流畅!

注意:在太低配置机器上,electron启动会稍慢,启动偶尔会出现黑屏,但启动后还是可以的


aardio v15.18 更新(2017/12/24):
---------------------------------------------------------------------------

1、改进 web.json, time,buffer类型字符串化的结果与node.js生成一样的格式。
这些是JSON标准没有规定的对象,而JSON用得最多的就是JS,所以与JS保持一致。

aardio v15.17 更新(2017/12/24):
---------------------------------------------------------------------------

1、 electron 范例再改进, 
范例位置:aardio范例->Web应用->electron 增加拖动边框、窗口阻影等演示。
修正拖动标题栏导致electron卡死,关门为了他把winform.hitCaption改成了异步拖动

基本上现在嵌入electron可能遇到的常见需求我都在范例里演示了。
 
 
 
aardio v15.16 更新(2017/12/24):
---------------------------------------------------------------------------

1、 electron 支持库改进:

修正 aardio.js 中一处导致JS调用aardio函数出错的小BUG。
范例增加更多 js/aardio 交互调用函数的演示代码。

范例位置:aardio范例->Web应用->electron 



aardio v15.15 更新(2017/12/24):
---------------------------------------------------------------------------

1、修正嵌入 electron不能输入文字的问题。
目前如果启用开发者工具只能输入英文,禁用开发者工具就没问题了。
这个没什么影响,只有你自己调试才会开启这个,暂时不深究了。

刚才发现,如果在aardio中导出external对象。
那么在electron的控制台输入 aardio 都有出现成员函数列表,
这相当于eletron自动支持aasdl接口,非常方便。


aardio v15.14 更新(2017/12/23):
---------------------------------------------------------------------------

1、修正 electron启动后窗口仍然会闪一下黑屏的问题。
目前更改为在 electron创建窗口时,强行将其隐藏,然后在 
electron主进程的创建窗口代码后添加以下代码:
	
	win.once('ready-to-show', () => {
      	win.show();
	})
	
测试了可以完美的解决问题,启动很流畅再也不会晃动一下了。

这里告诉大家一个技巧,electron的主进程调试麻烦,
默认弹出的JS错误信息,其中关键的js文件又把最关键的文件名显示为了省略号,
结果错误信息成了天书,其实,大家可以在这个错误对话框上按一下Ctrl+C就可以了,
完整的错误信息就会被复制到剪贴板。


aardio v15.13 更新(2017/12/23):
---------------------------------------------------------------------------

1、修正electron启动会显示一下窗口标题栏的问题。
electron创建无边框窗口本来是没有标题栏的,但创建后会突然显示一下标题栏,然后又隐藏掉。
这带来的体验不太好,今天改进了一下,首先将electron窗口隐藏,等他刷完标题栏再显示,效果好多了。


aardio v15.12 更新(2017/12/23):
---------------------------------------------------------------------------

1、标准库添加 string.lcid.用于将三字母区域语言代码缩写转换为LCID 

2、time.ole改进,支持以2种语法格式化输出字符串,例:

	//OLE时间支持系统格式化语法
	var str = tostring(tm,"yyyy-MM-dd HH:mm:ss")
	
	//也默认支持time对象的格式化语法
	var str = tostring(tm,"%Y年%m月%d日 %H时%M分%S秒"))
	
	//还可以转换格式化语法
	console.log( tm.toSystemFormat("%Y年%m月%d日 %H时%M分%S秒"))
	
3、access, sqlServer重点改良,并添加到标准库中,
新版用起来更方便了,例如使用sqlServer调用存储过程:

	
	import console;
	import sqlServer;
	
	//打开数据库
	var db = sqlServer( 
    	["Data Source"]= "IP地址,服务端口";
    	["Database"]= "数据库名";
    	["User ID"]  = "用户名";
    	["Password"]= "用户密码"; 
	)
 	
	//创建存储过程
	if( ! db.existsProcedure("proc_test") ){
 		db.exec("
 		CREATE PROC proc_test( @a INT,@b INT1 )    
		AS
		begin
			SELECT @a + @b
		end
		");    
	}
	
	//创建命令参数对象,用于执行存储过程
	var cmd = db.createCommand( "proc_test" ); 
	
	//绑定存储过程参数
	cmd.bind(
		a = 2;
		b = 3;
	)
	
	//执行并显示结果
	console.dump(cmd.getTable()[1])
	console.pause();
	
	
aardio v15.11 更新(2017/12/22):
---------------------------------------------------------------------------
1、修正electron在一些系统中启动报JSON错误


aardio v15.09 更新(2017/12/22):
---------------------------------------------------------------------------
1、修正electron自动下载时失败

aardio v15.08 更新(2017/12/22):
---------------------------------------------------------------------------
1、重量级更新,aardio支持几句代码就嵌入electron了,
可以方便的与electron交互调用函数,史上最长的更新说明猛戳此链接: 
http://mp.weixin.qq.com/s/h4KHenCb_tuU-iIOb1oY4Q


aardio v15.07 更新(2017/12/21):
---------------------------------------------------------------------------

1、强劲更新WebSocekt/RPC 相关库。

web.socket.jsonServer添加survey函数,
支持以调查模式方便的批量调用客户端函数,并获取返回值。

web.socket.jsonServer添添加publish函数,
支持以发布订阅模式方便的推送消息给所有客户端。

nanomsg的消息模式非常诱人,但是他一是不支持XP,二是客户端发错一个数据包就能让服务端崩溃掉,
目前用起来是有点不省心的,所以我用纯aardio模仿了nanomsg的通信模式,整体上没用几句代码就实现了,
没有使用第三方组件,所以也不会不支持XP什么的,几句代码提上就可以到处跑,兼容性没问题,当然,
这只是WebSocekt通信,在机制上跟nanomsg有些区别,但我们用于桌面软件开发,足够用了。

相关范例已更新。

2、与RPC有关的库实现支持 aasdl,
因为js语言不能像aardio那样,把rest-rpc,json-rpc提供的远程函数方便的自动转换为JS中的函数对象,
aardio制定出aasdl使我们可以用最简单的方法快速的使用JS编写RPC客户端,并可以基于aasdl提供的接口描述自动封装JS函数对象,
让我们可以更愉快、更简单的用js与aardio服务端交互。

关于aasdl的详细描述参考网址:http://bbs.aardio.com/doc/aasdl/



aardio v15.06 更新(2017/12/21):
---------------------------------------------------------------------------

1、反复测试WebSocket相关功能,修正发现的几处小问题


aardio v15.05 更新(2017/12/21):
---------------------------------------------------------------------------

改进 web.json 解析器支持更宽松的语法,
目前解析器在安全兼容JSON标准的基础之上,扩展了以下功能:

1、支持单行注释,多行注释
2、元素分隔符可使用分号或逗号,也可以省略
3、键值分隔符可使用冒号,也可以使用等号
4、键名可省略引号
5、值置于圆括号中可使用简单的表达式
6、字符串可以换行
7、数值支持16进制
8、单个字符串、数值都可以解析出来
9、兼容JSONP格式
10、解析成功的JSON后面如果还有多余的文本时忽略

完全兼容JSON/JSONP格式,除个别基本用不到的特性以外兼容JSON5

添加了 web.json.tryParse函数(遇到JSON错误不抛异常而是返回null,错误信息)


aardio v15.04 更新(2017/12/20):
---------------------------------------------------------------------------

1、改进asynHttpServer的run函数允许自动调用 start函数,
能少写一句代码就少写一句代码,将偷懒进行到底。

2、增加aardio范例->Web应用->HTTP服务器->异步HTTP服务器,
其实写个HTTP服务器就几句代码了,别看几句代码实现,功能可不少。

	import win.ui;
	
/*DSG{{*/
var winform = win.form(text="单线程异步HTTP服务端演示";left=10;top=4;right=774;bottom=467)
winform.add(
txtMessage={cls="richedit";left=29;top=22;right=741;bottom=432;db=1;dl=1;dr=1;dt=1;edge=1;link=1;multiline=1;vscroll=1;z=1}
)
/*}}*/

	
	import wsock.tcp.asynHttpServer;
	var srvHttp = wsock.tcp.asynHttpServer();
 	
	//运行HTTP服务端,如果要指定IP,端口,请先调用 srvHttpr.start();
	srvHttp.run( 
    	function(response,request){  ;
         	winform.txtMessage.print("HTTP协议访问:",request.url,request.remoteAddr);
         	
        	if( ..io.exist(request.path) && (request.path !="/") ){
        		response.loadcode( request.path  );
        	}
         	
         	response.contentType = "text/json"
         	response.jsonPrettyPrint = true;
         	response.write(request)
    	} 	
	);
	
	winform.txtMessage.print( 
		"http服务端已启动 " +  srvHttp.getUrl()
	)
	
	winform.txtMessage.print( 
		"
	asynHttpServer可以创建单线程异步模式的服务端,
	可以支持保持连接(Keep Alive),分块传输协议,支持断点续传,支持304缓存,
	支持文件表单上传.支持使用aardio编写的网站,提供的接口兼容IIS/FastCGI下的aardio/web应用。
	可以实现同一个网站在IIS上可以跑,在几句代码就实现的asynHttpServer也可以跑起来。
	并且最方便的是,可以与WebSocket服务端共存共享端口。"
	) 
 	
	winform.show() 
	win.loopMessage();

aardio v15.03 更新(2017/12/20):
---------------------------------------------------------------------------

1、 process进程启动参数使用environment属性指定环境变量时,
可自动继承父进程的其他环境变量,并添加 inheritEnvironment 属性禁用此特性。
用于解决指定环境变量启动进程时,某些进程因为丢失默认的系统环境变量而启动失败。

2、改进 HTTP,WebSocket 服务端,修正几个小问题

扩展库更新(2017/12/20):
---------------------------------------------------------------------------

1、nodeJs扩展库升级,与aardio新版交互调用更方便了。
增加了更多node.js与aardio交互的例子(支持aardio v15.03以上版本)。


aardio v15.02 更新(2017/12/19):
---------------------------------------------------------------------------
1、 标准库中新增 web.socket.jsonServer
可基于WebSocket服务端方便的创建 JSON-RPC 2.0 服务端。
现在只要几句代码,就可以轻松的写一个:HTTP/WebSocket/JSON-RPC 三合一体服务端。
演示已增加到了范例,位置:aardio范例->web应用->webSocket

aardio v15.01 更新(2017/12/18):
---------------------------------------------------------------------------
1、 web.socket.server 增加 onUpgradeToWebsocket 事件,
可用于客户端HTTP协议请求切换到WebSocket协议期间阻止请求,
例如用来实现判断网址中的路径决定是否启动WebSocket,此事件的用法
演示已增加到了范例,位置:aardio范例->web应用->webSocket


aardio v15 更新(2017/12/18):
---------------------------------------------------------------------------

1、已知BUG批量修复。

2、增加函数 raw.find, raw.match, raw.indexOf函数,
用于通过指针在内存中直接搜索字符串或使用模式匹配功能,用法与string库下同名函数类似。

3、wsock标准库更新:

基本重写wsock标准库,优化代码,提升效率,增加很多新函数和新库。
因为新增的函数非常多,这里不一一说明,请查看新版库函数文档。

标准库新增:
wsock.tcp.asynServer 用于创建单线程异步服务端程序
wsock.tcp.asynHttpServer 用于创建单线程异步的HTTP服务器

单线程异步服务端可以非常方便的在一个线程内连接、收、发数据,
并且不用涉及到多线程编程,使用非常方便。但是单线程异步的编程是非常麻烦的,
但没有关系,aardio已经封装的非常简单,例如单线程异步服务器,你完全感觉不到复杂度,
就跟原来在 wsock.tcp.simpleHttpServer或者IIS里写网站是一模一样,完全兼容。

4、新增WebSocket服务端开发库,改进WebSocket客户端开发库。

原用于开发WebSocket客户端的 web.socket.client 已完全重写并大幅改良代码。
新增 web.socket.server 用于开发 WebSocket服务端。

现在几句代码就可以写一个WebSocket服务端了,
而且 web.socket.server 也是基于 wsock.tcp.asynHttpServer,
同时继承了 wsock.tcp.asynHttpServer的所有优势。

使用 web.socket.server 可以在一个端口
同时运行WebSocket服务端和HTTP服务端了,这个你用IIS都很难搞定的事情,
用aardio只要几句代码就可以轻松搞定。

这里要说明一下,这些库主要用于桌面软件,不是用于百万并发,
不要又把“百万并发”搬出来哦。这就好象我做个自行车,你跟我提达不到“光速穿越”一样无意义。

举个例子,例如chrome,aria2提供的基于WebSocket服务端的RPC接口就非常的方便,
很方便的在进程间交互,不同语言间交互,小而美的服务端也是很常见的需求。
不要做任何事上来就把话说的很大很空。

用法请查看新增的范例,位置:
aardio范例程序\Web应用\WebSocket\异步服务端、异步客户端



扩展库 更新(2017/12/18):
---------------------------------------------------------------------------
1、web.kit 新增一系列管理cookie的函数:

cookieData 用于获取所有网站cookie。
cookieSet 用于设置所有网站cookie。
cookieClearSession cookieClear 等清除cookie的函数。
cookieLoad,cookieSave 等cookie文件操作函数。

添加这些函数是为了与 web.blink的接口保持一致,降低大家掌握新扩展库的学习成本。


aardio v14.44 更新(2017/12/15):
---------------------------------------------------------------------------
1、标准库增加 JSON-RPC  2.0服务端实现 web.rpc.jsonServer。
这是基于HTTP协议的服务端,适用于HTTP服务器环境,可用于
IIS/FastCGI, wsock.tcp.simpleHttpServer等环境下,

2、重写 web.rpc.jsonClient (基于HTTP协议的JSON-RPC 2.0客户端)。

3、重写 web.socket.jsonClient 实现基于WebSocket协议的JSON-RPC 2.0客户端。

4、重写 web.socket.chrome,改为继承 web.socket.jsonClient对象,
chrome远程调试接口实际上就是基于JSON-RPC 2.0,所以直接共享代码了。

5、范例新增【Web应用】目录,本次更新增加的范例请到这个目录下找

现在基于这种协议的软件挺多的,所以本次更新狠狠的改进了这方面的功能。 


刚发的一个例子:
使用WebSocket/RPC协议调用aria2,据说比迅雷强10倍的下载工具
http://bbs.aardio.com/forum.php?mod=viewthread&tid=22045

扩展库 更新(2017/12/13):
---------------------------------------------------------------------------
1、web.sciter 更新sciter组件到官网当前最新版本。
2、web.blink 增加getEle,waitEle,queryEles,click,dispatchEvent,cookieData...
等一大堆实用函数,细节请查看库函数文档
3、mpvPlayer扩展库修正部分BUG,感谢cad反馈
4、修正libvlc扩展库笔误一处,感谢cad反馈


aardio v14.44 更新(2017/12/13):
---------------------------------------------------------------------------
1、标准库增加了 fsys.cookies ,
这是一个 netscape/curl cookie文件格式解析器


aardio v14.43 更新(2017/12/13):
---------------------------------------------------------------------------
1、修正 win.ui.tracker 笔误

aardio v14.42 更新(2017/12/13):
---------------------------------------------------------------------------
1、修正 web.multipartFormData 报参数为空的bug


扩展库 更新(2017/12/13):
---------------------------------------------------------------------------
1、在网页上要点一下“登录”链接,发现JS中querySelector()函数不支持按文本查找,
于是把 web.form中的aardio函数queryEles()以及waitQueryEles() 移植到了web.kit里。

试了一下非常好用:

import win.ui;
/*DSG{{*/
var winform = win.form(text="web.kit queryEles演示";right=1308;bottom=754)
winform.add()
/*}}*/

import web.kit.form;
var wb = web.kit.form( winform );

wb.go("http://www.baidu.com") 
winform.show();

var eles = wb.waitQueryEles("a",{innerText="登录"} ); 
eles.click();

winform.show() 
win.loopMessage();


今天增加的新功能目标为了实现 inet.http / web.kit 共享会话
请升级到新版本后查看演示代码: 
http://bbs.aardio.com/forum.php?mod=viewthread&tid=22023


扩展库 更新(2017/12/12):
---------------------------------------------------------------------------
1、web.kit 取出的cookie有deleted值,防碍使用 inet.http 共享会话的美好愿望,
取cookie函数加代码 string.replace(ck,"[^;]+\s*\=\s*deleted\s*;","") 予以修正。 

aardio v14.41 更新(2017/12/12):
---------------------------------------------------------------------------

1、改进 web.joinHeaders() 避免对UrlEnocde过的值重复做UrlEnocde编码。
2、修正 console.writeText() 对未转换为字符串的值做UTF8编码检测导致报错。


aardio v14.40 更新(2017/12/12):
---------------------------------------------------------------------------
1、 time.gmt() time.iso8601() 如果传入参数是包含本地时间的time对象,返回补偿时差后的标准时间。

2、 fastcgi.client,wsock.tcp.simpleHttpServer 等输出时间统一改为调用 time.gmt()

3、 inet.http, inet.whttp 分别增加 disableCookies() 函数,用于禁止cookie自动管理

4、 inet.setCookie() 改进可以更方便的设置持久化cookie、会话cookie


aardio v14.38 更新(2017/12/12):
---------------------------------------------------------------------------
1、 修正 console.log() 输出ANSI字符串乱码问题。


aardio v14.37 更新(2017/12/10):
---------------------------------------------------------------------------
1、 fsys.codepage 改进编码识别功能。
2、 web.mshtml 改进编码识别功能。

aardio v14.36 更新(2017/12/09):
---------------------------------------------------------------------------
1、 web.socket.client 关闭事件增加发送、接收退出代码的功能


aardio v14.35 更新(2017/12/09):
---------------------------------------------------------------------------
1、修正 string.unescape() 的一处可能导致内存错误的BUG,感谢carl反馈该问题。
这个BUG会影响到所有直接或间接调用了这个函数的库,建议尽快更新以修复问题。

aardio v14.34 更新(2017/12/07):
---------------------------------------------------------------------------

1、 wsock.tcp.client 的readTo()函数,
如果服务端输出内容后,未输出结束标记而是立即关闭连接,
这时候返回接收的字符串,以及错误信息。
    之前版本是丢弃接收的数据,这个在有些时候是不合适的。
    
    
扩展库更新 更新(2017/12/07):
---------------------------------------------------------------------------

今天狠狠的改进了下 nanomsg 扩展库,
详细的写了函数文档( 工具-> 库函数文档 里打开)

此扩展库的名字改为 nnmsg,
因为是改名,所以不影响原来的库继续使用,
之所以改名,是因为每次我按namespace的时候他都跳出来。

增加了nnmsg范例,在扩展库管理器中双击下载,
等一会我会在论坛发一个 nnmsg扩展库 的教程。


aardio v14.33 更新(2017/12/05):
---------------------------------------------------------------------------
1、改动了一下 file.seek() 放宽了指针位数的限制,
已经支持PB级了,所以肯定够用了。

aardio v14.31 更新(2017/12/05):
---------------------------------------------------------------------------
1、修正treeview范例错误,感谢 xauto反馈


扩展库(2017/12/05):
---------------------------------------------------------------------------
1、更新web.blink(miniblink)扩展库,修正一些BUG,增加一些回调,
所有回调函数分离到 web.blink.callback模块,重新编写了范例(扩展库管理器中双击下载),
感谢 znkee提供的部分代码。http://bbs.aardio.com/forum.php?mod=viewthread&tid=21980


aardio v14.30 更新(2017/12/05):
---------------------------------------------------------------------------
1、修正inet.url.split函数解析URL返回结果不正确



aardio v14.29 更新(2017/12/04):
---------------------------------------------------------------------------
1、小改进 web.socket.chrome 范例,
在连接chrome以前,先禁用发送数据的按钮,避免误操作。

增加判断pages是否为空的代码。

aardio v14.28 更新(2017/12/04):
---------------------------------------------------------------------------
1、在 web.socket.client 基础上进一步封装并增加了两个库
web.socket.jsonClient, web.socket.chrome

web.socket.chrome 可用于Chrome远程调试接口控制Chrome浏览器,
参考新增范例:aardio范例->模拟自动化->Chrome远程调试接口

关于Chrome远程调试接口:
https://chromedevtools.github.io/devtools-protocol/


aardio v14.27 更新(2017/12/03):
---------------------------------------------------------------------------
1、web.socket.client 增加关闭心跳设置、自定义心跳数据帧等功能


aardio v14.26 更新(2017/12/03):
---------------------------------------------------------------------------

今天写了一个WebSocket客户端支持库:web.socket.client
用过其他组件都觉得麻烦,干脆自己写了一个,这个库纯aardio代码实现,小、轻、快!

这个WebSocket客户端基于单线程异步套接字
只要监听事件就可以方便的收发数据,不卡界面,不需要用到多线程!一切都变得非常简单。
对于WebSocket客户端来说,去弄什么多线程只会把简单的事不必要的搞复杂。

支持双向心跳,单向心跳,可以断线重连,下面是一个简单的例子(可以在"aardio范例->网络应用->WebSocket"找到下面的代码):

import win.ui;
/*DSG{{*/
var winform = win.form(text="WebSocket客户端演示";right=770;bottom=467)
winform.add(
btnClose={cls="button";text="断开";left=556;top=293;right=710;bottom=331;db=1;dr=1;z=6};
btnOpen={cls="button";text="连接WebSocket服务端";left=381;top=293;right=535;bottom=331;db=1;dr=1;z=2};
btnSend={cls="button";text="发送数据";left=569;top=346;right=711;bottom=426;db=1;dr=1;z=4};
txtMessage={cls="edit";left=29;top=22;right=741;bottom=285;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1};
txtSend={cls="edit";text="WebSocket测试";left=29;top=348;right=558;bottom=423;db=1;dl=1;dr=1;edge=1;multiline=1;z=3};
txtUrl={cls="edit";text="ws://121.40.165.18:8088";left=29;top=295;right=368;bottom=331;db=1;dl=1;dr=1;edge=1;z=5}
)
/*}}*/

import web.socket.client;
var ws = web.socket.client();

ws.onOpen = function(){
	ws.send("服务端你好吗?!")
}

ws.onClose = function(){
	winform.txtMessage.print("onClose");
}

ws.onError = function(err){
	winform.txtMessage.print("onError",err);
}

ws.onMessage = function(msg){
    winform.txtMessage.print(msg.data); 
}


winform.btnSend.oncommand = function(id,event){
	ws.send(winform.txtSend.text)	
}

winform.btnOpen.oncommand = function(id,event){
	ws.connect(winform.txtUrl.text);
}

winform.btnClose.oncommand = function(id,event){
	ws.close();
}

winform.txtUrl.text = "ws://121.40.165.18:8088";
ws.originUrl = "http://www.blue-zero.com";

winform.show() 
win.loopMessage();


aardio v14.25 更新(2017/12/02):
---------------------------------------------------------------------------

1、添加table.shuffle() 函数,
这个函数原来是范例里的洗牌算法(乱序),看了下代码没几句决定加到标准库里。

2、web.mshtml 修正打开网址时未调用 document.close()导致 waitDoc卡住的问题。

3、继续改进文档


扩展库 更新(2017/12/01):
---------------------------------------------------------------------------
web.blink(miniblink) 支持完美调用JS对象,
因为miniblink本身无法调用dom函数,加了一个aardioCallObject函数来封装了一下。
基本所有的web.kit示例都能正常在miniblink上运行了。

例:

import win.ui;
/*DSG{{*/
var winform = win.form(text="Web Kit";right=848;bottom=585)
winform.add()
/*}}*/

import web.blink.form;
wbKitView = web.blink.form(winform)

wbKitView.go("http://www.so.com") 
winform.show();

wbKitView.wait();
wbKitView.querySelector("#input").value = "aardio webkit";
wbKitView.querySelector("#search-button").click();

wbKitView.wait(); 
winform.text = wbKitView.eval("document").location.href

win.loopMessage();

aardio v14.24 更新(2017/12/01):
---------------------------------------------------------------------------

1、string.xml 的queryEle(),queryEles()函数,
以及  web.form的queryEles(),waitQueryEles() 作以下改进:

当搜索tagName,id,name等属性时,如果搜索的属性值不含标点符号,
则仅使用忽略大小写的完全匹配方式进行比对,

如果属性值含有标点(使用了模式匹配),
仍然会使用原来的规则进行比对(模式匹配,以及部分匹配)
这个规则主要用于兼容旧的代码,实际上这几个属性用模式匹配只会添乱。

2、string.xml 增加 getEle() getEles() 函数,用法参考函数说明。


aardio v14.23 更新(2017/11/30):
---------------------------------------------------------------------------

1、更新文档


aardio v14.22 更新(2017/11/28):
---------------------------------------------------------------------------

1、winform.treeview 增加 checkAll() 函数,用于全选子节点(并更新父节点),
增加enumParent函数,增加expandAll()函数。演示:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=349;bottom=249)
winform.add(
treeview={cls="treeview";left=10;top=11;right=336;bottom=233;asel=false;bgcolor=16777215;chkBox=1;edge=1;z=1}
)
/*}}*/

var hitem = winform.treeview.insertItem( text="程序目录" );
var hSubItem = winform.treeview.insertItem( { text="子目录" },hitem/*父节点*/); 

var hitem = winform.treeview.insertItem( { 
    text = "下面用一个数组指定子节点"; { 
        {  text = "子节点1"  };
        {  text = "子节点2" };
        {  text = "下面用一个数组指定子节点"; {
            "a";"b";"c";{ text = "d" } 
           }
        };
    }
} ) 


//对目录树的选择操作
winform.treeview.onnotify = function(id,code,ptr){
    //用户勾选、取消勾选复选框
    if(code = 0xFFFFFFE8/*_NM_TVSTATEIMAGECHANGING*/){
         var hItem = winform.treeview.hitTest();
     
         //这里一定要取反,因为是选中状态更新以前触发这个事件
         var checked = !winform.treeview.getChecked(hItem);    
         winform.treeview.checkAll(hItem,checked);   
         winform.treeview.expandAll(hItem);      
    }
}



winform.show() 
win.loopMessage();



aardio v14.21 更新(2017/11/28):
---------------------------------------------------------------------------

1、......本版修改已被废弃


aardio v14.20 更新(2017/11/27):
---------------------------------------------------------------------------

1、com.flash改进,调用flash函数可以简化写法,
例如 flash.xcall("callMe",1,2) 可以直接写为 flash.callMe(1,2);


aardio v14.19 更新(2017/11/26):
---------------------------------------------------------------------------

1、添加 wsock.tcp.asynClient 可以使用更少的代码创建TCP异步客户端,例如:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=660;bottom=381)
winform.add(
edit={cls="edit";left=19;top=14;right=641;bottom=363;edge=1;multiline=1;z=1}
)
/*}}*/

import wsock.tcp.asynClient;
var tcpClient = wsock.tcp.asynClient(); 

var file = io.open("/test.zip","w+b");//注意io.open默认是文本方式写入的,b指定二进制模式
tcpClient.onReceive = function(err){
	var recvbuf = tcpClient.recv(0x100000);  //如果recv每次读取长度设的太小,会导致关闭事件可能在读取数据完成以前触发
	
	if( #recvbuf  ) {
		file.write( recvbuf );	
		winform.edit.log("已下载",math.size64( file.seek() ).format(),'\r\n')
	} 		
}

tcpClient.onClose = function(err){
	winform.edit.log("服务端已断开",err);
}

tcpClient.connect("127.0.0.1",7510) //因为是异步套接字,这里不需要检查返回值 

winform.show(); 
win.loopMessage();


aardio v14.18 更新(2017/11/26):
---------------------------------------------------------------------------

1、web.rest.client 修正无提交参数时,extraParameters设置无效的问题

2、fsys.localfile 移除对fsys相关函数的依赖,使用io库函数替代。

aardio v14.17 更新(2017/11/25):
---------------------------------------------------------------------------

1、web.rest.client 增加 addHeaders,referer等属性。
web.rest名字空间下其他基于web.rest.client的对象也都增加了这两个属性。
这几个属性原来也可以通过_http对象设置,改进后可以少打几个字。

2、inet.http,inet.whttp的post函数的post数据可以指定为一个表,
如果post数据是表会自动调用 inet.url.stringifyParameters 转化为字符串,
可使用 codepage属性指定转换时UrlEncode编码使用的输出代码页,默认使用UTF8编码。


aardio v14.16 更新(2017/11/23):
---------------------------------------------------------------------------

1、小改进[字符集/代码页 查询工具],可显示更多代码页。


aardio v14.15 更新(2017/11/23):
---------------------------------------------------------------------------

1、增加[字符集/代码页 查询工具]
   位置:aardio工具->文本文件->字符集/代码页
   
2、标准库增加 com.interface.IMultiLanguage2 接口
   [字符集/代码页 查询工具] 即使用此接口的示例,使用此接口可自动检测数据的编码。
   
   例如:
   
   import com.interface.IMultiLanguage2;
   var multiLanguage = com.interface.IMultiLanguage2.Create();
   var codepage = multiLanguage.detectInputCodepageEx("测试字符串");
   

aardio v14.14 更新(2017/11/22):
---------------------------------------------------------------------------

1、string.unescape()函数改进,允许传入的转义字符串包含单引号。

2、转义字符串的Unicode转义增加两种表示方法:
   2.1 大写的\U后可选使用4个或6个16进制字符表示Unicode编码,使用6个16进制字符可直接支持UCS-4的4字节Unicode编码,例如'\U02b81c'。
   2.2 小写的\u因为考虑到兼容JSON必须使用4个16进制字符,但可以与JS一样使用2个字符编码表示一个4字节Unicode字符,例如:'\uDC1C\u4F60ff'

3、raw.str支持传入结构体参数,可用于方便的将WORD数组转换为Unicode字符串。

4、table.append() 改进:允许忽略null参数

5、增加 ustring.pack, ustring.unpack, ustring.charCodeAt 等函数


aardio v14.13 更新(2017/11/19):
---------------------------------------------------------------------------

增加 inet.stat 用于列出网络连接,
例如列出所有80端口的TCP连接,并按连接数排序:

import console; 
import inet.stat;

console.dump(inet.stat(80).tcp)
console.pause(true);

今天晚上被某个无聊的家伙CC攻击,于是写了这个库,
昨天灌了上万个垃圾帖子,今天又CC攻击,每天吃饱了干这事你的时间是多不值钱哦?!


附:调用IIS接口自动拉黑IP的代码:

import dotNet; 
var appDomain = dotNet.clr().createAppDomain();

var serverManager = appDomain.load("Microsoft.Web.Administration").createInstance("ServerManager");
var config = serverManager.GetApplicationHostConfiguration();
var ipSecuritySection = config.GetSection("system.webServer/security/ipSecurity","bbs.aardio.com");
var ipSecurityCollection = ipSecuritySection.GetCollection();

var addElement = ipSecurityCollection.CreateElement("add");
addElement.Item["ipAddress"] = "197.197.197.197";
addElement.Item["subnetMask"] = "255.255.255.255";
addElement.Item["allowed"] = false;
ipSecurityCollection.Add(addElement); 
serverManager.CommitChanges();


aardio v14.12 更新(2017/11/15):
---------------------------------------------------------------------------

1、标准库新增 crypt.aes,用于实现AES加密算法,示例代码:

import console;  
import crypt.bin;
import crypt.aes;
 
var aes = crypt.aes();
aes.setPassword("12345678");

var str = aes.encrypt("Test String");
console.log( crypt.bin.encodeBase64( str ) );
console.pause(true);
 

2、增加以下函数

crypt.hmac.sha256();
crypt.hmac.sha384();
crypt.hmac.sha512();
crypt.sha256();
crypt.sha384();
crypt.sha512();

3、web.joinHeaders() 改进如果参数是键值对列表,自动对值中包含的宽字符(汉字)进行UrlEncode编码

4、修正 win.taskScheduler 任务延时间隔很小时导致任务不触发的BUG


aardio v14.11 更新(2017/11/14):
---------------------------------------------------------------------------

1、com.flash改进,创建控件时自动启用控件窗口的内部裁剪样式。

2、web.ui改进,避免拖动标题栏时双击事件失效。


扩展库更新(2017/11/14):
---------------------------------------------------------------------------

添加 libpq 扩展库,用于调用PostgreSQL数据库,示例:

import console;
import libpq;

//PostgreSQL 服务端: https://get.enterprisedb.com/postgresql/postgresql-10.0-1-windows-binaries.zip
var db =libpq(
    dbname = "postgres";
    port = 5432 ;
    user = "postgres";
    password = "密码";
)

var rs = db.exec(`SELECT 123,'{"a": "abc","b":false}'::json`);

for(a,b in rs.each() ){
    console.log(a,b);
}

var t = rs.getTable();
console.dumpJson(t);

console.pause();

aardio v14.10 更新(2017/11/12):
---------------------------------------------------------------------------

1、gdip.bitmap,gdip.image 增加 saveToBuffer()函数,用于直接保存图像到内存缓冲区。

2、增加数组去重函数 table.unique,返回新数组不修改原数组。

3、table.append改进拼接数组效率,连接有序数组(忽略其他键值对成员),返回参数1

4、动态指针支持使用raw.concat函数直接追加结构体,示例:

var p = raw.realloc(12);
p = raw.concat(p,{BYTE x[] = "abcd"})
p = raw.realloc(0,p);

使用动态指针实现的string.builder 则通过重载操作符可如下与结构体连接:

var p = string.builder()
p += {BYTE x[] = "abcd"}

5、raw.buffer的参数2允许使用指针类型,方便快速复制内存到缓冲区。

6、增加 raw.copy(目标指针,源数据,复制长度)
这个函数基本类似 ::CopyMemory,::Kernel32.RtlMoveMemory 区别是可以自动检测长度(除指针以外)

参数@1允许指针,buffer类型参数,
参数@2允许使用buffer,字符串,或结构体参数,
此函数不允许其他可自动转换为指针的非指针类型参数。

如果复制源或目标是buffer,字符串,或结构体等可获取内存长度的类型,
复制长度可以省略,如果未指定复制长度,并且源数据是buffer,或字符串时,
复制全部数据并且复制尾部隐藏的'\u0000'到目标内存。
 
如果aardio能获取复制源或目标的内存长度,
那么复制长度不会超过实际检测到的内存长度,
但如果参数是指针将无法自动检测到内存长度。

7、fsys.stream 添加 lockPointer,unlockPointer函数

8、修正plus控件实现滑块控件时拖动到左侧留有边距问题。

9、修正plus控件在显示后调用skin函数未及时刷新的问题。

aardio v14.09 更新(2017/11/10):
---------------------------------------------------------------------------

1、API尾标语法改进,对于已存在W尾标的API函数,
可在调用API时使用其他尾标,并且仍然可以正确检测并切换到API函数的Unicode版本

2、time对象改进,文本解析为时间支持省略分隔符,

	省略分隔符时aardio将自动检测数值的长度,并努力解析出正确的结果,
	
	例如以下时间可正确识别:
	time("20170822 123623") 年月日8位,时分秒6位
	time("170822 123623") 年月日6位,时分秒6位
	
	文本转换为时间,对于格式标记的%y,%Y改进为在解析年份时兼容2位,4位年份。
	文本转换为时间,改进为忽略星期字段的错误(并不影响正确的输出)
	
	在解析文本为时间时,对于最后一个匹配格式串成功之后的剩余字符串,
	aardio在跳过空白字符以后,将连续非空字符录入 endstr 属性(用于更准确的检测iso8601等格式的时区)
	
	根据以上特性改进time.gmt,time.iso8601,更强大的解析能力演示:
	
	//HTTP时间RFC 1123格式,格式写错的这么离谱仍然可以自动修正
	console.log(time.gmt("Sun,07Feb2016 081122 +7"))
	
	//兼容HTTP时间RFC 850格式,星期写错了自动修正
	console.log(time.gmt("Sunddddday, 07-Feb-16 08:11:22 +0700"))
	
	//支持iso8601省略分隔符的格式
	console.log(time.iso8601("20170822 123623 +0700"))
	
	//支持iso8601省略分隔符的格式
	console.log(time.iso8601("20170822 123623 +7"))
	
	//兼容iso8601省略分隔符的写法
	console.log(time("20170822 123623"))

3、math.size64添加swap函数用于转换大小端字节序


aardio v14.08 更新(2017/11/9):
---------------------------------------------------------------------------

1、inet.url.ecnode 等一系列UrlEncode编解码函数支持指定代码页(codepage),
旧版本仅简单的指定是否UTF8编码,目前可指定具体的codepage,但仍然兼容旧版的写法。

2、web.rest.clinet 以及基于该类的客户端组件支持更准确的识别charset并自动进行编码转换,
如果自行重写了stringifyRequestParameters等接口要注意原来指定utf8编码的参数已改为指定具体codepage,
因为对请求参数进行实际编解码的inet.url.stringifyParameters等函数已自动支持新的写法,所以可以自动兼容旧的写法。

对于web.rest.jsonClient因为使用JSON编码时已经转换为Unicode格式,所以提交请求数据时并不需要考虑编码相关的参数。

3、string.encoding代码优化,对于注册表获取的结果会进行缓存,避免重复查询编码。

4、其他BUG修正,参考BUG提交页


aardio v14.07 更新(2017/11/6):
---------------------------------------------------------------------------

1、改进 process.getPath() 支持获取64位进程路径


aardio v14.06 更新(2017/11/4):
---------------------------------------------------------------------------
1、库函数文档取消显示在IDE前面的设置,方便切换窗口。

2、fsys.mmap 改进以"r+b"模式打开已存在的文件,并支持传入fsys.file对象作为参数,
需要注意 fsys.mmap 主要用于进程间通信共享内存(例如 process.command ),不适合一般的文件读写,
文件读写应使用文件流对象。


扩展库 更新(2017/11/3):
---------------------------------------------------------------------------
1、更新 soImage库,修正getBytes函数报错等,感谢匿名反馈。
改进 capture() 函数可能导致的窗口卡住问题。

aardio v14.05 更新(2017/11/3):
---------------------------------------------------------------------------

1、改进了调试进程管理器,加上了多线程(以前这个工具是单线程的,有时候会有些卡)
调试的时候,也可以打开系统任务管理器看aardio.exe进程,一般占内存最大的那个是IDE

aardio v14.04 更新(2017/11/2):
---------------------------------------------------------------------------

标准库增加 win.ui.layered,可用于方便的创建分层透明窗口,
我们知道可以透明显示的分层窗口,是无法显示窗口上的控件子窗口的,
但是使用标准库提供的win.ui.layered,我们可以让分层窗口透明显示,并且还可以正常的显示窗口上的plus控件。

以下是一个简单的演示:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
plus={cls="plus";left=264;top=208;right=528;bottom=296;notify=1;repeat="center";z=1}
)
/*}}*/

import win.ui.layered;
win.ui.layered(winform);

import inet.http;
winform.plus.skin(
	background = { 
		default = inet.http().get("http://bbs.aardio.com/static/image/common/aardio.png");
		hover = 0xFF00FF33; 
	}
)

winform.plus.oncommand = function(id,event){
	winform.close();
}
 
winform.show() 
win.loopMessage();


扩展库更新(2017/11/2):
---------------------------------------------------------------------------

1、web.blink.form,web.kit.form 的打印函数 print() 
支持指定缩放比例,正数缩放文档,负数缩放页面,缩放会保持比例,并保持不超出页面

2、soImage更新支持自动修正常见图像格式错误的后缀名,
添加 soImage.gifFile 用于生成GIF格式图像(可用于录屏等操作),演示:

import console; 
import soImage;

console.open()
var gifFile = soImage.gifFile("/test.gif");

var img = soImage();  
for(i=1;20;1){ 
	img.capture(); //截屏
	gifFile.write(img ); //写入GIF文件
	console.log("已录制",gifFile.count() )
	sleep(10)
} 
 
gifFile.close(); 
console.pause();



扩展库更新(2017/11/1):
---------------------------------------------------------------------------

1、web.blink.form,web.kit.form 各增加一个用于GDI打印的print函数

2、修正调用 web.kit.view() web.blink.view()方式
调用组件自带默认控件窗口时,输入框不能输入任何字符的问题

3、修正 web.blink 鼠标指针始终是默认光标的问题。

aardio v14.03 更新(2017/10/31):
---------------------------------------------------------------------------
1、string.list支持在第三个参数设置引号(值包含行分隔符时使用引号生成字符串),这个比原来配置引号等设置的代码更简单一些。

2、math.size64 对象,支持与字符串做连接操作,不需要事先tostring()。

3、wsock.tcp.simpleHttpServer 狠狠的改进了一下,

支持使用threadGlobal属性添加服务线程可用的全局变量,这样就可以在网页服务端代码里调用窗体控件什么的了,很好玩的!

支持自定义onThreadCreated事件,可以用于只需要HTTP服务线程执行只需要执行一次的初始化代码。

支持自定义documentRoot属性设置网站所在目录,例如:


import console;
import wsock.tcp.simpleHttpServer;
var srvHttp = wsock.tcp.simpleHttpServer()
 
srvHttp.threadGlobal = {
	test = "value"; //可以指定HTTP监听线程可以使用的全局变量
}
srvHttp.onThreadCreated = function(documentRoot,urlRoot){

}
srvHttp.documentRoot = "d:\website\"

console.log(srvHttp.getUrl())
srvHttp.run( 
        function(response,request){ 
       
        }         
);
这里有一个用上面的功能实现的HTTP文件浏览器例子


扩展库更新(2017/10/31):
---------------------------------------------------------------------------
1、web.sciter 组件升级到最新版,修正 documentElement.outerHTML 赋值导致崩溃,并支持生成独立EXE文件。
2、web.blink 移除 web.blink.fileSystem(不稳定,会导致崩溃)
3、修正py,py2扩展库eval函数报错。


aardio v14.02 更新
---------------------------------------------------------------------------
1、增加库 fsys.fileInfo 用于获取文件唯一ID,更可靠的校验文件路径是否指向同一文件。

2、改进 gdip.bitmap 支持传入 buffer类型参数直接创建图像(可以减少一次不必要的tostring转换)。

3、修正 process.temp 一处严重 BUG, 建议使用了这个库的程序尽快升级,感谢siam193反馈。

4、其他 BUG 修正,参考BUG反馈页面。

aardio v14.01 更新
---------------------------------------------------------------------------
1、增加 string.html.ncr(), string.xml.ncr() 函数,用于转换HTML NCR/HTML Entities编码

2、修正 xauto反馈的几处笔误,感谢 xauto 

3、修正 一个控件被设置为另一个控件的子窗口(用于重叠)时,控件的自动锁定右边距失效的问题,感谢 popdes 反馈

4、修正plus控件在不同状态下分别指定背景色,图像(不是都用图像)时会出现切换图像不变的问题,感谢“匿名”反馈

5、修正v14 库目录下包含失效的软链接出错,感谢 lacker 反馈

6、窗口控件设计属性增加width,heigth选项(控件属性->大小->width,height)

v14 更新
---------------------------------------------------------------------------
不声明直接调用API函数时新增一系列API尾标语法,
即API函数名最后一个字符不是大写字符,就可以使用在后面添加一个大写的特定字符声明一个调用设置。
目前支持的语法如下:

dll.ApiNameW() 强制切换到Unicode版本(负责UTF8-UTF16自动转换)
dll.ApiNameA() 强制切换到ANSI版本(不负责ANSI编码自动转换)
dll.ApiNameL() 使返回值为64位LONG类型
dll.ApiNameP() 使返回值为指针类型
dll.ApiNameD() 使返回值为64位double类型浮点数
dll.ApiNameF() 使返回值为32位float类型浮点数
dll.ApiNameB() 使返回值为8位字节型,兼容C++中的bool类型

注意,不使用后缀声明语法时,默认返回值为int 32位整数。
在API函数名后添加声明后缀,不会影响到自DLL查找API函数的结果,无论真实的API带不带该声明后缀 - aardio都能找到。
详细的说明请查看帮助文档:http://bbs.aardio.com/doc/reference/libraries/kernel/raw/callapi.html

dll.api() 新增一种用法,在仅指定一个参数时,直接返回导出符号指针而非返回函数。

允许DLL对象在API参数中直接转换为句柄,而不需要调取函数获取句柄,以前限制了这个操作是为了避免误把DLL传到错误的API里去使用,不过现在看来这个限制没什么必要,还会导致多写一些不必要的代码。

禁止aardio检测结构体声明时触发元方法 @._get("_struct"),这个操作非常频繁而且毫无必要并且一不小心就会踩到坑里,而且一般人很难想到错误的原因,新版已经把这个坑人的功能去掉了。

窗体设计器中拖放控件不再默认设为上一个控件的大小,本来这是为了方便连续创建相同大小的控件,但实际上这个功能多此一举,而且致使拖放控件时不好控制,新版已去掉这个坑人功能。

本版完全重写了py2(python2.x),py(python3.x)的扩展库,增强了与python互动的能力,
并在aardio v14中增加了很多与python交互的范例,以及添加了大量python,aardio语法对比的文档和例子。
下面附上一个在aardio中实现python模块,并且可以在python中import导入该模块并调用成员函数的示例(使用python3)

import console;
import py;
/*
导出一个名字为"aardio"的模块,
在python中可以使用 import aardio导入。

可以使用此方法导出任何其他的aardio表,Python中可以访问导出表中的成员函数,
除函数以外的成员不导出,但是可以在被调用函数中用owner对象访问自身的其他成员变量。
*/

py.export.aardio ={
    
    c = 456;
    test = 
function(a,b){
        ..console.log(
"aardio函数被python调用了");
        
return a + b + owner.c;
    } 

}

var pyCode = /**
import aardio
def testPy():
    return aardio.test(12,2)
**/


py.exec( pyCode )
console.log( py.main.testPy() );

console.pause()