纯字符和数字的换行问题,求解决方案。

distancehalf 2008-10-10 05:17:44
1. 以下换行设置只能对有空格或者有汉字的情况下才生效
〔不选auto horz scrool , 选中auto vert scrool , 设置detail区为autosize heigh〕
2. 如果是纯数字或者字符呢?比如:ABCDEFGHIABCDEFGHI。(甚至更長)这样的话PB似乎会将该字符视为一个单词,从而不进行换行。
3. 有人说加入空格,可这个空格在甚幺地方加入是很难判断的。因为栏宽会随客户的拖动而变化。
4. 另外如果是一组数字,那就更无法加入空格了,比如:5000000.0000
5. 小弟Google了无数次,都没找到解决方案,实在是苦不堪言啊。还望各路大侠不吝赐教。
...全文
205 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
distancehalf 2008-10-29
  • 打赏
  • 举报
回复
最近沒有在處理這個問題了,比較忙,等有空了再來試,謝謝大家。我先結帖。
lzheng2001 2008-10-13
  • 打赏
  • 举报
回复
方法2中还要注意一个问题,就是dw的长度单位,有几种,大概是 pbu,像素,毫米,英寸等,可能要把dw设置成象素为单位. 或者要进行转换.
当然还有一些其它思想可以尝试, 暂时不提了。
如果楼主解决了,也顺便贴一下代码给大家分享吧。
lzheng2001 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 distancehalf 的回复:]
引用 10 楼 AFIC 的回复:
〉〉1。換行點如何準確的判斷。並且欄寬是會變動的。

1。欄寬很好取到,
  問題在於假設欄寬500,那麼這500欄寬可以放多少字,在哪個字後面加入換行符.
  如:
  |ABC-EF_HI你好G789GGHK__K|
  如何知道這個欄寬是剛好滿足到K,K後面就要換行了。
2。PB11還沒…
[/Quote]

如果针对这个问题,可以试试方法2:
算字符宽高度的代码参考一下:
size 结构的定义为size.cx, size.cy 均为 long

Function ulong GetDC(ulong hwnd) library "user32.dll"
Function ulong SelectObject(ulong hdc,ulong hWnd) library "gdi32.dll"
Function boolean GetTextExtentPoint32(ulong hdcr,string lpString,long nCount,ref size size) library "gdi32.dll" Alias for "GetTextExtentPoint32A"

statictext lst_temp
size lstr_size
ulong lul_hdc,lul_handle,lul_hfont
int li_textFitWidth,li_textFitHeight

iWindow.OpenUserObject(lst_temp)

// 将字段的字体设置映射到文本对象
lst_temp.facename = This.Describe(as_textname + ".font.face")

choose case This.Describe(as_textname + ".font.family")
case "0"
lst_temp.FontFamily = AnyFont!
case "1"
lst_temp.FontFamily = Roman!
case "2"
lst_temp.FontFamily = Swiss!
case "3"
lst_temp.FontFamily = Modern!
case "4"
lst_temp.FontFamily = Script!
case "5"
lst_temp.FontFamily = Decorative!
end choose

lst_temp.textsize = integer(This.Describe(as_textname + ".font.height"))

lst_temp.weight = integer(This.Describe(as_textname + ".font.weight"))

ls_text = This.Describe(as_textname + ".text")


// 取得文本对象字体的宽和高
lul_handle = handle(lst_temp)
lul_hdc = getdc(lul_handle)
lul_hfont = send(lul_handle, 49, 0, 0)
selectobject(lul_hdc, lul_hfont)
GettextExtentPoint32(lul_hdc, ls_text, Len(ls_text), lstr_size)

iwindow.CloseUserObject(lst_temp)

li_textFitwidth = PixelsToUnits(lstr_size.cx, xpixelstounits!)
li_textFitHeight = PixelsToUnits(lstr_size.cy, ypixelstounits!)
lzheng2001 2008-10-13
  • 打赏
  • 举报
