| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4753 人关注过本帖
标题:VFP GRID滚动条拖到低部时在数据尾部时多出许多空白行,怎么不显示这些空白 ...
只看楼主 加入收藏
yll148
Rank: 2
等 级:论坛游民
威 望:3
帖 子:268
专家分:15
注 册:2012-7-3
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:14 
VFP GRID滚动条拖到低部时在数据尾部时多出许多空白行,怎么不显示这些空白
VFP  GRID滚动条拖到低部时在数据尾部时多出许多空白行,怎么不显示这些空白?
搜索更多相关主题的帖子: 滚动条 数据 尾部 空白 不显示 
2017-10-30 06:33
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
GRID好象是保留有空白区,因在编辑状态下,空白区才能响应GRID的一些事件。这一点有点象Windows的窗口事件,如一些鼠标右键菜单只能在空白区点击才有效。
2017-10-30 09:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:20 
GRID好象没有设置空白区的属性和方法。
有需要的可以自己写代码去处理。
思路:
1、获取表格行数、检测最底行是否空白区。参考GridHitTest方法,要确定或计算底行空白区检测点(x,y)。
2、确定顶行显示的数据记录号n。参考RECCOUNT()和表格行数。
3、将n记录自动显示在顶行。参考ActivateCell和DoScroll方法。
注意:
某些事件(如滚动条事件Scrolled)可能要用异步消息来处理。
自定义一个消息号(如:0x401)并绑定一个自定义方法(如:_BlankRows):
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

    PROCEDURE init
        BINDEVENT(this.hWnd, 0x401, this, "_BlankRows")
    ENDPROC

    FUNCTION _BlankRows(hWnd, Msg, wParam, lParam)
        ** 在这时处理空白行问题
    ENDFUNC

    PROCEDURE grid1.Scrolled(nDirection)
        IF INLIST(nDirection, 1,3)
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    PROCEDURE grid1.MouseWheel(nDirection, nShift, nXCoord, nYCoord)
        IF nDirection < 0
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC
2017-10-30 09:31
yll148
Rank: 2
等 级:论坛游民
威 望:3
帖 子:268
专家分:15
注 册:2012-7-3
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
这样的结果
2017-10-30 14:54
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
参考示例,不知能否满足要求。
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
CREATE CURSOR tt (f1 C(4), f2 I)
FOR i = 1 TO 100
    INSERT INTO tt VALUES (PADL(i, 4, "0"), i)
ENDFOR
GO TOP
of = CREATEOBJECT("form1")
of.show(1)

DEFINE CLASS form1 as Form
    ADD OBJECT grid1 as _grid
ENDDEFINE

DEFINE CLASS _grid as grid
    Visible = .T.
   
    PROCEDURE init
        BINDEVENT(thisform.hWnd, 0x401, this, "_BlankRows")
    ENDPROC
   
    PROCEDURE Scrolled(nDirection)
        IF INLIST(nDirection, 1,3)
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC
   
    PROCEDURE MouseWheel(nDirection, nShift, nXCoord, nYCoord)
        IF nDirection < 0
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    PROCEDURE AfterRowColChange(nColIndex)
        IF this.RowColChange != 2
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    FUNCTION _SetCell(nRow, nCol, nRecno)
        IF nRow <= nRecno
            GO nRecno
            this.SetFocus
            this.ActivateCell(nRow, nCol)
            DO WHILE RECNO() != nRecno
                this.DoScroll(IIF(RECNO() < nRecno, 1, 0))
                this.SetFocus
                this.ActivateCell(nRow, nCol)
            ENDDO
        ENDIF
    ENDFUNC

    FUNCTION _BlankRows(hWnd, Msg, wParam, lParam)
        LOCAL nRow, nCol, nX, nY, nWhere, nRelRow, nRelCol, nRecno
        nCol = this.ActiveColumn
            * 示例假设最底行第一格内的座标(nX, nY)(按实际情况确定或通过算计取得)
        nX = 25
        nY = this.top + this.height - 25
        STORE 0 TO nWhere, nRelRow, nRelCol
        this.GridHitTest(nX, nY, @nWhere, @nRelRow, @nRelCol)
        IF nWhere==0 AND RECCOUNT()>=nRelRow   && 空白行
            thisform.LockScreen = .T.
            this._SetCell(1, nCol, RECCOUNT()-nRelRow+1)
            this.ActivateCell(nRelRow, nCol)
            thisform.LockScreen = .F.
        ENDIF
    ENDPROC
