| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2667 人关注过本帖, 1 人收藏
标题:TextBox+ListBox组成的MyComboBox控件
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏(1)
 问题点数:0 回复次数:36 
TextBox+ListBox组成的MyComboBox控件
程序代码:
CLEAR ALL 

SET PATH TO "MyTools"
SET PROCEDURE TO "MyForm" ADDITIVE 
SET PROCEDURE TO "MyComboBox" ADDITIVE

Main()

CLOSE PROCEDURES
CLEAR ALL 
RETURN 

PROCEDURE Main()
    LOCAL loForm
    loForm = CREATEOBJECT("_Form")
    WITH loForm
        .Caption = "test MyComboBox"
        .ShowTips = .T.
        .Show
    ENDWITH 
    READ EVENTS
ENDPROC 

DEFINE CLASS _Form AS MyForm

    ADD OBJECT Combo1 AS MyComboBox WITH Top = 5, Left = 5, Height = 100, Width = 120
    
    PROCEDURE Combo1.Init
        WITH This.lstList
            .Clear
            .AddItem("One")
            .AddItem("Two")
            .AddItem("Three")
            .AddItem("Fourth")
            .AddItem("Five")
            .AddItem("Six")
            .ListIndex = 1
        ENDWITH 
    ENDPROC 
    
ENDDEFINE 


MyForm.PRG
程序代码:
DEFINE CLASS MyForm AS Form

    PROCEDURE Arrange
        FOR EACH obj IN This.Controls FOXOBJECT 
            IF (VARTYPE(obj.CanArrange) == "L") .AND. obj.CanArrange
                obj.Arrange
            ENDIF 
        NEXT 
    ENDPROC 
    
    PROCEDURE Activate
        This.Arrange
    ENDPROC 
    
    PROCEDURE Resize
        This.Arrange
    ENDPROC 
    
    PROCEDURE Destroy
        CLEAR EVENTS
    ENDPROC 
    
ENDDEFINE 


MyComboBox.PRG
程序代码:
DEFINE CLASS MyComboBox AS Container

    BorderWidth = 0
    
    CanArrange = .T.

    ADD OBJECT txtInput AS TextBox WITH Height = 25, ToolTipText = "按TAB选定当前列表项"
    ADD OBJECT lstList  AS ListBox WITH ToolTipText = "鼠标滚动选项"
    
    PROCEDURE Arrange
        WITH This.txtInput
            .Top = 0
            .Left = 0
            .Width = This.Width
        ENDWITH 
        WITH This.lstList
            .Top = This.txtInput.Top + This.txtInput.Height + 2
            .Left = 0
            .Height = This.Height - .Top
            .Width = This.Width
        ENDWITH 
    ENDPROC 
    
    PROCEDURE txtInput.InteractiveChange
        LOCAL lnIndex
        WITH This.Parent
            FOR lnIndex = 1 TO .lstList.ListCount
                IF ALLTRIM(This.Value) $ .lstList.ListItem(lnIndex)
                    .lstList.ListIndex = lnIndex
                    EXIT 
                ENDIF 
            NEXT 
            IF lnIndex > .lstList.ListCount
                .lstList.ListIndex = 1
            ENDIF 
        ENDWITH 
    ENDPROC 
    
    #define K_TAB      9
    PROCEDURE txtInput.KeyPress(tnKeyCode, tnShiftAltCtrl)
        IF tnKeyCode == K_TAB
            This.Value = This.Parent.lstList.Value
        ENDIF 
    ENDPROC 
    
    PROCEDURE lstList.MouseWheel(tnDirection, tnShift, tnXCoord, tnYCoord)
        WITH This
            IF tnDirection < 0
                IF .ListIndex < .ListCount
                    .ListIndex = .ListIndex + 1
                ENDIF 
            ELSE
                IF .ListIndex > 1
                    .ListIndex = .ListIndex - 1
                ENDIF 
            ENDIF 
        ENDWITH 
    ENDPROC 
    
    PROCEDURE lstList.Click
        This.Parent.txtInput.Value = This.Value
    ENDPROC 
    
ENDDEFINE 


运行画面
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2015-11-30 01:52编辑过]

2015-11-30 01:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
不错,但有个缺点,能否模拟网页搜索框,光标停留在文本框中,光带在列表框中。
如果用键盘向下操作,要按向下键标两次才能进入列表框中。

[此贴子已经被作者于2015-11-30 08:47编辑过]


坚守VFP最后的阵地
2015-11-30 08:43
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
是的,我前几天“Textbox+listbox组成的动态列表”做的,也是存在这个问题,用向下键,按2次,才能在List中,选择,当时,我觉得功能已经够了。
今天,慢慢研究T版的代码看看。。
2015-11-30 09:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用sdta在2015-11-30 08:43:50的发言:

