PB中Grid类型的数据窗口是用的最广泛的一种类型,特点:创建快速,位置调整方便,运行后用户也可以方便的调整列的宽度,列的位置, 运行效率也最高。
但是这个数据窗口类型的线条颜色是固定的,不能改变(可以通过API或者第三方控件修改内存数据改变) ,而且线条也不是很美观,呵呵, 不少人对他的颜色不满意。 如果想做出漂亮的报表PB提供另外一种数据窗口类型Tabular类型 ,线可以自己画 ,线的颜色当然也是可以改变的 ,但是Tabular的缺点也是显而易见的:画线繁琐,画好线之后如果要修改其中的列,那么这个工作将是令人疯狂的, 另外的列的宽度在运行后不能手动的拉宽,拉窄。
入正题! 找到一个既有表头 ,又能改变线条颜色 ,又修改方便 ,又运行后能拉列宽。。。。 。 我的答案是: 建立Grid类型的数据窗口 ,程序运行后转换成Tabular类型, 程序自动划线 ,然后程序控制鼠标拖动事件来拉宽,拉窄列 ,这样并没有改变程序中Grid的源代码,这样对程序中的修改,修改的都是原来的Grid类型 ,比较快捷 。
1. 新建Nvo nvo_Grid_Report ,实例变量 Left_Add //左侧偏移量
2. 要对Grid进行列的拖动,必须要记录各列的位置,以及画出的线的位置 ,这样在拖动是才能正确的移动列和线条的位置 ,新建四个DS 分别:
ids_Header //记录Header的标题信息 ,主要: 对象名称 ,x ,width ,对应的列的 ID 号 ,线的名称
ids_Detail // 记录Detail中的信息,也就是列和计算列. 主要: 对象名称,x ,width ,ID ,线的名称
Ids_ForeGround // 这个主要记录多表头的 ,因为多表头的上表头要设置成ForeGround 。 对象名称 ,x ,对应列Id1 ,对应列ID2 (它是跨列),线名称
ids_Summary // 汇总区 ,同ids_Detail
3. 新增函数 Of_Get_Objects 来获取 dw中的信息,也就是填充上一步的4个ds 。 ids_Detail 中的id号其实就是明细中按照x排序后的一个顺序号,记录列的位置。 线的名称就是将要画的线的命名 。ids_Header的线就是标题(一个Text)右边的一个竖线, ids_Detail中线也是列的右边的竖线和列下方的横行
4. 开始画线
①. 首先获取数据窗口Syntax , 替换其中的processing=1为processing=0
②. For i = 循环ids_Detail , 生成2个变量 ls_Lines (这个是需要Create的line的语法) ,ls_Modify(这个是需要在最后修改的列的x)
例如: = 10
ls_Lines += Line(竖线 x1 = x2 = 第十列.x + 第十列.width + Left_Add )(y1 = -4 ,y2 = Detail.Heigth + 4)(名称,颜色)
ls_Lines += Line(横线 x1 = 第十列.x + Left_Add , x2 = 第十列.x + Left_Add + 第十列.width) (y1 = y2 = Detail.height - 4)(名称,颜色)
ls_Modify += 第十列列明 + “.x = ” + 第十列的x + Left+Add
然后去找第十列对应的标题 ,获取标题对应的Lines 表达式 ,Modify表达式
然后去找第十列对应的Summary汇总, 如果有汇总区的话,不管有没有找到第十列对应的汇总计算了, 那个线都是要画的
然后去着第十列对应的Foreground对象,这个对象特殊,跨多列处理起来要复杂些,他的位置,以及线的宽度,都要特殊处理
③. 通过第二步已经把对应点列和线的位置生成的语法 。 这里还需要补几个特殊的对象
1. Header 中标题上方的一条线 ,标题下方的一条线
2. 如果有Summary 那么这个里面也要画一条下方的横线
3. 对左侧的一个堵口线
4. 在最右侧列的右侧 20像素除画一个点 ,这个主要目的是能把最右侧的线显示出来,否则显示不出来的
④. 如果有表头 ,也要把语法创建进去,这里注意有表头那么表头区的线 和 标题的y都改变的,给表头流出位置
⑤. 把lines的语法补到原始的Syntax 中 ,执行 dw_1.Create() , 再执行 dw_1.Modify(ls_Modify) 这样已经把Grid数据窗口变成了一个Tabular风格
5. 处理列的移动
1. 在鼠标按下事件中判断点中的对象是否是标题右侧的线
2. 如果是标题右侧的线,处理鼠标移动(鼠标点下没弹起),基本原则是这样的
1. 这条线属于的标题 ,以及对应的列 ,汇总列的宽度都 改变 ,x不改变
2. 这条线后的所有对象 x + ,宽度宽度不变
3. 几条固定的线,标题上下线,Summary中的线 x2 是要变的
6. 完成 大致效果是这样的
原始Grid运行效果
变换后的效果
改变颜色后