请问如何动态建立数据窗口对象?

wallis 2003-10-27 04:50:47
请问如何动态建立数据窗口对象?
我想使该对象就象使用dw画板建立的数据窗口对象一样的使用。
比如说可以和任何一个dw control关联,如
dw_name.dataobject=stringname

除了使用dw_name.create()函数
...全文
73 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
klbt 2003-11-10
  • 打赏
  • 举报
回复
但此时再使用LIBRARYIMPORT函数将失败,因为此时w_wallis.pbl是只读的。
---------------------------------------------------------------------
你可以用编译PBD文件,然后倒入到PBD文件中,我用过这种方法,没有问题。
wallis 2003-11-10
  • 打赏
  • 举报
回复
今天进来看一下,本以为没什么希望
多谢 liulee(流方) ,你的思路太好了,我先试一下
mittee 2003-11-06
  • 打赏
  • 举报
回复
给你一个函数,是我在csdn上找到的,

///////////////////////////////////////////////////////////
//函数名:of_createextenddw() //
// //
//in parameters:datawindow dw //
// string cols[] //
// //
//usage: //
// 动态生成一个数据窗口。 //
// //
//author:mittee gets from csdn.net //
//time :2003/8 //
///////////////////////////////////////////////////////////


string sql_dw_general, sql_dw_columns_type, sql_dw_headers_conf, sql_dw_columns_conf, ls_errors
int i
long ll_colcount
string ls_colnametype
string ls_colname,ls_coltype
long ll_pos

ll_colcount = upperbound(cols)

//generals
sql_dw_general = "release 8;" &
+ "datawindow(units=0 timer_interval=0 color=16777215 processing=0 print.documentname=" + char(34) + "" + char(34) + " print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.prompt=no print.buttons=no print.preview.buttons=no ) ~n" &
+ "header(height=72 color=" + char(34) + "536870912" + char(34) + " ) ~n" &
+ "summary(height=0 color=" + char(34) + "536870912" + char(34) + " ) ~n" &
+ "footer(height=0 color=" + char(34) + "536870912" + char(34) + " ) ~n" &
+ "detail(height=84 color=" + char(34) + "536870912" + char(34) + " ) ~n"


//列及类型
sql_dw_columns_type = "table( ~n"
FOR I=1 to ll_colcount
ls_colnametype = trim(cols[i])
ls_colname = right(ls_colnametype,len(ls_colnametype) - 1)
ls_coltype = left(ls_colnametype,1)
choose case upper(ls_coltype)
case 'C'
ls_coltype = 'char(30)'
case 'D'
ls_coltype = 'datetime'
case 'N'
ls_coltype = 'decimal(13)'
case else
ls_coltype = 'char(30)'
end choose
//ls_coltype = 'char(100)'
//列及类型
sql_dw_columns_type= sql_dw_columns_type + "column=(type=" +ls_coltype+" updatewhereclause=yes name=" + ls_colname + " dbname=" + char(34) + ls_colname + char(34) + " ) ~n"

//列标题
sql_dw_headers_conf = sql_dw_headers_conf + "text(band=header alignment=" + char(34) + "2" + char(34) + " text=" + char(34) + ls_colname + char(34) + " border=" + char(34) + "6" + char(34) + " color=" + char(34) + "16711680" + char(34) + " x=" + char(34) + string( ((i - 1) * 588) + 5) + char(34) + " y=" + char(34) + "4" + char(34) + " height=" + char(34) + "64" + char(34) + " width=" + char(34) + "574" + char(34) + " name=" + ls_colname + "_t font.face=" + char(34) + "Arial" + char(34) + " font.height=" + char(34) + "-10" + char(34) + " font.weight=" + char(34) + "400" + char(34) + " font.family=" + char(34) + "2" + char(34) + " font.pitch=" + char(34) + "2" + char(34) + " font.charset=" + char(34) + "0" + char(34) + " background.mode=" + char(34) + "2" + char(34) + " background.color=" + char(34) + "12632256" + char(34) + " ) ~n"

//列属性
sql_dw_columns_conf = sql_dw_columns_conf + "column(band=detail id=" + string(i) + " alignment=" + char(34) + "1" + char(34) + " tabsequence=" + string(i) + "0 border=" + char(34) + "2" + char(34) + " color=" + char(34) + "0" + char(34) + " x=" + char(34) + string( ((i - 1) * 588) + 5) + char(34) + " y=" + char(34) + "4" + char(34) + " height=" + char(34) + "76" + char(34) + " width=" + char(34) + "579" + char(34) + " format=" + char(34) + "[general]" + char(34) + " name=" + ls_colname + " edit.limit=0 edit.case=any edit.autoselect=yes edit.autohscroll=yes font.face=" + char(34) + "Arial" + char(34) + " font.height=" + char(34) + "-10" + char(34) + " font.weight=" + char(34) + "400" + char(34) + " font.family=" + char(34) + "2" + char(34) + " font.pitch=" + char(34) + "2" + char(34) + " font.charset=" + char(34) + "0" + char(34) + " background.mode=" + char(34) + "1" + char(34) + " background.color=" + char(34) + "536870912" + char(34) + " ) ~n"