回复
我看楼主分析问题还是不错的,给点参考思路,希望有所帮助:
方法1.如果列是只读的,可以试试将半角字符转换成全角字符,写一个全局函数f_1(),dw中加一个计算列,把你的半角英文或数字转换成全角显示,
当然,我也只是想象,并不知道实际效果,你可以试试看是否可以接受.

//函数功能:将字符串中的半角字符转换成全角字符
//入口参数:in_str——准备进行转换的半角字符串 类型string
//返回值: 转换成功的全角字符串 类型string
string c_return=""
long l0,l1,l2,l3,l4,i,c_leng,l_asc
i=1
c_leng=len(in_str)
do while i<=c_leng
l_asc=asc(in_str)
if l_asc<=128 then
if l_asc>=33 and l_asc<=126 then
l1=int((l_asc+41856)/(16*16*16))
l0=mod((l_asc+41856),(16*16*16))
l2=int(l0/(16*16))
l0=mod(l0,(16*16))
l3=int(l0/16)
l4=mod(l0,16)
c_return=c_return+char(l1*16+l2)+char(l3*16+l4)
else
c_return=c_return+left(in_str,1)
end if
in_str=replace(in_str,1,1,"")
i=i+1
else
c_return=c_return+left(in_str,2)
in_str=replace(in_str,1,2,"")
i=i+2
end if
loop
return c_return
yeah920 2008-10-13
  • 打赏
  • 举报
回复
帮你顶,希望有人来解答。
kenshu 2008-10-13
  • 打赏
  • 举报
回复
在那个列做个TEXT,也是自动换行,内容为对应的列,这个TEXT就会自动换行了.
distancehalf 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 31737951 的回复:]
换行点加个空格取数据的时候再把空格去掉
[/Quote]

1。換行點如何準確的判斷。並且欄寬是會變動的。
2。數字欄位無法加入空格。
AFIC 2008-10-13
  • 打赏
  • 举报
回复
出差,给你个例子自己看吧
http://www.topwizprogramming.com/freecode/dwgridxp.zip
参考Autowidth columns功能。
distancehalf 2008-10-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 AFIC 的回复:]
〉〉1。換行點如何準確的判斷。並且欄寬是會變動的。

dw_1.object.#n.width
每次resize的时候重新算一次
或者升级到11,format用use elipiecss(大概不这么拼)
[/Quote]

1。欄寬很好取到,
  問題在於假設欄寬500,那麼這500欄寬可以放多少字,在哪個字後面加入換行符.
  如:
  |ABC-EF_HI你好G789GGHK__K|
  如何知道這個欄寬是剛好滿足到K,K後面就要換行了。
2。PB11還沒用過。看來要看PB11是否可行。
AFIC 2008-10-13
  • 打赏
  • 举报
回复
〉〉1。換行點如何準確的判斷。並且欄寬是會變動的。

dw_1.object.#n.width
每次resize的时候重新算一次
或者升级到11,format用use elipiecss(大概不这么拼)
sjq521521 2008-10-11
  • 打赏
  • 举报
回复
我测试了下〔选中auto horz scroll , 选中auto vert scroll , 选中vert scroll bar〕,是可以达到换行的效果的。本想贴张图上去的,但不知道如何贴图。
31737951 2008-10-11
  • 打赏
  • 举报
回复
换行点加个空格取数据的时候再把空格去掉
distancehalf 2008-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sjq521521 的回复:]
我测试了下〔选中auto horz scroll , 选中auto vert scroll , 选中vert scroll bar〕,是可以达到换行的效果的。本想贴张图上去的,但不知道如何贴图。

[/Quote]

不行,我用的是10.5版本,是否跟版本有關係.
jdsnhan 2008-10-10
  • 打赏
  • 举报
回复
应该有好多换行的例子。
原理是判定串的长度,无论是字符还是数字,都可以。
手边没环境,不好测试。
distancehalf 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiongxiao 的回复:]
缩小字体吧,如果客户没意见的话
[/Quote]
縮小字體顯然不太美觀,如果字符實在太長,怎麼縮也縮不完。
xiongxiao 2008-10-10
  • 打赏
  • 举报
回复
缩小字体吧,如果客户没意见的话

609

社区成员

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

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