pb12.5 如何实现动态窗口

qq_30618845 2015-11-29 11:59:21
已知 运行环境AddToLibraryList('addrow.pbl') 可以将PBL添加应用搜索列表., 如果动态的话使用PBORC125.DLL API函数 compileentryimport ,但是12.5按照网上的自己测试不成功.SessionSetCurrentAppl函数-6 不知道几个意思.
如果有大侠能有亲自测试的例子可否提供下,在此谢谢了.
//====================================================================
// 事件: nvo_pbcompiler.of_createentry()
//--------------------------------------------------------------------
// 描述:根据动态代码创建实体
//--------------------------------------------------------------------
// 参数:
string as_object ='w_123' //对象名称
integer as_objecttype =7 //对象类别
string as_syntax // 对象语法
string as_libraryname // 返回库文件名
//--------------------------------------------------------------------
as_syntax = ue_ll()



// 返回: integer
// as_objecttype 的取值分类
// APPLICATION=0
// DATAWINDOW=1
// FUNCTION=2
// MENU=3
// QUERY=4
// STRUCTURE=5
// USEROBJECT=6
// WINDOW=7
// PIPELINE=8
// PROJECT=9
// PROXYOBJECT=10
// BINARY=11


Long ll_sid //会话编号
Long ll_index //对象序号
String ls_librarylist[] //库文件列表
String ls_librarylist_tmp[] //库文件列表(临时)
String ls_temp_libraryname //临时库文件名称
String ls_syntax //实体语法
String ls_app_libraryname //应用程序所在库文件名称
Integer li_result //结果
String ls_entryname //对象名称
ClassDefinition lcd_app //应用程序类定义对象
String ls_librarylist_files,ls_app_name //库文件
Integer i,j //临时变量

//开发环境下直接退出,因为开发环境下AddToLibraryList会出错
//If Handle(GetApplication()) <= 0 Then
// Return -1
//End If
//取库文件列表
ls_librarylist_files = getlibrarylist ()
//取应用对象所在pbl
lcd_app = GetApplication().ClassDefinition
ls_app_libraryname = lcd_app.LibraryName
//====================================================================


//取待创建的临时库文件名称
i = Second(Time(Now()))
Randomize(i)
i = Rand(99)*100+Rand(99)
Randomize(i)
j = Rand(9999)
For i = 1 To j
Rand(99)
Next
ls_temp_libraryname = gs_Path + "tmp\"+String(Rand(99),'00')+String(Rand(99),'00')+String(Rand(99),'00')+String(Rand(99),'00') + ".tmp"
Do While FileExists(ls_temp_libraryname) Or Pos(","+ls_librarylist_files+",",","+ls_temp_libraryname+",") > 0
ls_temp_libraryname = gs_Path + "tmp\"+String(Rand(99),'00')+String(Rand(99),'00')+String(Rand(99),'00')+String(Rand(99),'00') + ".tmp"
Loop
//创建临时库文件
LibraryCreate(ls_temp_libraryname,"临时库文件")
//of_parse(ls_librarylist_files,',',ls_librarylist) //分解字符串到数组
//判断库文件是否存在并形成新列表
j = 0
For i = 1 To UpperBound(ls_librarylist)
If FileExists(ls_librarylist[i]) Then
j ++
ls_librarylist_tmp[j] = ls_librarylist[i]
End If
Next
//取应用名称
ls_app_name=getapplication().appname
ls_librarylist = ls_librarylist_tmp
ls_librarylist[UpperBound(ls_librarylist)+1] = ls_temp_libraryname
ll_sid = SessionOpen() //打开一个会话
//设置当前会话的库清单
//li_result = SessionSetLibraryList (ll_sid, ls_librarylist, UpperBound(ls_librarylist))
li_result = _SessionSetLibraryList ( ll_sid,ls_librarylist, upperbound(ls_librarylist) )

If li_result = 0 Then
//设置当前会话对应的应用
li_result = SessionSetCurrentAppl (ll_sid, ls_temp_libraryname, ls_app_name )
messagebox('SessionSetCurrentAppl',li_result)
If li_result = 0 Then
ls_entryname = as_object
//导入并编译实体,7表示窗口,6表示用户对象,详细定义见构造事件
li_result = CompileEntryImport (ll_sid, ls_temp_libraryname, ls_entryname, as_objecttype , "comment - new pbl", as_syntax, 2*Len(as_syntax), 0, 0 )

If li_result <> 0 Then
MessageBox('提示信息','动态编译错误,错误码='+String(li_result))
End If
End If
End If
SessionClose(ll_sid) //关闭一个会话
as_libraryname = ls_temp_libraryname
If li_result = 0 Then
Return 1
Else
Return -1
End If


另外的思路是 使用 AddToLibraryList('w_123.srw') 函数能否直接将 窗口直接在应用中搜索. 这个可行吗?
...全文
1259 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_30618845 2016-01-14
  • 打赏
  • 举报
回复
嗯. 搞定了. .需要破解版. 而且文件im125_sysam.properties,pb125_sysam.properties,sysam.properties,但是问题又来了. 唉. .动态导入之后 第一打开代码会有变化, 而在此修改代码在导入, 在打开窗口代码没有变化. 而重启应用就可以.这个不知道为什么..我到底少了什么呢. 比如 系统自带的导入DW函数. 这个的话就可以改几次就效果的. 动态窗口类的就不行..我肯定是中间少了个什么函数
WorldMobile 2015-12-17
  • 打赏
  • 举报
回复
参考这篇文章看看 http://www.cnblogs.com/wallis0922/p/3513188.html
pcwe2002 2015-11-30
  • 打赏
  • 举报
回复
貌似这个需要正式版本的,找个正式版本的试试吧。

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