前言

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三个版本

<本节完>

PowerBuilder编程新思维1:扩展(Lua)的更多相关文章

  1. PowerBuilder编程新思维2:嵌入(Thread多线程)

    PowerBuilder编程新思维2:嵌入(Thread多线程) 在PB中使用多线程,在网上有大量的文章介绍.不过深入研究并试着给出更易用的模型的,目前还只有"路人甲cw"的一篇& ...

  2. PowerBuilder编程新思维5:包装(界面美化与WebUI+React)

    PowerBuilder编程新思维5:包装(界面美化与WebUI+React) 前一节,分析了三种界面美化方案,都是控件级的美化.今天再来分析一下窗口级的美化.上一次讲的DirectUI,大家反响一般 ...

  3. PowerBuilder编程新思维4:钩挂(界面美化与DirectUI)

    <第二部分 Outside> PowerBuilder编程新思维4:钩挂(界面美化与DirectUI) PB的界面由于其封闭性,一直以来都是最大的弱项.自PB9.0开放了PBNI接口后,开 ...

  4. PowerBuilder编程新思维3:适配(三层架构与GraphQL)

    PowerBuilder编程新思维3:适配(三层架构与GraphQL) PB在富客户端时代,是一线开发工具.随着网络发展,主流架构演进到三层架构的时代,PB拿不出有力的三层架构,已经明显力不从心,市场 ...

  5. C++编程新思维中的技巧

    1.编译器断言 技巧大致跟后面的一样,都是利用偏特化,但是在C++ 0X里面已经有static_assert,所以感觉这东西也没什么用处了,更多的只是开阔眼界 2.偏特化 就是专门对一个类型去进行特殊 ...

  6. (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示

    原文 (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows She ...

  7. 扩展 lua require 的行为

    扩展 lua require 的行为 来源 https://blog.codingnow.com/2015/10/lua_require_env.html 今天同事提了个需求,他希望可以给部分 lua ...

  8. 【响应式编程的思维艺术】 (2)响应式Vs面向对象

    目录 一. 划重点 二. 面向对象编程实例 2.1 动画的基本编程范式 2.2 参考代码 2.3 小结 三. 响应式编程实现 四. 差异对比 4.1 编程理念差异 4.2 编程体验差异 4.3 数学思 ...

  9. 《C++设计新思维》Command设计模式读后感

    原文内容提领: 本书第5章标题为泛化仿函数,我认为本章真正讲述的内容可以总结出一句话! 如何利用C++老标准实现C++11新标准类似std::function提供的功能. std::function简 ...

随机推荐

  1. ACE Editor在线代码编辑器简介及使用引导

    转自博客:https://www.cnblogs.com/cz-xjw/p/6476179.html ACE 是一个开源的.独立的.基于浏览器的代码编辑器,可以嵌入到任何web页面或JavaScrip ...

  2. Android-Java-引用数据类型参数传递内存图

    首先看一个案例: package android.java.oop04; class Person { public String name; public void showName() { Sys ...

  3. 第21件事 资源支持离不开RACI表

    十步法的第九步寻求资源支持.资源主要包括人力资源.物力资源和财力资源.人力资源,即需要多少人:物力资源,即需要多少软硬件设备:财力资源,即需要多少预算.根据产品或项目目标,资源估算时要考虑需要什么样的 ...

  4. 读取ViewBag匿名类

    关于遍历 viewBag匿名类错误 EF tt生成的类 明明有值眼睁睁看着 却不认识 public ActionResult Index() { MyTestEntities1 db = new My ...

  5. 阻止事件冒泡,阻止默认事件,event.stopPropagation()和event.preventDefault(),return false的区别

    1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向documen上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开, ...

  6. MariaDB 库的基本操作(2)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  7. IPv6 Can't assign requested address

    今天试了下 bind IPv6 的地址,报错  Can't assign requested address http://stackoverflow.com/questions/24780404/p ...

  8. DES/3DES/AES区别

    公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机,密码学在战争中起着非常重要的作用. DES 1977年1月,美国 ...

  9. nginx和tomcat访问图片和静态页面的配置方法

    生产环境下,有时候需要访问图片,正常需要应用ftp.nginx等配套使用,但是有时候为了简化,可以用以下的两种简单的访问,说实话,就是为了偷懒,但是效果是能有的,这就行了,所以今天做这个简化版的方便大 ...

  10. Swift 里 Array (一)内存结构

    public struct Array<Element>: _DestructorSafeContainer { #if _runtime(_ObjC) @usableFromInline ...