注册 登录
编程论坛 VFP论坛

求教:列表框不可选时数据项的颜色问题

丁春秋yxp 发布于 2022-12-01 18:20, 3677 次点击
学艺不精,写程序时遇到问题解决不了,请大侠们指导,谢谢。
问题:列表框的Enabled=.t.时,选定的项是有颜色区分的,可Enabled=.f.时,就没颜色区分了。看不到刚才选择的是哪一项。
想解决:Enabled=.f.时,也能让刚才选择的项有个颜色区分,应如何设置。
再次感谢。

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2022-12-1 18:24编辑过]

35 回复
#2
sdta2022-12-01 19:23
Visual FoxPro 9.0 语言参考
ListBox 控件
看下相关内容,是否符合楼主的需求
#3
丁春秋yxp2022-12-01 21:01
回复 2楼 sdta
早就找了,就是找不到啊
#4
吹水佬2022-12-02 00:44
就那几组颜色,都变变看看
#5
丁春秋yxp2022-12-02 07:05
回复 4楼 吹水佬
都试了,没用。可能要写代码,可无从下手。
#6
吹水佬2022-12-02 08:02
Enabled=.f.传统的都是整个“灰”,玩个性就自己设计一个myListBox
#7
laowan0012022-12-02 08:33
Enabled=.f.表示控件不可用,也就谈不上“刚才选择的是哪一项”了
看不出楼主想实现什么样的效果
#8
厨师王德榜2022-12-02 09:26
我有办法,见附件.
只有本站会员才能查看附件,请 登录
#9
丁春秋yxp2022-12-02 11:28
回复 8楼 厨师王德榜
实在是高,一语点醒梦中人啊,请收下我的膝盖。
再把形状的边框整成透明,要的就是这效果。
#10
吹水佬2022-12-02 17:21
反常效果,不知情的还以为是点不动挂了。
#11
丁春秋yxp2022-12-02 18:19
回复 10楼 吹水佬
这个非常简单啊,列表框被形状盖住后改变下前景背景啥的,就可以让他看起来跟Enabled=.f.时一模一样了。

[此贴子已经被作者于2022-12-2 19:07编辑过]

#12
吹水佬2022-12-02 22:31
以下是引用丁春秋yxp在2022-12-2 18:19:39的发言:

这个非常简单啊,列表框被形状盖住后改变下前景背景啥的,就可以让他看起来跟Enabled=.f.时一模一样了。

本来的 Enabled=.f. 时也有选项框看到,只是灰色
#13
星光悠蓝2022-12-03 09:07
为什么非得失效,是实现什么。
#14
laowan0012022-12-03 09:33
以下是引用星光悠蓝在2022-12-3 09:07:38的发言:

为什么非得失效,是实现什么。

同问
#15
丁春秋yxp2022-12-03 20:59
回复 14楼 laowan001等
不清楚为什么几位会质疑这种用法,我解释一下,如果有更好的办法,请各位指导。
1、如图点击左边列表框后,表格显示所点击房屋具有的单据。
2、点击右下添加,就表示给该房屋添加新单据,此时处于编辑新单据状态。
3、编辑完成后点击右下的勾勾确定,则该单据入库;点击叉叉取消,则该单据不入库。
4、在确定该新单据是保存还是取消前,要求的是列表框不可选,并且突出显示当前是哪个房屋。
问题就在这里,让列表框的Enabled=.F.,则列表框“一片灰”,用户很难知道当前是给哪个房屋(或哪个人)添加新单据;
而8楼用透明形状盖住列表框的方法,则完美实现这个要求,图中所示就是列表框不可选,而且突出显示当前是给“崇邑村101号 唐仲”开新单据。
只有本站会员才能查看附件,请 登录
#16
csyx2022-12-03 21:23
学过 vfp 的应该都知道,不想让列表框得到焦点的方法有两种:
1. When 事件里返回 .f.
2. GotFocus 事件里加 NoDefault

加图片掩盖的方式,看似解决了问题,无法阻止用户用 tab 键将焦点切换到列表框

[此贴子已经被作者于2022-12-3 21:42编辑过]

#17
丁春秋yxp2022-12-03 21:54
回复 16楼 csyx
谢谢提醒,我琢磨一下。
#18
吹水佬2022-12-04 10:20
listbox本身也可以做出不错的感觉
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

程序代码:
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    ADD OBJECT cmd as commandbutton WITH left=10,top=10,height=24,caption="Enabled=.F."
    ADD OBJECT lst as list1
    PROCEDURE cmd.click
        this.Caption = "Enabled="+TRANSFORM(thisform.lst.Enabled)
        thisform.lst.Enabled = !thisform.lst.Enabled
    ENDPROC
