pb12.5 如何实现动态窗口
已知 运行环境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') 函数能否直接将 窗口直接在应用中搜索. 这个可行吗?