NEXT

sql_dw_columns_type= sql_dw_columns_type + " ) ~n"

sql_dw_columns_conf = sql_dw_columns_conf + "htmltable(border=" + char(34) + "1" + char(34) + " cellpadding=" + char(34) + "0" + char(34) + " cellspacing=" + char(34) + "0" + char(34) + " generatecss=" + char(34) + "no" + char(34) + " nowrap=" + char(34) + "yes" + char(34) + ")"

//MESSAGEBOX('',sql_dw_general + sql_dw_columns_type + sql_dw_headers_conf + sql_dw_columns_conf)
dw.Create(sql_dw_general + sql_dw_columns_type + sql_dw_headers_conf + sql_dw_columns_conf , ls_errors)

return(ls_errors)
dingzhaofeng 2003-11-06
  • 打赏
  • 举报
回复
太夸张了
liulee 2003-11-06
  • 打赏
  • 举报
回复
今天过来看看,好久没来了。

可否考虑如下方法:
create照用,然后dddw用Sharedata的方法处理掉。毕竟你要处理 dddw中的display,data列的,

如果纯粹作成动态的dddw目的,则可以考虑初始指定为空的dddw,运行时修改各种属性,数据用共享,子数据窗用创建试试。

好久没用了,有些生疏。
wallis 2003-10-29
  • 打赏
  • 举报
回复
可我要的是动态改变数据子窗口的内容,而不是动态改变数据窗口空件的数据窗口对象
wallis 2003-10-28
  • 打赏
  • 举报
回复
这个方法我以前用过,不过效果不好,不知有没有其它方法
wantsong 2003-10-28
  • 打赏
  • 举报
回复
唉,说了前句忘后句
eg: export出来后,存在文件里(加密),用到的时候从文件取出
wantsong 2003-10-28
  • 打赏
  • 举报
回复
Export出来的ls_dw可以作为模板
wantsong 2003-10-28
  • 打赏
  • 举报
回复
先将dw LibraryExport出来,用string ls_dw接着
然后(修改)ls_dw
li_create = DW_1.Create(ls_dw,ls_error)
再DW_1.modify.....
wallis 2003-10-28
  • 打赏
  • 举报
回复
回复人: klbt(快乐白兔) ( ) 信誉:101 2003-10-27 19:41:00 得分:0


用函数:LibraryImport("A.pbl", "dw_abc", ImportDataWindow!, dwsyntax, ErrorBuffer)可以实现
===========================================================================

LIBRARYIMPORT("w_wallis.pbl",S_DW_NAME,IMPORTDATAWINDOW!,s_dssyntax,s_errors)
DW_1.modify("s_value.EDIT.STYLE='dddw'")
DW_1.modify("s_value.dddw.NAME='"+S_DW_NAME+"'")
DW_1.modify("s_value.dddw.datacolumn='"+s_field_name+"'")

但此时再使用LIBRARYIMPORT函数将失败,因为此时w_wallis.pbl是只读的。

请问各位有何解决办法?
klbt 2003-10-27
  • 打赏
  • 举报
回复
用函数:LibraryImport("A.pbl", "dw_abc", ImportDataWindow!, dwsyntax, ErrorBuffer)可以实现
wallis 2003-10-27
  • 打赏
  • 举报
回复
datawindow对象是在程序设计时通过datawindow面板设计的,我想在程序运行时生成dw对象
这样我就可以动态的使用该对象,例如:
有一个列是下拉数据子窗口类型,那我就可以:
dw_name.modify("columnname.dddw.NAME='"+动态生成的数据窗口对象名+"'")

注:动态生成的数据窗口对象名---这个一般都在设计时就作好的,可我想在运行时通过代码生成。
double22822 2003-10-27
  • 打赏
  • 举报
回复
转载:
如何创建一个动态的数据窗口对象?

问:我想在程序运行中根据需要动态地建立一个数据窗口对象,该怎么做呢?
答:方法有四:

第一种方法:

在程序中用Describe()函数得到某个已经存在的数据窗口对象的源代码。如:

string str_dwsyntax,str_lag
//获得数据窗口1的语法
str_dwsyntax=dw_1.object.datawindow.syntax
//根据数据窗口1的语法动态生成数据窗口2的语法
dw_2.create(str_dwsyntax)
//对数据窗口2的内容作局部修改
str_lag="stu_id_t.font.height='-12' stu_id_t.font.face='楷体_GB2312'"
//字体变12号字体,由宋体改为楷体
dw_2.modify(str_lag)
dw_2.settransobject(sqlca)
dw_2.retrieve()

第二种方法:

在程序中使用系统函数LibraryExport()得到某个已经存在的数据窗口对象的源代码。

