前言

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. 雪花算法(snowflake)delphi版

    雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...

  2. unigui 设置单元格颜色

    procedure TF_Resource2.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,  ARow: Integer; Column: TUniD ...

  3. Android-Java单例模式

    今天我们来说说一个非常常用的模式,单例模式,单例模式让某个类中有自己的实例,而且只实例化一次,避免重复实例化,单例模式让某个类提供了全局唯一访问点,如果某个类被其他对象频繁使用,就可以考虑单例模式,以 ...

  4. UC浏览器 - 不负责任思考

    前言 UC浏览器的辉煌应该是我读大学(2008年)的时候,转眼间,十年过去了,庆幸的是UC还在,我从使用者变成了一名UC的员工. 以下都是个人的不负责任的猜想或者思考 变更 塞班时代 UC浏览器的地位 ...

  5. Asp.Net Core探索 之 appsettings.json

    appsettings.json是什么? 相信大家在.Net Framework的项目都会用的web.config,app.config这些文件,appsettings.json文件就是Asp.Net ...

  6. [leetcode.com]算法题目 - Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  7. 2018 Multi-University Training Contest 6

    A.oval-and-rectangle 题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6362 题意:在长半轴为a,短半轴为b的椭圆内部,以y=c( ...

  8. java中身份证号和的银行卡的深度校验

    一: 身份证号: package com.mobile.utils; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  9. Java按时间梯度实现异步回调接口

    1. 背景 在业务处理完之后,需要调用其他系统的接口,将相应的处理结果通知给对方,若是同步请求,假如调用的系统出现异常或是宕机等事件,会导致自身业务受到影响,事务会一直阻塞,数据库连接不够用等异常现象 ...

  10. CentOS 6(64-bit) + Nginx搭建静态文件服务器

    Nginx搭建静态文件服务器 使用命令打开Nginx配置文件: sudo vim /etc/nginx/conf.d/default.conf 将配置改为: server { ...... ..... ...