前言

PowerBuilder作为开发工具退出一线行列已经很久了,在2019年来谈这样一款老旧的编程工具是否有意义?诚然,PB有着太多硬伤,但还是有它的用武之地的。而且今天讲的这个“新思维”大部分内容是我在其它地方没有见过的,包含一些比较新的思想,但愿能够给各位读者带来耳目一新的感觉和有价值的参考。

由于内容比较多,打算合起来作为一个库,名字叫PowerPlume,中文为“孔雀翎”,古龙书中强大又美丽的武器。

PowerBuilder编程新思维1:扩展(Lua)

PB环境是封闭的,导致有些部分的能力极弱,依赖开发各类DLL和扩展(PBNI)。把脚本语言引擎引入到PB中,有着很多的现实意义,最大的好处就是能够直接利用脚本语言的各类资源与源码,不用再重复开发。

常见的脚本语言有JS、Python、Ruby等,为什么选择Lua?因为小、因为快。JS由于历史原因,太庞大了。Python和Ruby也不是很小巧。而且环境配置复杂。Lua小巧,接口也很友好,资源也丰富。

接口方面,选择PBNI而不是直接使用DLL,是因为需要处理一些指针和支持PowerObject,总体与LuaApi基本一致。

global type n_lua from nonvisualobject native "pblua105.dll"
public function long register(string name, powerobject obj)
public function long setglobal(string name)
public function long getglobal(string name)
public function long setfield(long idx, string key)
public function long getfield(long idx, string key)
public function long pushnil()
public function long pushboolean(boolean value)
public function long pushlong(long value)
public function long pushdouble(double value)
public function long pushstring(string value)
public function long pushpowerobject(powerobject value)
public function long toboolean(long idx, ref boolean value)
public function long tolong(long idx, ref long value)
public function long todouble(long idx, ref double value)
public function long tostring(long idx, ref string value)
public function long topowerobject(long idx, ref powerobject value)
public function boolean isboolean(long idx)
public function boolean islong(long idx)
public function boolean isdouble(long idx)
public function boolean isstring(long idx)
public function boolean ispowerobject(long idx)
public function boolean isnil(long idx)
public function boolean istable(long idx)
public function long spop(long n)
public function long scopy(long idx)
public function long sinsert(long idx)
public function long sremove(long idx)
public function long sreplace(long idx)
public function long sgettop()
public function long createtable(long arr, long rec)
public function long settable(long idx)
public function long gettable(long idx)
public function long setmetatable(long idx)
public function long nextkey(long idx)
public function long docall(long args, long results)
public function long dofile(string path)
public function long dostring(string str)
public function long enablecall(boolean ui)
end type

最先实现的功能是在Lua中很简单,PB却无法提供的功能——HashTable。

实例:function integer of_map_set (string as_table, string as_key, powerobject an_value)

在Lua接口基础上,添加了pushpowerobject这个接口,以处理PB对象。

int ret
ret = api.getglobal(as_table)
if (ret = LUA_TNIL) then
api.createtable(, );
elseif (ret <> LUA_TTABLE) then
return FAILURE
end if api.pushstring(as_key)
api.pushpowerobject(an_value)
api.settable(-); if (ret = LUA_TNIL) then
api.setglobal(as_table)
end if return SUCCESS

其次,必须利用Lua中比较成熟的资源,可以在https://luarocks.org/上查找下载数较多的模块,放入lib\lua目录下即可require。需要注意的是我们使用的是最新的Lua53,有些库可能不兼容。在源码中已经放入socket(http,ftp,stmp),xml,json库。后续会陆续补上相关的封装接口。

实例:使用cjson模块解析json

 string res

 i_lua.api.dostring("return require('cjson')")
i_lua.api.pushstring('decode')
i_lua.api.gettable(-) if (not i_lua.api.isfunction(-)) then
messagebox("","error")
end if i_lua.api.pushstring(mle_json.text)
i_lua.api.docall(,) i_lua.api.pushstring("sites")
i_lua.api.gettable(-) string key,val
integer idx
idx = i_lua.api.sgettop() i_lua.api.pushnil()
do while i_lua.api.nextkey(idx)<>
i_lua.api.pushstring("name")
i_lua.api.gettable(-)
i_lua.api.tostring(-, val)
i_lua.api.spop()
tv_1.InsertItemFirst(,val,)
loop i_lua.api.spop()

另外,在构建PowerPlume这个库的时候,整体架构在Lua这个模块之上,主要是利用其HashTable这个功能。

效果及源码

源码: PowerPlumeDemoV0.1.1.rar

提供了PB10.5 PB11.5 PB12.5三个版本

<本节完>

最新文章

  1. 在v-for中利用index来对第一项添加class(vue2.0)
  2. PHP中的错误处理、异常处理机制详解
  3. Eclipse 官方简体中文语言包下载地址及安装方法
  4. Swift实战-QQ在线音乐(第二版)
  5. [原]Links
  6. pthread 简要使用指南
  7. 判断程序是否在VMWare内运行
  8. Apache conf文件配置个人总结
  9. 微信开源PHP商城系统一处blind xxe(无需登录,附POC)
  10. 将Win7系统将默认打开的库改为计算机
  11. ubuntu+mono+PetaPoco+Oracle+.net 程序部署
  12. python辅助开发模块(非官方)如pil,mysqldb,openpyxl,xlrd,xlwd
  13. 通俗易懂的vuex-demo
  14. 脚本自动封掉并发数过高的 IP
  15. 完全二叉树的节点个数 Count Complete Tree Nodes
  16. 在myeclipse上发布自己的webservice
  17. HTML5 filesystem: 网址
  18. &lt;转&gt;Boost库之asio io_service以及run、run_one、poll、poll_one区别
  19. iOS - 截屏,view截图的基本方法
  20. AzureStack混合云大数据解决方案

热门文章

  1. [mysqli_escape]mysql转义两次
  2. ubuntu16.04 LTS把下载源改为阿里云的源
  3. Swagger ui测试中的验证 apikey
  4. redis-master/slave模式
  5. 索引视图DEMO2
  6. ModelValidator基于元数据的验证
  7. Fiddler工具使用介绍二
  8. Android开发 - 获取Android设备的唯一标识码(Android 6.0或更高)
  9. Code Chef December Challenge 2018题解
  10. VS2013 生成事件,删除不必要的DLL