AAuto编程语言

  AAuto是专用于桌面软件快速开发的新一代混合型编程语言, 兼具动态、静态语言优势,语法更可兼容大部分流行语言,学习成本低,开发速度快,并永久免费。
 
  AAuto是一种动态语言,但是同时支持静态类型开发,下面的代码定义了一个结构体,在这个结构体中可以象静态语言一样使用静态类型,又可以象动态语言一样使用动态类型;
 

//定义类  
class POINT {  
    int x; int y; 
//静态类型    
    func = function(){  
        
//动态类型  
    }  
}

 
  这种全新的混合编程语言开创了一种全新的编程方式,AAuto拥有动态语言轻便、灵活、快速开发的特性,同时又可以象静态语言一样强大,直接支持原生DLL,方便的声明API函数,并且可以将AAuto的函数对象转换为C语言兼容的函数指针,即使是外部EXE进程中的函数,也可以使用一句代码声明为普通的AAuto函数对象( 原生call支持 )。
 
  AAuto虽然小,但是支持的接口很丰富,可支持标准DLL的 stdcall,cdecl,thiscall,fastcall,regparm(n)  等调用约定,可以支持C++导出的类对象,可以支持com静态动态双接口,象VBS一样原生支持com对象。
 
  AAuto还可以直接嵌入汇编机器码,C语言,Java,PHP,C#,Python,Javascript,VBScript......等等数量众多的第三方编程语言,方便的互调函数,并且这些调用第三方语言的功能模块都是使用AAuto实现,并且开放源码。混合型语言让我们可以体验到激动人心的全新编程方式。
 
  AAuto可以将硬盘目录,硬盘文件一键嵌入EXE文件,将全部程序包含所有资源生成独立的绿色EXE文件,所有文件读写的相关函数自动支持,无需更改代码,AAuto制作的程序不需要安装程序,也不需要释放DLL运行库,AAuto制作的程序都是免安装绿色软件。
 
  AAuto属于类C系语言、也可使用部份类Pascal语法,并且可以自定义一套自己的语法。AAuto在语法风格,函数命名上都保持了对流行语言的良好的兼容性、通用性。有其他语言基础的可以轻松上手,学习AAuto以后学习其他编程语言更可事半功倍。
 
  AAuto原生支持多线程开发,复杂的多线程开发在AAuto中变得非常简单,AAuto所有对象先天线程安全,自动解决所有并发问题,标准库提供大量简化多线程开发的辅助支持库。例如 thread.command 实现的线程命令订阅模式,为多线程软件开发带来很大的方便。
 
  AAuto的标准库基本使用纯AAuto源码实现,并且全部开源,标准库提供了大量的简化编程的常用函数,涉及到软件开发的方方面面,极大的简化了桌面软件开发过程。
 

软件界面快速开发

  AAuto提供web.form支持库( 开源 ),可以创建web窗体加载网页创建web风格的软件界面,网页与本机代码可以直接交互,在快手工程向导里,就提供了 WEB UI 的模板。在使用web窗体时,你能感受到AAuto这种混合语言带来的巨大方便,较之传统编程语言,AAuto 可以更快更加方便的创建 WEB UI 程序,在AAuto自带的范例中,就有一个多窗口浏览器的范例,仅仅使用了一页300行源码就实现了一个功能较完整的多窗口网页浏览器,可以看出使用AAuto极大的简化了Web相关开发技术。
 
  另外,AAuto提供了web.layout支持库,封装了轻量快速的界面引擎HTMLayout,可以使用传统的HTML,CSS技术,更加方便的实现漂亮的界面,而且运行,响应速度极快,官方也提供了大量HTMLayout的范例,教程。
 

  当然,使用AAuto开发传统界面也非常的方便,AAuto提供可视化开发工具,可以象VB一样(实际上比VB更简单)的通过拖拉控件创建程序。

要讨论这个问题,我们得先明白什么是网页节点。我们平时浏览网页的时候一般是不会注意网页节点的,因为网页节点这个概念是相对于网页源代码而言的。我们在网页页面上右键,选择查看源代码即可查看网页的源代码。

我们可以看到网页的源代码的格式与 xml 格式极为相似,也是由一个一个节点构成,具体节点的含义可以看一下百度百科的解释:
http://baike.baidu.com/view/47398.htm#2

我们要使用 web.form 库对网页进行操作,首先要取得想要操作的那个网页节点。若是第一步就出了问题,后续的操作就无法正常进行了。于是,怎样取得指定的网页节点成了一个至关重要的问题。在这里,我简单的列举一些常用的方式(以下的 wb 变量均为 web.form 的一个实例对象):

1、通过节点的 id 或者 name 一步取得

