PB [Grid风格数据窗口改变线条颜色] 的变通实现方法(也可以成为 带表头的Grid数据窗口)

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运行效果

变换后的效果

PB [Grid风格数据窗口改变线条颜色] 的变通实现方法(也可以成为 带表头的Grid数据窗口)_第1张图片

        改变颜色后

PB [Grid风格数据窗口改变线条颜色] 的变通实现方法(也可以成为 带表头的Grid数据窗口)_第2张图片

 

 

你可能感兴趣的:(PB [Grid风格数据窗口改变线条颜色] 的变通实现方法(也可以成为 带表头的Grid数据窗口))