| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1895 人关注过本帖
标题:输入首个汉字拼音后列表框不能自动选择列表框的第一条,同时按回车也不能把 ...
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:20 
我提的问题焦点是:能否让键盘上的上下箭头键对表单上的列表框起作用的情况下,而表单上的文本框一直保持光标不离开可随时输入字母。  
我设计的表单上的列表框RowSourcetype是:6-字段,RowSource是:商品名.名称,拼音简码,在表单上的文本框(用于显示商品名)中先输入拼音简码时就触发interactivechange事件,在该事件中执行set filter this.value$商品名.拼音简码命令,列表框即显示相应一大批商品名,这时根据列表框显示内容的情况,有时还需在文本框中继续输入字母以缩小列表框的显示范围,而有时可直接按键盘上的上下箭头键移动列表框上的选择行到所需的商品名,这时按键盘上的回车键,商品名则进入文本框。问题是:如何让文本框保持光标不离开可随时输入字母的情况下,又能按键盘上的上下箭头键移动列表框的选择行。

--设你的表单上的这个文本框和列表框分别为:Text1和List1

1、
--表单Init事件代码:
This.KeyPreview=.T.
This.List1.Visible=.F.

2、
--表单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

3、
--Text1的GotFocus事件代码:
This.Tag='1'

--Text1的LostFocus事件代码:
Thisform.List1.Visible=.F.
This.Tag=''

--Text1的InteractiveChange事件代码:
If !Empty(This.Value)
    Thisform.list1.RowSource=Null
    Select 名称 From 商品名 Where Alltrim(This.Value)$拼音简码 Into Cursor t1 Order By 名称
    Thisform.list1.RowSourceType=6
    Thisform.list1.RowSource="t1.名称"
    If Reccount('t1')>0
        Thisform.List1.ListItemId=1
        Thisform.List1.Visible=.T.
    Else
        Thisform.List1.Visible=.F.
    Endif
Else
    Thisform.List1.Visible=.F.
Endif


楼主自己研究吧,完全符合你的要求。

坚守VFP最后的阵地
2015-02-25 18:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用gyp0117在2015-2-25 16:57:32的发言:

因为公司名称好称记些,记编码很难,同进编码也看不出是那个厂药供货。做起凭证来很难

我說的是你在表(yprk)中的記錄,不需要用全稱,應用代碼。界面顯示是一回事,在庫中儲存又是另一回事。

授人以渔,不授人以鱼。
2015-02-25 22:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
舉個例子,下面這個畫面,輸入的是拼音碼(你pytmp表中設定的)首字母,但檢索出來的是全稱。
图片附件: 游客没有浏览图片的权限,请 登录注册


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


其實輸入法搞的就是這種把戲!


[ 本帖最后由 TonyDeng 于 2015-2-25 23:46 编辑 ]

授人以渔,不授人以鱼。
2015-02-25 23:40
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
也就是說,像我上面這樣處理界面的顯示,但你用【保存】按鈕保存記錄的時候,完全可以在yprk中記錄藥商的編碼,而不是全稱。

授人以渔,不授人以鱼。
2015-02-25 23:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
運行看看:
kdmb.rar (15.61 KB)

授人以渔,不授人以鱼。
2015-02-26 00:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
源代碼僅供參考(缺文件不能編譯和運行),運行效果見.exe:

kdmb.rar (21.73 KB)


與15樓不同之處是增補了點擊列表項選擇。

程序代码:
CLEAR ALL
CLEAR
SET PATH TO "Data" ADDITIVE
SET PROCEDURE TO myForm ADDITIVE
Main()
CLEAR ALL
RETURN

PROCEDURE Main()
    LOCAL loMainForm
    loMainForm = CREATEOBJECT("C_MainForm")
    WITH loMainForm
        .Caption = "Test"
        .AutoCenter = .T.
        .Show
    ENDWITH
    READ EVENTS
ENDPROC

DEFINE CLASS C_MainForm AS myForm

    ShowWindow = 2
    ShowTips = .T.
    MinWidth = 600
    MinHeight = 400
   
    ADD OBJECT Selector AS myComboBox WITH Top = 5, Left = 5, Caption = "藥品公司:"
    ADD OBJECT lblTips  AS Label      WITH Caption = "將被掩蓋和恢復的控件", Top = 50, Left = 50, FontSize = 30, AutoSize = .T.
   
    PROCEDURE Load
        OPEN DATABASE "mfcx"
        USE "pytmp" IN 0
    ENDPROC
   
    PROCEDURE Unload
        USE IN "pytmp"
        SET DATABASE TO "mfcx"
        CLOSE DATABASES
    ENDPROC
   
    PROCEDURE Arrange
        WITH This.Selector
            .Height = 200
            .Width = ThisForm.Width - .Left - 5
        ENDWITH
    ENDPROC
   
ENDDEFINE