ENDDEFINE

DEFINE CLASS list1 as ListBox
    left=10
    top=40
    width=200
    MultiSelect=1
    Picture="d:\temp\test_0.png"
    index = 0
    PROCEDURE init
        FOR i=1 TO 9
            this.AddItem(REPLICATE(TRANSFORM(i),10))
        ENDFOR
        this.ListIndex = 1
        this.InteractiveChange
    ENDPROC
    PROCEDURE InteractiveChange
        this.Picture(this.index) = "d:\temp\test_0.png"
        this.index = this.ListIndex
        this.Picture(this.ListIndex) = "d:\temp\test_1.png"
    ENDPROC
ENDDEFINE

#19
laowan0012022-12-04 10:34
16楼的方法1即可完美解决
只有本站会员才能查看附件,请 登录


把list1.tag当作开关

[此贴子已经被作者于2022-12-4 10:35编辑过]

#20
丁春秋yxp2022-12-04 11:02
回复 18楼 吹水佬
版主真高,虽然复杂,但很漂亮,留存以备后用,谢谢。
#21
丁春秋yxp2022-12-04 11:04
回复 19楼 laowan001
没错,换成这个就简单多了,谢谢指导。
#22
丁春秋yxp2022-12-04 11:07
回复 16楼 csyx
多谢多谢,用这个就轻松解决了,当时是想了几天都没想到解决办法才来求助的。
看来写代码还是有脑子才行,我就有点脑子不够用。
#23
吹水佬2022-12-04 12:30
以下是引用丁春秋yxp在2022-12-4 11:02:39的发言:

版主真高,虽然复杂,但很漂亮,留存以备后用,谢谢。

不算复杂,只是用了listbox的常规图标功能,用图标美感就没问题了吧
#24
schtg2022-12-05 07:23
回复 16楼 csyx
高!
#25
schtg2022-12-05 07:24
回复 18楼 吹水佬
学习啦,谢谢!
#26
吹水佬2022-12-06 18:43
以下是引用吹水佬在2022-12-4 12:30:44的发言:


不算复杂,只是用了listbox的常规图标功能,用图标美感就没问题了吧

其实就3句:
        this.Picture(this.index) = "d:\temp\test_0.png"
        this.index = this.ListIndex
        this.Picture(this.ListIndex) = "d:\temp\test_1.png"
#27
丁春秋yxp2022-12-07 13:46
以下是引用吹水佬在2022-12-6 18:43:31的发言:


其实就3句:
        this.Picture(this.index) = "d:\temp\test_0.png"
        this.index = this.ListIndex
        this.Picture(this.ListIndex) = "d:\temp\test_1.png"


谢谢版主,这个漂亮,最终我也采用了这种方法。
只是在过程中发现,图标无论做成png还是ico,显示都不能做到透明,列表框还是很难看,没办法做了4个图标才解决问题(两个的底板与列表框有效时背景色一致,另两个与无效时一致),不知有没有更简单一点的办法。
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2022-12-7 13:53编辑过]

#28
吹水佬2022-12-07 15:48
回复 27楼 丁春秋yxp
列表框好象就这样子,TREEVIEW的好象也是这样,将底色改成一样就当透明。
要强大还是用GRID
只有本站会员才能查看附件,请 登录
#29
丁春秋yxp2022-12-07 17:04
回复 28楼 吹水佬
谢谢版主指导,留存研究一下。
#30
吹水佬2022-12-07 19:43
回复 29楼 丁春秋yxp
简单写一个,大概就是这样子
只有本站会员才能查看附件,请 登录

主要是两段
程序代码:
   
    PROCEDURE AfterRowColChange(nColIndex)
        IF this.RowColChange == 1
            this.index = RECNO()
            this.SetFocus
        ENDIF     
    ENDPROC


    PROCEDURE BackStyle_ACCESS
        this.Picture = IIF(RECNO("tt")==thisform.grd.index,"d:\temp\test_0.ico","d:\temp\test_1.ico")
        RETURN THIS.BackStyle
    ENDPROC


程序代码:

CREATE CURSOR tt (img v(1), f1 v(10))
FOR i=1 TO 9
    INSERT INTO tt VALUES ("", REPLICATE(TRANSFORM(i),10))
