如何得到数据窗口中某一字段的动态高度??

aparan 2009-07-16 10:55:19
这个问题一直困扰好久了,字段选择的是autosize height , 我想取得运行时每行中此字段的动态高度,如果有知道的能不能指点下。
...全文
296 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhanghua_1228 2009-07-17
  • 打赏
  • 举报
回复
他要取的是某一列的高度,不是一行的高度,如果设了自动换行,在一行内那就有多个高度


这个还真没办法取的到,要不你用列宽去除这列字的高度算出折了几行,再去乘上一行的高度
sun1976 2009-07-17
  • 打赏
  • 举报
回复
你直接在其他控件的y属性写表达式就得了
aparan 2009-07-17
  • 打赏
  • 举报
回复
多谢。但你们所提的都是整行的高度,我所需要的是某个字段的高度, 因为我的FREE STYPE DATAWINDOW有好几个字段,我要取得第一个字段的高度(autosize height),依此决定下一行字段的位置来避免字段与字段重叠。
aparan 2009-07-17
  • 打赏
  • 举报
回复
我再对第二个字段与第三个字段用同一个Y坐标控制代码,if(len( t_exam_db_paper_title )>0, 120+ceiling(len( t_exam_db_question_type_description )/141)*60+30, 100)
结果仍然是第三个字段跑到第二个上面去了,字段都是在Detail band里面的。
有谁能解释下?

做梦的猫 2009-07-17
  • 打赏
  • 举报
回复
我建议一个方案,可不可行你自己试试...

自定义一个专门的 datastore 对象 lds_obj,用 dw_1.object.datawindow.syntax 取得目标数据窗口的语法,然后用 lds_obj.Create(ls_syntax, ls_errInfo) 创建出一个与 dw_1 一样的数据窗口对象,再用 dw_1.ShareData(lds_obj) 把数据传进去。

然后让 lds_obj 中除想获得高度的其它所有 dwo 不可见,再把这个唯一可见的 dwo 的 y 值设为 0,再强制使细节带刷新一遍,这样行高就与该 dwo 的高一致了。具体方法参考下面代码:

string ls_buf,ls_objName


// 隐藏所有对象
ls_buf = dw_1.Object.DataWindow.Objects
do
ls_objName = f_string_get_token(ls_buf, "~t")
if ls_objName <> "" then dw_1.Modify(ls_objName + ".Visible='0'")
loop while ls_buf <> ""

// 设置要计算的对象及细节带
dw_1.object.列名.y = 0
dw_1.object.列名.visible = true
dw_1.object.DataWindow.Detail.Height = 0
dw_1.object.DataWindow.Detail.Height.AutoSize = "yes"

messagebox('列名', dw_1.describe("Evaluate('RowHeight()', 1)"))


string f_string_get_token(ref string, string)
// 返回第一串字符,并把它从源字符串中删除
int p
string ret

p = Pos(source, separator) // Get the position of the separator

if p = 0 then // if no separator,
ret = source // return the whole source string and
source = "" // make the original source of zero length
else
ret = Mid(source, 1, p - 1) // otherwise, return just the token and
source = Right(source, Len(source) - p) // strip it & the separator
end if


return ret
xiaoyehua 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liubocy 的回复:]
建个计算域,计算公式为:rowheight()

动态高度则为该计算域的值
[/Quote]
试试看
aparan 2009-07-17
  • 打赏
  • 举报
回复
重贴 Y坐标代码:

第二个字段:if(len( t_exam_db_paper_title )>0, 120+ceiling(len( t_exam_db_question_type_description )/141)*60+30, 100)

第三个字段:if(len( t_exam_db_question_type_description )>0, 120+ceiling(len( t_exam_db_question_type_description )/141)*60+30 +ceiling(len(question_desc)/141)*60+30 , 100)

明明第三个字段的Y坐标值大于第二个字段的Y坐标,可是运行时第三个字段却跑到第二个字段上面去了!!

以上t_exam_db_paper_title /t_exam_db_question_type_description 运行长度都是大于0的。
aparan 2009-07-17
  • 打赏
  • 举报
回复
不好意思,刚看错了,第三个里面表达式有问题。copy的时候搞错了。
永生天地 2009-07-17
  • 打赏
  • 举报
回复
好像以前也问过,但是好像没有能解决的
aparan 2009-07-17
  • 打赏
  • 举报
回复
我试着控制Y坐标来避免字段重叠:

第二行字段坐标Y的表达式是:if(len( t_exam_db_paper_title)>0, 120+ceiling(len( t_exam_db_question_type_description )/141)*60+30, 100)

第三行字段 坐标Y的表达式是:if(len( t_exam_db_question_type_description )>0, if(len( t_exam_db_paper_title )>0, 120+ceiling(len( t_exam_db_question_type_description )/141)*60+30+ceiling(len(question_desc)/141)*60, 100), (ceiling(len( question_desc ) /141))*60+80)

明明第三个字段的Y坐标值大于第二个字段的Y坐标,可是运行时第三个字段却跑到第二个字段上面去了,
我晕死!!!



newease 2009-07-17
  • 打赏
  • 举报
回复
long ls_height

ls_height=long(dw_1.describe("evaluate('RowHeight()',行号)") )
liubocy 2009-07-17
  • 打赏
  • 举报
回复
建个计算域,计算公式为:rowheight()

动态高度则为该计算域的值
sun1976 2009-07-16
  • 打赏
  • 举报
回复
还真没试过,你试试describe("xxxx.height")能行吗?
我觉得可能不行,再试试数据窗口加计算列用describe取高度,然后通过evaluate得到这个计算列在某一行的值试试
如果也不行估计没办法了
-狙击手- 2009-07-16
  • 打赏
  • 举报
回复
<DW Control Name>.Object.<Columnname>.Height

1,072

社区成员

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

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