*-----------------------------
* 自定義組合框控件
*-----------------------------
DEFINE CLASS myComboBox AS Container

    BorderStyle = 0
    BorderWidth = 0
    Width = 300

    Caption = ""
    PROCEDURE Caption_Assign(tcString)
        WITH This
            .Caption = tcString
            .lblCaption.Caption = .Caption
        ENDWITH
    ENDPROC

    ADD OBJECT PROTECTED lblCaption AS Label   WITH Top = 0, Left = 0, Height = 25, AutoSize = .T.
    ADD OBJECT PROTECTED txtInput   AS TextBox WITH Top = 0, Height = 25, Value = ""
    ADD OBJECT PROTECTED lstItems   AS ListBox WITH Visible = .F.
   
    HIDDEN PROCEDURE Arrange
        WITH This
            .txtInput.Left = .lblCaption.Left + .lblCaption.Width
            .txtInput.Width = .Width - .txtInput.Left
            .lstItems.Top = .txtInput.Top + .txtInput.Height + 2
            .lstItems.Left = .txtInput.Left
            .lstItems.Height = .Height - .lstItems.Top
            .lstItems.Width = .txtInput.Width
        ENDWITH
    ENDPROC
   
    PROCEDURE Init
        This.lblCaption.Caption = This.Caption
        This.Arrange
    ENDPROC
   
    PROCEDURE Resize
        This.Arrange
    ENDPROC
   
    PROCEDURE txtInput.InteractiveChange
        WITH This.Parent.lstItems
            IF !.Visible
                .Show
            ENDIF
            .Init(UPPER(ALLTRIM(This.Value)))
        ENDWITH
    ENDPROC
   
    PROCEDURE txtInput.KeyPress(tnKeyCode, tnShiftAltCtrl)
        IF tnKeyCode == 13    && ENTER
            WITH This.Parent.lstItems
                This.Value = .ListItem(.ListIndex)
                .Hide
            ENDWITH
        ENDIF
    ENDPROC
   
    HIDDEN PROCEDURE lstItems.Show
        This.Visible = .T.
        This.Parent.ZOrder(0)
    ENDPROC
   
    HIDDEN PROCEDURE lstItems.Hide
        This.Visible = .F.
        This.Parent.ZOrder(1)
    ENDPROC
   
    PROCEDURE lstItems.Init(tcString)
   
        IF (PCOUNT() == 0) .OR. (VARTYPE(tcString) != "C")
            tcString = ""
        ENDIF
       
        WITH This
            .Clear
            SELECT "pytmp"
            LOCAL lnRecord
            lnRecord = RECNO()
            SCAN ALL FOR pytmp.pym = tcString
                .AddItem(ALLTRIM(pytmp.xmmc))
            ENDSCAN
            GOTO lnRecord
            .ListIndex = 1
        ENDWITH
       
    ENDPROC
   
    PROCEDURE lstItems.Click
        WITH This
            .Parent.txtInput.Value = .ListItem(.ListIndex)
            .Hide
        ENDWITH
    ENDPROC
   
ENDDEFINE




[ 本帖最后由 TonyDeng 于 2015-2-26 14:05 编辑 ]

授人以渔,不授人以鱼。
2015-02-26 00:34
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 16楼 TonyDeng
楼主布置完作业,休息了,你辛苦了

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

楼主布置完作业,休息了,你辛苦了

要對得起我描紅啊,你又把老靜和罵我的帖子刪了。

授人以渔,不授人以鱼。
2015-02-26 00:47
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
真的不是我删除的,肯定是老静做的好事

坚守VFP最后的阵地
2015-02-26 01:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
順便談談數據表的設計問題。你的藥商數據表,應設計至少3個字段,正規編碼、全稱、拼音編碼。這就如計算機的漢字輸入法系統,正規編碼就是漢字内碼,一般人是不用知道的,也不會對外公開;全稱就是顯示的字符,或字符串,實際上詞組和單字的檢索沒有區別;拼音編碼即是所謂的輸入碼,你不用拼音,用五筆也可以,自己創造輸入法也可以。使用的時候,就用輸入碼與用戶交互,但機内是使用内碼的。你的入庫記錄,應記錄内碼,而不是全稱。如果你還是沿用現在的設計,將來會遇到大麻煩的,舉個例子,當發現某個藥商的名字輸入錯了,或它改名了,要糾正過來,那就得把所有記錄全稱的表和記錄都刷寫一遍,還很容易遺漏或搞錯(有些名字是相似或相近的可能造成你批量修改出錯),但如果按我說的設計,就衹需要在基礎表中修改一下就可以了。不要以爲這樣的拆分是多餘的,須知你現在所節省的,將來可能會付出更多的代價,甚至那些代價可能會沒完沒了,運行維護的成本由你當時的偷懶造成。很多人寫程序貪圖快速,忽視設計,與現在的產業模式區分開發和維護有關,開發寫完了扔給維護擦屁股,如果要那些開發負責維護到底,看他們幾年之後還敢這樣寫程序不。

計算機的漢字輸入,本質上就是一些字符串内碼的處理,就算在純英文系統下,也一樣可以處理漢字的輸入。漢字要正常顯示出來,是顯示系統的事,它負責把内碼從數據庫中檢索出字的圖形顯示出來,對數據處理來説,根本不需要看到漢字。很多人困惑於漢字的處理與純英文不同,實際上是不懂上述原理,以爲非要看到字形才算,那是不能抽象化思維了。


[ 本帖最后由 TonyDeng 于 2015-2-26 01:47 编辑 ]

授人以渔,不授人以鱼。
2015-02-26 01:44
快速回复:输入首个汉字拼音后列表框不能自动选择列表框的第一条,同时按回车也不 ...
数据加载中...
 
   



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

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