标题:关于子表的DynamicBackColor斑马色隔行显示,记录号分隔不太好用,各位有什 ...
只看楼主
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:29
帖 子:484
专家分:1827
注 册:2018-3-13
得分:0 
以下是引用吹水佬在2023-4-29 09:02:43的发言:
因为当GRID不具有焦点或访问表格空白行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。
但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现“中断”状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

如果 ActiveRow 能具有确定性,我不会说勉强可接受
2023-04-29 12:37
sostemp
Rank: 4
等 级:业余侠客
威 望:8
帖 子:162
专家分:221
注 册:2009-6-2
得分:0 
以下是引用吹水佬在2023-4-29 09:02:43的发言:



记得以前也有探讨过 ActiveRow 区分奇偶行的问题,但有意思的是:
1、用键盘滚屏正常,但用鼠标滚屏异常。
2、在Scrolled事件中用SetFocus刷新表格,用鼠标滚轮正常,但用点击或拖动滚动条异常。
3、在Scrolled事件中用延时或异步消息执行SetFocus好象还可以。

因为当GRID不具有焦点或访问表格空白行时 ActiveRow 为 0,所以当滚动时要重新使GRID具有焦点。
但GRID的滚动事件Scrolled也有点特别,不能在Scrolled事件中出现“中断”状态,VFP帮助说的是因为当滚动时会出现屏幕刷新问题。

通过SetAll表格控件的DynamicBackColor,确实会存在这个问题。 ActiveRow 没用过。
持续关注!
2023-04-29 12:48
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
以下是引用csyx在2023-4-29 12:37:20的发言:


如果 ActiveRow 能具有确定性,我不会说勉强可接受


我用过ActiveRow ,要GRID取得焦点才会生效,而且只是当前显示的内容才斑马色,滚动后的数据也没效果
2023-04-29 14:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
以下是引用shonken在2023-4-29 14:40:36的发言:

我用过ActiveRow ,要GRID取得焦点才会生效,而且只是当前显示的内容才斑马色,滚动后的数据也没效果


有个问题:grid失焦时ActiveRow为0,导致不管当前在那一行MOD(this.ActiveRow,2)都为0。
简单测试了一下,其他好像还可以接受。



程序代码:
DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

CREATE CURSOR tt (F1 I, F2 C(10))
FOR i = 1 TO 100
    INSERT INTO tt VALUES (i%2, PADL(i,4,"0")) 
ENDFOR
GO TOP

of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    AllowOutput = 0
    AutoCenter  = 1
    ADD OBJECT cmd1  as commandbutton WITH top=4,left=10,height=22,caption="SORT"
    ADD OBJECT text1 as textbox       WITH top=4,left=120
    ADD OBJECT grid1 as myGrid        WITH top=30
    
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x401, this, "myGridSetFocus")
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
     
    PROCEDURE cmd1.Click
        IF DESCENDING()
            INDEX on F2 TAG tt_F2 ASCENDING
        ELSE
            INDEX on F2 TAG tt_F2 DESCENDING
        ENDIF
        thisform.Grid1.SetFocus
    ENDPROC
    
    FUNCTION myGridSetFocus(hWnd, nMsg, wParam, lParam)
        this.Grid1.SetFocus
    ENDPROC    
ENDDEFINE

DEFINE CLASS myGrid as Grid
    PROCEDURE init
        this.SetAll("DynamicBackColor", "IIF(MOD(this.ActiveRow,2)==0,0xF0F0F0,0xC0C0C0)", "Column")
    ENDPROC

    PROCEDURE Scrolled(nDirection)
        DODEFAULT()
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
ENDDEFINE


2023-04-29 15:54
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
以下是引用吹水佬在2023-4-29 15:54:16的发言:



有个问题:grid失焦时ActiveRow为0,导致不管当前在那一行MOD(this.ActiveRow,2)都为0。
简单测试了一下,其他好像还可以接受。




DECLARE LONG PostMessage IN User32 LONG, LONG, LONG, LONG

CREATE CURSOR tt (F1 I, F2 C(10))
FOR i = 1 TO 100
    INSERT INTO tt VALUES (i%2, PADL(i,4,"0"))
ENDFOR
GO TOP

of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 As Form
    AllowOutput = 0
    AutoCenter  = 1
    ADD OBJECT cmd1  as commandbutton WITH top=4,left=10,height=22,caption="SORT"
    ADD OBJECT text1 as textbox       WITH top=4,left=120
    ADD OBJECT grid1 as myGrid        WITH top=30
   
    PROCEDURE Init
        BINDEVENT(this.hWnd, 0x401, this, "myGridSetFocus")
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
     
    PROCEDURE cmd1.Click
        IF DESCENDING()
            INDEX on F2 TAG tt_F2 ASCENDING
        ELSE
            INDEX on F2 TAG tt_F2 DESCENDING
        ENDIF
        thisform.Grid1.SetFocus
    ENDPROC
   
    FUNCTION myGridSetFocus(hWnd, nMsg, wParam, lParam)
        this.Grid1.SetFocus
    ENDPROC   
ENDDEFINE

DEFINE CLASS myGrid as Grid
    PROCEDURE init
        this.SetAll("DynamicBackColor", "IIF(MOD(this.ActiveRow,2)==0,0xF0F0F0,0xC0C0C0)", "Column")
    ENDPROC

    PROCEDURE Scrolled(nDirection)
        DODEFAULT()
        PostMessage(thisform.hWnd, 0x401, 0, 0)
    ENDPROC
ENDDEFINE


效果不错
有个问题,如果当前容器对象里有多个GRID呢?
2023-04-29 18:25
shonken
Rank: 2
等 级:论坛游民
帖 子:95
专家分:21
注 册:2017-1-15
得分:0 
一个容器里有多个GRID的大概思路是这样:

在Gird中新建一个x_GotFocus方法,绑定Controls(2)的GotFocus事件,用来传递当前GRID的名字
  Bindevent(LoColobj.Controls(2),"GotFocus",This,"x_GotFocus")

符合GRID名字的再获得焦点

[此贴子已经被作者于2023-4-29 19:03编辑过]

2023-04-29 18:31
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
回复 14楼 吹水佬
好!谢谢!
2023-04-29 19:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-512055-1-1.html




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

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