Tabular型DW改变列标题宽度的设计思路,欢迎大家讨论

Hanson_bati_zhu 2002-02-24 02:45:55
加精
Tabular型DW改变列标题宽度的设计思路,欢迎大家讨论

兄弟现在做的程序中设计到了Tabular型DW改变列标题宽度的问题
目前的解决方案如下(目前只适用于我自己的程序,不是很通用,但照着改改应该能搞定):


由于我程序中使用的用户录入DW均是由程序动态生成的
(暂时先说只有一层列标题即最简单的类似于GRID的DW,多层、有组合的DW的处理方法正在研究中)
所以可以预知所有列的初始化位置、宽度
我做了一个结构对象,结构为:X、WIDTH,用来保存每列的位置、宽度信息
在创建DW时,为每一列创建一个垂直LINE对象,放置在HEADER BAND中
位置为对应列的右侧,设置PEN.STYLE=5,HEIGHT=HEADER BAND HEIGHT,Y=0,POINTER=SizeWS!
设置PEN.STYLE=5的目的是为了使这条新增的线不可见单鼠标移动到其上时能够改变关闭形状
主要是考虑到不能影响界面效果


在DW对象的实例变量中定义:
Boolean ib_ClickedOnLine = FALSE //是否点击到线上
Long il_ClickedLineNo = 0 //当前点击线对应列号
Long il_OldX = 0 //上一次鼠标移动位置
Long il_ColumnCount = 0 //当前DW中可以移动列总数
Gstr_GridInfo istr_GridInfo[] //列位置、宽度信息保存用结构

在程序创建DW过程中,填写:il_ColumnCount和istr_GridInfo中信息

在DW对象中添加用户事件:pbm_lbuttondown(使用pbm_dwnlbuttondown亦可以)用户处理鼠标点击事件
在其中判断当前鼠标点击对象是否是列分割线
如果是则获取当前分隔线对应列号,保存到il_ClickedLineNo
修改ib_ClickedOnLine = TRUE
设置il_OldX = 0
设置当前DW的Pointer=SizeWS!(可以使用:THIS.Object.DataWindow.Pointer = 'SizeWE!'实现)

在DW对象中添加用户事件:pbm_dwnmousemove用以处理鼠标移动事件
判断如果当前鼠标已经点击分隔线(ib_ClickedOnLine = TRUE)则
如果当前鼠标位置小于当前分隔线对应列X值+20(这个值可以根据需要自行设定,不过太小了程序容易判断出错)则返回 //列宽度不能小于0
获取当前DW高度并换算为象素点
获取当前DW的上下文(ll_dc = GetDC(Handle(THIS)) //GetDC是用来获取指定句柄对象的上下文用的API函数)
设置当前绘图模式为R2_NOTXORPEN//10
使用:SetROP2(ll_dc,10) //SetROP2是设置指定设备的绘图模式用的API函数
判断当前il_OldX是否不等于0(目的是为了区别于第一次绘制分隔线)
如果不等于则
绘图原点移动到il_OldX位置,使用MoveToEx(ll_dc,il_OldX,0,0) //MoveToEx是用来移动绘图原点用的API函数
绘制分隔线,使用LineTo(il_dc,il_OldX,当前DW高度换算为象素点后高度) //LineTo是用来从绘图原点到指定位置间绘制一条直线用的API函数
绘图原点移动到鼠标当前位置位置,使用MoveToEx(ll_dc,xpos,0,0)
绘制分隔线,使用LineTo(il_dc,xpos,当前DW高度换算为象素点后高度)
保存当前鼠标位置在il_OldX变量中
释放所获取得上下文 使用 ReleaseDC(Handle(THIS),ll_dc) //ReleaseDC是用来释放由函数GetDC所获取的指定句柄对象的上下文用的API函数)


在DW对象中添加用户事件:pbm_lbuttonup(使用pbm_dwnlbuttonup亦可以)用户处理鼠标点击事件
判断如果当前鼠标已经点击分隔线(ib_ClickedOnLine = TRUE)则
设置当前DW禁止重绘(THIS.SetRedraw(FALSE))
根据当前il_OldX变量中保存的位置计算当前列的新的宽度
istr_GridInfo[il_ClickedLineNo].Width = il_OldX - istr_GridInfo[il_ClickedLineNo].X
修改当前列及列标题的宽度为istr_GridInfo[il_ClickedLineNo].Width
修改当前列分隔线对象位置为:istr_GridInfo[il_ClickedLineNo].Width + istr_GridInfo[il_ClickedLineNo].X

使用变量ll_Index从il_ClickedLineNo+1到il_ColumnCount循环
修改istr_GridInfo[ll_Index].X = istr_GridInfo[ll_Index - 1].X + istr_GridInfo[ll_Index].Width - 1
修改第ll_Index个列及列标题的x位置为istr_GridInfo[ll_Index].X
修改第ll_Index个列及列标题的宽度为istr_GridInfo[ll_Index].Width
修改第ll_Index个当前列分隔线对象位置为:istr_GridInfo[ll_Index].Width + istr_GridInfo[ll_Index].X

恢复当前DW的光标形状
使用:THIS.Object.DataWindow.Pointer = 'Arrow!'
恢复当前DW重绘:THIS.SetRedraw(TRUE)
设置ib_ClickedOnLine=FALSE
清空当前选中列号il_ClickedLineNo = 0
清空当前鼠标位置il_OldX = 0


到此,程序基本上算是解决这个问题了
运行的效果不错,决不属于PB自己的GRID中的效果(除了速度稍逊外,呵呵,没办法)


这个思路只是兄弟个人的想法
应该有更成熟的办法
希望有经验的同道能不吝赐教

另:多层DW(中国式报表格式)的处理兄弟正在研究中
等有了眉目再补充


烟抽光了,还是不困,怎么办呢。。。。。
找出我的莫赫烟,大炮卷起来。。。。。
继续研究
8-)