不错,但有个缺点,能否模拟网页搜索框,光标停留在文本框中,光带在列表框中。
如果用键盘向下操作,要按向下键标两次才能进入列表框中。


我这个就是光标在文本框中、光带在列表框中的啊。焦点不需要进入列表框中就可以操作,为什么要按两次?

授人以渔,不授人以鱼。
2015-11-30 09:29
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
**************************************************
*-- Form:         form1 (让文本框保持光标不离开.scx)
*-- 功能:让文本框保持光标不离开可随时输入字母的情况下,又能按键盘上的上下箭头键移动列表框的选择行
*-- 父类:  form
*-- 基类:    form
*-- 时间戳:   11/30/15 09:34:08 AM
*
* 主要代码由十豆三的回帖中收集的,借花献佛,请大家笑纳!
PUBLIC oform1

oform1=NEWOBJECT("form1")
oform1.Show
RETURN
DEFINE CLASS form1 AS form


    DoCreate = .T.
    Caption = "Form1"
    Name = "Form1"


    ADD OBJECT text1 AS textbox WITH ;
        Height = 20, ;
        Left = 72, ;
        Top = 36, ;
        Width = 100, ;
        Name = "Text1"


    ADD OBJECT list1 AS listbox WITH ;
        Height = 170, ;
        Left = 72, ;
        Top = 60, ;
        Width = 100, ;
        Name = "List1"


    PROCEDURE Init
        This.KeyPreview=.T.
        This.List1.Visible=.F.
        CREATE CURSOR tt (a1 c(10))
        INSERT INTO tt VALUES ("abcde")
        INSERT INTO tt VALUES ("xycde")
        INSERT INTO tt VALUES ("abcxy")
        INSERT INTO tt VALUES ("cdeab")
    ENDPROC


    PROCEDURE KeyPress
        LPARAMETERS nKeyCode, nShiftAltCtrl
        If (nKeyCode=5 Or nKeyCode=24 Or nKeyCode=13) And This.List1.Visible And This.List1.ListItemId>0 And This.Text1.Tag='1'
            If nKeyCode=13
                This.Text1.Value=This.List1.Value
                This.List1.Visible=.F.
            Else
                lnListID=Iif(nKeyCode=5,Max(This.list1.ListItemId-1,1),Min(This.list1.ListItemId+1,This.list1.ListCount))
                This.list1.ListItemId=lnListID
                Nodefault
            Endif
        Endif
    ENDPROC


    PROCEDURE text1.GotFocus
        This.Tag='1'
    ENDPROC


    PROCEDURE text1.LostFocus
        Thisform.List1.Visible=.F.
        This.Tag=''
    ENDPROC


    PROCEDURE text1.InteractiveChange
        If !Empty(This.Value)
            Thisform.list1.RowSource=Null
            Select a1 From tt Where Alltrim(This.Value)$a1 Into Cursor t1 Order By a1
            Thisform.list1.RowSourceType=6
            Thisform.list1.RowSource="t1.a1"
            If Reccount('t1')>0
                Thisform.List1.ListItemId=1
                Thisform.List1.Visible=.T.
            Else
                Thisform.List1.Visible=.F.
            Endif
        Else
            Thisform.List1.Visible=.F.
        Endif
    ENDPROC


ENDDEFINE
*
*-- EndDefine: form1


[此贴子已经被作者于2015-11-30 09:43编辑过]


坚守VFP最后的阵地
2015-11-30 09:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 4楼 TonyDeng
你的代码确实有这点问题,不是砸你场子的啊

坚守VFP最后的阵地
2015-11-30 09:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用sdta在2015-11-30 09:41:53的发言:

你的代码确实有这点问题,不是砸你场子的啊


我本来就没设计让光标进入列表框,那是漏了封掉这个入口。移动列表框中选择项,是用鼠标滚轮,不用键盘。

授人以渔,不授人以鱼。
2015-11-30 09:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
vfp没有combobox控件?实际的combobox控件textbox要加个下拉箭头,listbox是可以自动收的,不知道T版的这个是否完全模仿了。

能编个毛线衣吗?
2015-11-30 10:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 wmf2014
用过的都知道原生那个有什么问题,也知道需要怎样才好用。

授人以渔,不授人以鱼。
2015-11-30 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果要使用键盘上下键,我也不会让焦点进入列表框,而是直接在文本框中翻滚文本。

授人以渔,不授人以鱼。
2015-11-30 10:38
快速回复:TextBox+ListBox组成的MyComboBox控件
数据加载中...
 
   



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

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