第三种方法:

在PowerBuilder开发环境的库管理画笔(Library Painter)中使用移出功能(右键→Export)将某个数据窗口对象的语法保存到文本文件中。

第四种方法:

1、设计窗口时在窗口上设置一个数据窗口控件,该控件用于展示动态创建的数据窗口。

2、构造一条SELECT语句。

3、利用事务对象的对象函数SyntaxFromSQL()生成符合数据窗口对象语法的字符串。

4、使用数据窗口控件的对象函数Create()创建数据窗口。

例子:string str_err_sql,str_err_create,str_sql,str_syntax

str_sql="select emp_id,emp_data,emp_name from employee where emp_salary>750"
//生成SELECT语句对应的自由风格的数据窗口语法
str_syntax=SQLCA.SyntaxFromSQL(str_sql,'style(type=Form)',str_err_sql)
if len(str_err_sql)>0 then
messagebox("错误","取得SQL语法时出错")
return
else
dw_1.create(str_syntax,str_err_create)
if len(str_err_create)>0 then
messagebox("错误","创建数据窗口时出错!")
return
end if
end if
dw_1.settransobject(sqlca)
dw_1.retrieve()

[注]SyntaxFromSQL()函数

说明: 根据SQL SELECT语句生成数据窗口对象的源代码,通常用于创建动态数据窗口对象。
语法: transaction.SyntaxFromSQL(sqlselect,presentation,err )。
返回值: string,成功时返回生成的指定风格数据窗口对象的源代码,错误时返回空字符串,err参数可说明原因。
参数 类型及说明
transaction 事务对象名。
sqlselect string,其值为一条有效的SQL SELECT语句。
presentation string,指定数据窗口缺省的表现风格。
完整语法 Style(Type=value property=value ……) //数据窗口风格
Type
Tabular 缺省值,列表风格
Grid 列表风格
Form 自由格式
Crosstab 交叉列表
Graph 统计图风格
Group 分组风格
Label 标签风格
Nested 复合风格
Ole 2.0 Ole风格
RichText 超文本风格
DataWindow(Property=value ……) //数据窗口本身的属性
Column(Property=value ……) //列对象属性
Group(groupby_colnum1 by_colnum2 …… property ……) //分组特性
Text(property=value ……) //文本对象属性
Title('titlestring') //数据窗口的标题
err string,当生成数据窗口源代码发生错误时,该参数用于保存出错信息。

[注]Create()函数

说明: 使用指定的源代码创建数据窗口对象,并用新的数据窗口对象来取代旧的,但新的不会自动成为应用库的一部份。
语法: dwcontrol.Create( syntax {,errorbuffer})
返回值: integer,成功为1,错误为-1。
参数 类型及说明
dwcontrol 数据窗口控件名。
syntax 数据窗口源代码,Create()函数将使用该代码来创建数据窗口对象。
errorbuffer 可选,保存创建时的出错信息,若省略则系统将使用消息对话框显示出错信息。
用法 数据窗口对象源代码语法相当复杂,因此手工从头构造该语法几乎是不可能的,但也不用泄气,Powersoft提供了几个办法构造数据窗口对象的源代码。
1 程序中使用数据窗口控件的Describe()函数得到某个已经存在的数据窗口对象的源代码,再据此修改。
2 程序中使用系统函数LibraryExport()得到某个已经存在的数据窗口对象的源代码,再据此修改。
3 在PowerBuilder开发环境的库管理画笔(Library Painter)中使用移出功能(Export)将某个数据窗口对象的语法保存到文本文件中,再据此修改。
4 程序中使用事务对象函数SyntaxFromSQL(),该函数根据SQL语句创建数据窗口对象的源代码,再据此修改。

 

→我是小木鱼(Lag)

写于2000年12月16日
wallis 2003-10-27
  • 打赏
  • 举报
回复
这个方法我不能把数据窗口对象单独分离出来使用
njjianguogu 2003-10-27
  • 打赏
  • 举报
回复
创建动态数据窗口对象,可以使用SyntaxFromSQL函数,然后再用describe和modify函数给数据窗口作处理
如:
string ERRORS, sql_syntax

string presentation_str, dwsyntax_str

sql_syntax = "SELECT emp_data.emp_id,"&
+ "emp_data.emp_name FROM emp_data "&
+ "WHERE emp_data.emp_salary > 45000"

presentation_str = "style(type=grid)"

dwsyntax_str = SQLCA.SyntaxFromSQL(sql_syntax, &
presentation_str, ERRORS)

IF Len(ERRORS) > 0 THEN
MessageBox("Caution", &
"SyntaxFromSQL caused these errors: " + ERRORS)
RETURN

END IF

dw_1.Create( dwsyntax_str, ERRORS)

IF Len(ERRORS) > 0 THEN
MessageBox("Caution", &
"Create cause these errors: " + ERRORS)
RETURN

END IF

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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