ENDFOR
GO TOP
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    AllowOutput = .f.
    AutoCenter = .t.
    ADD OBJECT cmd as commandbutton WITH left=10,top=10,height=24,caption="Enabled=.F."
    ADD OBJECT grd as grid1
    PROCEDURE cmd.click
        this.Caption = "Enabled="+TRANSFORM(thisform.grd.Enabled)
        thisform.grd.Enabled = !thisform.grd.Enabled
    ENDPROC
ENDDEFINE

DEFINE CLASS grid1 as Grid
    left=10
    top=40
    width=200
    RowHeight=32
    HeaderHeight=0
    GridLines=0
    DeleteMark=.f.
    RecordMark=.f.
    AllowCellSelection=.f.
    SplitBar=.f.
    ScrollBars=2
    index = 1
    PROCEDURE init
        this.Column1.width=32
        this.Column1.RemoveObject("Text1")
        this.Column1.AddObject("img", "grdimg")
        this.Column1.Sparse = .F.
    ENDPROC
    PROCEDURE AfterRowColChange(nColIndex)
        IF this.RowColChange == 1
            this.index = RECNO()
            this.SetFocus
        ENDIF     
    ENDPROC
ENDDEFINE

DEFINE CLASS grdimg AS image
    BackStyle = 0
    Width = 32
    Height = 32
    Stretch = 0
    PROCEDURE BackStyle_ACCESS
        this.Picture = IIF(RECNO("tt")==thisform.grd.index,"d:\temp\test_0.ico","d:\temp\test_1.ico")
        RETURN THIS.BackStyle
    ENDPROC
ENDDEFINE

#31
丁春秋yxp2022-12-07 20:46
回复 30楼 吹水佬
这个可以啊,谢谢版主,我好好消化消化
#32
schtg2022-12-08 06:45
回复 30楼 吹水佬
谢谢!
#33
吹水佬2022-12-08 07:45
以下是引用星光悠蓝在2022-12-3 09:07:38的发言:

为什么非得失效,是实现什么。

这是个问题
要看在什么情况,例如:列表项目多,选定项目了又滚动列表,当选定的项目被滚出列表,这时禁止了就滚不回去,看不到了。不过,这种操作也许不多见。
#34
星光悠蓝2022-12-08 09:09
回复 33楼 吹水佬
这种情况确实没用过,我通常用视图来操作。
#35
吹水佬2022-12-09 11:35
回复 30楼 吹水佬
也可以采用切换 Column 的 CurrentControl
程序代码:
CREATE CURSOR tt (f1 v(10))
FOR i=1 TO 20
    INSERT INTO tt VALUES (REPLICATE(PADL(i,2,"0"),10))
ENDFOR
GO TOP
of = CREATEOBJECT("form1")
of.show(1)
RETURN

DEFINE CLASS form1 as Form
    AllowOutput = .f.
    AutoCenter  = .t.
    ADD OBJECT cmd as commandbutton WITH left=10,top=10,height=24,caption="Enabled=.F."
    ADD OBJECT grd as grid1
    PROCEDURE cmd.click
        this.Caption = "Enabled="+TRANSFORM(thisform.grd.Enabled)
        thisform.grd.Enabled = !thisform.grd.Enabled
    ENDPROC
ENDDEFINE

DEFINE CLASS grid1 as Grid
    left=10
    top=40
    width=200
    RowHeight=32
    HeaderHeight=0
    GridLines=0
    DeleteMark=.f.
    RecordMark=.f.
    AllowCellSelection=.f.
    SplitBar=.f.
    ScrollBars=2
    icoIndex = 1
    PROCEDURE init
        this.AddObject("imgCol","Column1")
        this.imgCol.ColumnOrder = 1
    ENDPROC
    PROCEDURE AfterRowColChange(nColIndex)
        IF this.RowColChange == 1
            this.icoIndex = RECNO()
            this.SetFocus
        ENDIF     
    ENDPROC
ENDDEFINE

DEFINE CLASS Column1 as Column
    Width=32
    Sparse=.F.
    Visible=.t.
    PROCEDURE init
        this.RemoveObject("Text1")
        this.AddObject("img0", "image")
        this.AddObject("img1", "image")
        this.img0.Picture = "d:\temp\test_0.ico"
        this.img1.Picture = "d:\temp\test_1.ico"
            * 切换 Column 的 CurrentControl
        this.DynamicCurrentControl = [IIF(RECNO("tt")==thisform.grd.icoIndex,"img0","img1")]
    ENDPROC
ENDDEFINE
#36
丁春秋yxp2022-12-09 14:21
回复 35楼 吹水佬
努力学习中……
1