我们一定非常熟悉 wb.getEle 这个东西,因为获取元素我们一般都会调用这个方法。我们可以看一下它的函数原型:

 ele = wb.getEle( HTML节点的ID名name, 框架名 )

当提供 id 或 name 可以唯一确定一个节点的时候,我们只要提供网页节点的 id 或者 name 属性,即可获取该节点。

当网页中存在同 name 节点的时候,我们则可以用 wb.getEles 方法取得,我们可以看一下它的函数原型:

 tele = wb.getEles( HTML节点的name属性, 框架名 )

可能这个方法大家并不常用,wb.getEles 返回的是节点的集合。因为网页中节点的 id 属性是不可重复的,而 name 属性却是可重复的,因此当我们想要获取的节点有 name 属性的时候,就要考虑到网页中是否有其他节点与之 name 属性相同。wb.getEles 就可以获取所有指定 name 属性的节点。

举个例子,网页代码如下:

  1. <html> 

  2. <head> 

  3. ... 

  4. </head> 

  5. <body> 

  6. <input type="checkbox" name="hobbies" value="足球" /> 

  7. <input type="checkbox" name="hobbies" value="篮球" /> 

  8. <input type="checkbox" name="hobbies" value="排球" /> 

  9. </body> 

  10. </html> 


我们可以发现我们用 wb.getEle("hobbies") 的话,只能取到足球的 checkbox,而不能取到篮球或排球的节点。这时候,我们就可以使用 wb.getEles 来解决了,代码如下:

  1. var tele = wb.getEles("hobbies"); 

  2. var 足球, 篮球, 排球 = tele(0), tele(1), tele(2); 

  3. 排球.checked = true


上面一段代码就可以实现获取足球、篮球和排球三个节点了,这里要注意的是,wb.getEles 返回的是 com 数组,因此必须使用小括号来读取数组成员,而不是中括号,并且 com 数组的索引是从 0 开始的,而不是 1。

2、通过子节点取得父节点

这也是一个可以被接受的方式。往往我们要直接取得指定的节点十分困难,但是我们发现这个节点的某一个子节点很容易取得。这时候,我们就可以通过这个子节点来取得我们想要的父节点。

举个例子,网页代码如下:

  1. ... 

  2. <form action="..." method="post"> 

  3.     <input type="text" name="username" id="username" /> 

  4. </form> 

  5. ... 

假设我们要提交这个表单,你会使用什么方法取得表单节点?或许你会说:“这个表单没有 name,也没有 id,大概只能枚举法或者通过节点名取得。不过它里面有一个 input 节点挺好获取的。”

枚举法或者通过节点名取节点确实是一个办法,但是,当这个节点下某一个子节点非常好取的时候,我们不妨就通过这个子节点搭桥,代码如下:

  1. var childEle = wb.getEle("username"); // 我们取得了子节点 

  2. var ele = childEle.parentNode; // 子节点的 parentNode 即为我们要取的父节点 

这确实是一个好方法,但是你可能会说:“我根本不知道什么 parentNode 属性,帮助文档里好像也没有提及。”

但是你别忘了,我们还有智能提示,即使没有智能提示也还有 DOM 帮助手册,毕竟这是 IE 的东西,不管快手什么事,快手只需要调用 IE 提供的接口就可以了。因此还有许多智能提示以及帮助中没有提及的属性和方法,我们将会尽可能多的让大家了解。

那么,我考大家一个问题,若是网页代码如下,怎么获取表单节点呢?

  1. ... 

  2. <form action="..." method="post"> 

  3.     <div> 

  4.         <span> 

  5.             <input type="text" name="username" id="username" /> 

  6.         </span> 

  7.     </div> 

  8. </form> 

  9. ... 

你也许会说:“这还不简单?同上,childEle.parentNode.parentNode.parentNode...”

噢,这确实可行,但是当父节点层次非常多的时候,我们可以有简便的方法:

  1. var ele = childEle.form; 

childEle.form 可以直接获取 childEle 所在的表单节点。是不是感觉被骗了?呵呵。不,我上面讲的那么多并不是废话,因为有时候我们要获取父节点并不一定是一个表单,可能是其他类型的节点,这时候我们就不得不用 parentNode 了。

3、通过节点名取得节点集合

我们知道,凡是网页节点都有一个节点名。那么,我们能不能通过网页节点名来获取网页节点呢?答案当然是肯定的。

节点名类似于节点的 name 属性,是可以重复的,而且由于这些节点名是固定的,几乎没有哪一个网页节点名没有重复,因此取回的同样是节点的集合——一个 com 数组。

要通过节点名获取节点,可以使用 getElementsByTagName,同样通过一个例子说明问题,网页代码如下:

  1. ... 

  2. <img src="..." alt="确定" onclick="..." /> 

  3. <img src="..." alt="取消" onclick="..." /> 

  4. ... 