ENDDEFINE
2017-10-30 16:18
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9848
专家分:27241
注 册:2012-2-5
收藏
得分:0 
炊版的功夫了得啊
有个小问题,当向下拖拉垂直滚动条到最后时,会显示无数据空白区域,松开鼠标空白区域就不显示了,最好是不让空白区域显示出来,这个功能就完美了,是否提示到文件尾无关紧要。

坚守VFP最后的阵地
2017-10-30 18:26
xinjie
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:19
帖 子:277
专家分:520
注 册:2007-8-11
收藏
得分:0 
呵呵
2017-10-30 21:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用sdta在2017-10-30 18:26:16的发言:

炊版的功夫了得啊
有个小问题,当向下拖拉垂直滚动条到最后时,会显示无数据空白区域,松开鼠标空白区域就不显示了,最好是不让空白区域显示出来,这个功能就完美了,是否提示到文件尾无关紧要。

玩个性的可以重载键盘鼠标事件和自己设计滚动条
2017-10-30 22:03
yll148
Rank: 2
等 级:论坛游民
威 望:3
帖 子:268
专家分:15
注 册:2012-7-3
收藏
得分:0 
非常感谢朋友的帮助,向您学习!
2017-10-31 07:13
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
查看了VFP的帮助,没找到返回GRID表格行数的属性或方法?
改了一下算法,看似简单点。
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG
CREATE CURSOR tt (f1 C(4), f2 I)
FOR i = 1 TO 100
    INSERT INTO tt VALUES (PADL(i, 4, "0"), i)
ENDFOR
GO TOP
of = CREATEOBJECT("form1")
of.show(1)  
CLOSE DATABASES ALL
CLEAR ALL
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT grid1 as _grid

    PROCEDURE Activate
        this.grid1._InitVal()
    ENDPROC
ENDDEFINE

DEFINE CLASS _grid as grid
    Visible = .T.
    nRows = 1    && 表格行数
    nRect = 1    && 表格顶行记录号
   
    PROCEDURE init
        BINDEVENT(thisform.hWnd, 0x401, this, "_BlankRows")
    ENDPROC
   
    PROCEDURE Scrolled(nDirection)
        IF INLIST(nDirection, 1,3)
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC
   
    PROCEDURE MouseWheel(nDirection, nShift, nXCoord, nYCoord)
        IF nDirection < 0
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    PROCEDURE AfterRowColChange(nColIndex)
        IF this.RowColChange != 2
            PostMessage(thisform.hWnd, 0x401, 0, 0)
        ENDIF
    ENDPROC

    FUNCTION _InitVal()
        this.nRows = 1
        this.ActivateCell(this.nRows, 1)
        this.setfocus
        DO WHILE this.RelativeRow == this.nRows
            this.nRows = this.nRows+1
            this.ActivateCell(this.nRows, 1)
            this.setfocus
        ENDDO
        this.ActivateCell(1, 1)
        this.nRows = this.nRows-1
        this.nRect = RECCOUNT()-this.nRows+1
    ENDFUNC

    FUNCTION _SetCell(nRow, nCol, nRecno)
        IF nRow <= nRecno
            GO nRecno
            this.SetFocus
            this.ActivateCell(nRow, nCol)
            DO WHILE RECNO() != nRecno
                this.DoScroll(IIF(RECNO() < nRecno, 1, 0))
                this.SetFocus
                this.ActivateCell(nRow, nCol)
            ENDDO
        ENDIF
    ENDFUNC

    FUNCTION _BlankRows(hWnd, Msg, wParam, lParam)
        LOCAL nRow, nCol
        nRow = this.RelativeRow
        nCol = this.RelativeColumn
        **nCol = this.ActiveColumn
        this.SetFocus
        IF (RECNO()-nRow+1) > this.nRect
            thisform.LockScreen = .T.
            this._SetCell(1, nCol, this.nRect)
            this.ActivateCell(this.nRows, nCol)
            thisform.LockScreen = .F.
        ENDIF
    ENDPROC
ENDDEFINE


[此贴子已经被作者于2017-10-31 10:14编辑过]

2017-10-31 10:11
快速回复:VFP GRID滚动条拖到低部时在数据尾部时多出许多空白行,怎么不显示这 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021683 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved