首先创建对话框应用程序,打开 main.aau,在【对话框】上添加一个按钮,如下图:
然后暂时望记这按钮,在工具箱点击鼠标指针,然后在【对话框设计器】中点击【窗体】,按钮控件周围的八个小方块不见了,这表示他失去焦点了。然后我们点击快手右侧【属性面板】,在里面修改边框属性为:resizable
把边框设置为resizable,那么窗体运行以后就可以用鼠标拖动边框调整大小了。
然后继续在【对话框设计器】上添加一个【文本框控件】,用鼠标拖动控件右下角的小方块调整到合适大小, 如下图:
别忘记了窗体是可调整大小的,我们希望【控钮控件】大小不变,总是显示在【窗体】的右下角,然后我们希望【文本框控件】大小是可变的,总是尽可能显示到最大,首先点击【文本框控件】,在属性面板中点击【固定边距】前面的加号展开所有选项:
然后设置左、右、上、下四个边距的属性为true,true就是真,false就是假,在编程中称为【逻辑值】或者【布尔值】再按上面的方法设置【按钮控件】固定下边距、固定右边距。然后在快手中点击【运行】测试一下效果,试试最大化运行显示的对话框。然后修改按钮控件的文本属性为“点我抓取”,如下图:
然后在【对话框设计器】中双击按钮控件,自动切换到代码视图。快手编辑器自动的添加了一个事件函数:
首先,我们删除上面的注释,双斜杠开始的行是注释语句,一般显示为绿色,注释语句在运行时会被忽略,这里的注释语句仅仅是演示用法,我们可以先删掉不必要注释(程序中不要包含不必要的注释是一个良好习惯),变成下面这样:
function关键字定义一个函数,函数将一小段代码包含在一对大括号里,构成了一个短小的子程序。
下次我们要调用这段子程序,只要输入函数名字加圆括号就可以,例如我们执行代码mainForm.button.oncommand() 也就是执行上面我们定义的函数。
不过 oncommand是个特殊的函数,一般不是我们自己调用,而是在用户点击按钮时,由窗体对象自动调用的函数 - 也就是回调函数。
例如你认识了一个新朋友,他会跟你说:“Hi,请把你的电话号码留给我,你不要打电话给我,我有需要会打给你的”,这就是回调的一种形式了,回调函数也一样,你定义好 mainForm.button.oncommand 这个函数,窗体会在有需要时自动调用你的oncommand函数。我们决定在用户点击按钮时修改文本框的内容,于是我们输入 mainForm.edit. 当输入圆点以后,快手编辑器自动列出了名字为edit的控件对象所有可用的成员属性、以及成员函数。如下图:
经验是个很好的东西,所有的控件用法类似,甚至在不同编程语言里 - 常用的属性名、函数名都是类似的,再加上快手编辑器提供的代码自动提示功能,我们一般能快速的找到需要的属性、或方法。
有的新手可能会说:“我是真正的小白,什么经验也没有,我还是想知道edit控件到底有哪些可用的属性,最好是中文的说明”,好吧,我告诉你怎么找到这些东西,所有的窗口控件,都是在标准库的 win.ui.ctrl 名字空间下定义的(别问我什么是名字空间,你不需要搞清楚,其实我也不清楚)。在标准库中找到 win.ui.ctrl.edit 然后双击鼠标左键打开库文件, 如下图:
完成我们所有的代码如下( 鼠标放到代码上,然后你能在代码右上角看到复制源码的工具条 ):
我们进一步修改上面的程序,我们希望点击按钮控件不仅仅只是显示 “hello world”,而是抓取一个网页的html源码,并显示在文本框中。
我们希望在标准库中有一个名字空间叫 myTools 包含了我们需要的函数,而我们希望 myTools 名字空间下有一个 myTools.getHtml() 函数用来抓取网页的HTML源码。
但是很遗憾,标准库里没有这些东西,当然,我们可以在工程的用户库里添加自定义的库。下面我们在工程用鼠标右键中点击【用户库】,弹出下图的菜单:
在弹出的【用户库】菜单中点击【新建库】,弹出【新建】对话框如下图:
直接输入新用户库的名字"myTools",点后点击【打开】按钮,一切很顺利,在【工程管理器】的【用户库】目录下多了库文件 myTools,并且在编辑器中自动打开了这个库,如下图:
用户库中添加了默认代码
namespace 定义一个新的名字空间,我们可以在名字空间中添加需要的函数 getHtml,修改用户库代码如下;
return 语句指定函数的返回值。继续修改上面的代码,将 return "返回值"; 改为返回网页源码。
因为我们需要抓取网页,需要用到标准库中的 inet.http 对象,我们使用 import inet.http; 导入这个库备用,修改代码如下:
点击快手【快捷工具栏】的【保存】按钮保存库文件。
切换到 main.aau ,修改按钮回调函数为如下代码:
我们发现一点小小的不足,myTools.getHtml()只是固定的抓取指定网址,这非常的不方便,我们再回到 myTools 用户库,将网址修改为可变的函数参数,修改后的 myTools库源码如下( 修改部份为粗体字 ):
函数多了一个网址参数,在调用时需要由调用者在参数中传入要抓取的网址,在 myTools用户库最后面,添加一小段智能提示配置代码,如下:
点击【保存】按钮保存库文件,然后在【工程管理器】中右键点击用户库,在弹出菜单中点击【刷新目录、智能提示】
我们回到 main.aau 文件,修改 mainForm.button.oncommand 事件回调函数如下:
我们还遇到一个问题,如果网速比较慢的话,抓取的时间会很长,在单线程的窗口程序中,如果线程被耗时的操作所阻塞,也就不能正常的处理用户消息,导致用户点击界面没有反应。
这时候就需要用到多线程了,使用 thread.create() 可以创建线程,我们还要用 thread.waitOne() 函数等待线程执行完成。
在窗口程序中,可以使用更简单的 win.invoke() 函数创建工作线程。
win.invoke() 会创建一个工作线程执行代码,并且等待线程结束,然后获取返回值。
我们修改 main.aau 中 mainForm.button.oncommand 函数代码如下:
看完上面的教程相信大家心中已经有一些操作方向了。
新闻热点
疑难解答
图片精选