倘若整张网页只有这两个 img 节点,我们可以使用如下代码来获取这两个节点:

  1. var tele = wb.document.getElementsByTagName("img"); 

  2. var 确定, 取消 = tele(0), tele(1); 

  3. 取消.click(); 

在这里我就不多做解释,想必大家要是没有忘记上面的“通过 name 属性获取节点”的话,应该很容易能够理解。

至于第三行,我这里简单解释一下,我们看到网页代码中,两个 img 节点都有 onclick 属性,这个属性是指定该节点被单击时触发的脚本。

我们通过 取消.click() 可以触发这个脚本,也就相当于我们单击了取消按钮。

同样的,任何节点都有 getElementsByTagName 函数,我们可以结合上面的方法来获取指定的节点。

举个例子,网页代码如下:

  1. ... 

  2. <img alt="" /> 

  3. <!--前面有许多图片--> 

  4. <form action="..." method="post"> 

  5.     <input type="text" name="username" id="username" /> 

  6.     <img src="..." alt="确定" onclick="..." />  

  7.     <img src="..." alt="取消" onclick="..." />  

  8. </form> 

  9. ... 

我们要实现填完 username 之后,单击确定按钮,则可以使用如下代码:

  1. /* 

  2.   取的用户名节点,这里也可以使用 getEle 方法,但是 getEle 方法是 web.form 库的一个封装方法, 

  3.   该方法并不能在网页节点上使用。譬如 form 是一个表单元素,我们要获取一个在 form 下的有 id 的 

  4.   子元素,则只能使用 form.getElementById("ID"),而不能使用 form.getEle("ID")。 

  5.   而 form.getEle("Name") 则可以用 form.getElementsByName("Name")(0) 替代。具体可看库代码。 

  6.  */  

  7. var username = wb.document.getElementById("username"); 

  8. var form = username.form; 

  9. var img = form.getElementsByTagName("img")(0); // form 下第一个 img 的节点(确定),0 替换为 1 可取得第二个(取消) 

  10. img.click(); 

怎么样?是不是有些明白了?

4、枚举法 + 节点特点

当我们想要获取的节点没有 name,也没有 id。甚至用上面的任何方法都难以获取的时候该怎么办呢?当我们实在没有办法的时候,可以使用枚举法。但是有一点必须确定,这个节点应当是有特征的。

何为有特征?一般的节点都有自己的特点,比如说:在一个 form 中有一个 input 节点,其 type 属性为 "p_w_picpath",而且我们通过这两个线索可以唯一确定这个节点。我们就可以遍历表单中所有的 input 节点,然后再检查这些节点的 type 属性值。

同样举个例子,网页代码如下:

  1. <form id="frmLogin" action="..." method="post"> 

  2.     <input type="text" name="..." /> 

  3.     <input type="text" name="..." /> 

  4.     <input type="text" name="..." /> 

  5.      

  6.     <input type="p_w_picpath" onclick="..." /> 

  7. </form> 

没错,我们就要获取那个 type="p_w_picpath" 的 input 节点。还记得吗?我们可以通过 getElementsByTagName 取得所有 input 节点的。如果你还记得,那就跟我一起做:

  1. var form = wb.getEle("frmLogin"); // 先取得表单节点,这一步很方便 

  2. var inputs = form.getElementsByTagName("input"); // 看,这句就获取了所有的 input 节点了 

嗯,我们已经完成了大部分了,取得了表单下所有的 input 节点的集合,下面我们可以通过 com 库来遍历这些节点,当我们输入 com.each 的时候,快手会自动生成循环体基本代码,真是太方便了:

  1. var img; // 时刻准备被赋值 

  2. for index,obj in com.each(inputs) { 

  3.     // 现在 obj 就是每一个 input 节点了,有几个 input,就会循环几次 

  4.     if (string.lower(obj.type) == "p_w_picpath") { // 判断 obj 的 type 属性是否为 p_w_picpath,可以先转化为小写,写得严密一些 

  5.         // 很激动,现在 obj 就是我们要找的节点了,我们可以把它赋给 img 变量 

  6.         img = obj; 

  7.         break// 赶紧挑出循环,不要浪费系统资源和用户的时间 

  8.     } 

  9. if (img != null) { // 如果 img 不为空,即我们取到了这个节点 

  10.     // 后续操作,点它! 

  11.     img.click(); 

怎么样,是不是很方便呢?赶紧试试看吧。

以上就是我归纳总结的一些取节点的方法,希望对大家有所帮助。如果你是新手,我希望你不要收藏这个网址。我不希望你一碰到要取节点就回来复制、粘贴,不如现在按照上面的方法好好实践操作一下,这些代码如果你一行一行打上去,绝对是有深刻的印象的。况且快手有智能提示,函数名记个大概即可。