...全文
102 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
am2000 2002-03-08
  • 打赏
  • 举报
回复
我想查询显示的时候按grid格式显示。
用户要求将显示结果打印出来。
需要定制打印的标题及页脚等,并添加到报表中去。
怎么办呢。

am2000 2002-03-08
  • 打赏
  • 举报
回复
将讨论进行到底
am2000 2002-03-07
  • 打赏
  • 举报
回复
up.
如果要打印,那怎么办
Hanson_bati_zhu 2002-02-25
  • 打赏
  • 举报
回复
谢谢领导关怀
8-)

Hanson_bati_zhu 2002-02-25
  • 打赏
  • 举报
回复
改一下

WIDTH = 这个对象的所有下级节点的WIDTH 的和
改为
WIDTH = 这个对象的最右侧一个下级节点的X+ 这个对象的最右侧一个下级节点的WIDTH - 这个对象的最左侧一个下级节点的X



效果极好
不错不错
8-)
Hanson_bati_zhu 2002-02-25
  • 打赏
  • 举报
回复
多层DW标题问题解决

解决方法:
多层的中国式报表,实际上都可以转换为一棵树
除去树根,就是多层的表格标题了

所以当一列的宽度改变后
首先更新该列右侧所有末级节点的X位置和宽度

然后获取所有中间级标题对象的名称
从最右侧的倒数第二层的标题对象开始
X = 这个对象的下级的第一个节点的X
WIDTH = 这个对象的所有下级节点的WIDTH 的和

循环一次搞定

8-)

sorrow_arrow 2002-02-24
  • 打赏
  • 举报
回复
先记下再说
liulee 2002-02-24
  • 打赏
  • 举报
回复
烟抽好一些的啦,焦油含量低的,可以多活几分钟,呵呵呵。

收藏....

Hanson_bati_zhu 2002-02-24
  • 打赏
  • 举报
回复
自己推
am2000 2002-02-24
  • 打赏
  • 举报
回复
学习
am2000 2002-02-24
  • 打赏
  • 举报
回复
学习
Hanson_bati_zhu 2002-02-24
  • 打赏
  • 举报
回复
TO:llitcwl(中国龙)
这么晚还不睡?
难道跟兄弟一样失眠?
8-)


因为兄弟的DW是中国式报表录入
即DW的形式为一张报表,用户直接在表格中录入数据
所以标题的形式很复杂,用GRID不好解决,而且GRID效果不好
没有提供代码的主要原因是由于兄弟所写的程序均受控
而且在CSDN上也有不少兄弟所在公司地同仁
兄弟尚不敢轻易外流程序代码
不过设计思路尚可以与网友交流
8-)



刚刚测出一个缺陷
修改方式如下:
1、在鼠标移动事件中判断当前分隔线位置是否小于当前列的X值的地方
改为当前分隔线+当前DW的滚动条位置是否小于当前列的X值

2、在鼠标按钮放开事件中所有的当前鼠标位置
改为当前鼠标位置+当前DW的滚动条位置是否小于当前列的X值




llitcwl 2002-02-24
  • 打赏
  • 举报
回复
有启发,但对Tabular去做我觉得意义不太,为何不直接用grid呢?
另:最好能为代码,自己写太累了:-)
Hanson_bati_zhu 2002-02-24
  • 打赏
  • 举报
回复
兄弟剪贴了一小部分录入界面标题结构
大家可以看看

实在是不好用GRID型DW实现阿
8-(


图片地址在
http://cnnb.net/cgi-win/netstore_getfile.cgi?username=hanson1&path=1.bmp
am2000 2002-02-24
  • 打赏
  • 举报
回复
收藏!

1,075

社区成员

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

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