|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
Ruey
註冊時間: 2003-03-12 文章: 1698 來自: tunglo
第 1 樓
|
發表於: 星期四 十一月 20, 2003 10:25 am 文章主題: 如何在文本框中實現遞增搜索(轉貼) |
|
|
如何在文本框中實現遞增搜索
( 作者: 不詳 )
最後更新日期: April 4, 1997
文號: Q166378
本文資訊適用於:
Microsoft Visual FoxPro for Windows, versions 5.0, 5.0a
概述
下拉式列示方塊具有遞增搜索屬性, 當設置爲 .T. 時, 用各擊鍵搜索下拉式列示方塊的 Control Source. 因此, 如果用戶打入字串 "ABC", 將會在各擊鍵後搜索表, 首先搜索字母 "A", 然後搜索串 "AB", 最後是串 "ABC".
雖然這是一個非常有用的屬性, 搜索的實情是由行動觸發,而不是無行動引發的用戶介面問題--用戶可能不想象他們輸入串一樣搜索串中的字母, 而寧願在整個串都輸入完後搜索整個串. 文本框沒有遞增搜索屬性, 但可以類比該動作, 並在用戶停止輸入後執行搜索, 而不是在用戶正在輸入時.
本文中的代碼創建一個實現了遞增搜索的, 完全的可編輯文本框. 使用一個計時器, 當用戶在一個指定的時間段中沒有按鍵時遞增搜索被觸發.
更多資訊
創建一個新表單, 並從 Samples 目錄下的 Testdata 資料庫中添加 Customer 表到資料環境. 拖動表到表單上創建一個表格. 向表單添加三個自定義屬性: PREVAL, TICKCOUNT 和 HOLDVALUE. 修改 PREVAL 和 HOLDVALUE 的預設值爲空格. 修改 TICKCOUNT 的預設值爲 0.
向表單添加一個名爲 SearchVal 的自定義方法. 添加以下代碼到該方法中:
* 僅在文本框中的值改變時才 seek
IF !(THIS.PREVAL == ALLTRIM(THIS.TEXT1.VALUE))
* 設置早期的值爲當前值
THIS.PREVAL = ALLTRIM(THIS.TEXT1.VALUE)
* Seek 文本值
GO TOP
SEEK THIS.PREVAL
IF FOUND()
* 自定義屬性 holdvalue 用於保存用戶輸入的串.
THISFORM.HOLDVALUE = THIS.PREVAL
* 這設置焦點到表格因此定位的記錄顯示在表格中並且
* RecordMark 是打開的
THISFORM.GRID1.SETFOCUS
* 直接重置焦點到文本框
THIS.TEXT1.SETFOCUS
THIS.TEXT1.VALUE = THISFORM.HOLDVALUE
THIS.TEXT1.SELSTART = LEN(THISFORM.HOLDVALUE)
ENDIF
ENDIF
添加一個計時器到表單, 並設置 Interval 屬性值爲 50. 在計時器控制項的 Timer 事件中添加以下代碼:
THIS.PARENT.TICKCOUNT = THIS.PARENT.TICKCOUNT + 1
IF THIS.PARENT.TICKCOUNT >= 20
THIS.PARENT.TICKCOUNT = 0
THIS.PARENT.SEARCHVAL()
ENDIF
添加一個文本框到表單中. 不要爲它指定 control source. 在表單的 Load 事件中, 輸入以下命令:
SET ORDER TO CUST_ID && 或其他的 cust_id 欄位的索引標識名.
添加以下代碼到文本框的 KeyPress 事件中:
LPARAMETERS nKeyCode, nShiftAltCtrl
* 注意: The SHIFT-方向鍵高亮工作, 介不標準.
* 例如, SHIFT-左箭頭高亮三個右邊的字元, 然後按下右箭頭鍵, 只會
* 增加當前位置一. 在許多編輯器中, 這樣做
* 增加當前位置四. 但是 ,爲了類比該行爲, 需要保存最後的按鍵到一個變數中,
* 然後檢查它來找出最後移動的方向, 然後進行一個計算處理...
* 但這種努力看來似乎沒什麽價值.
LOCAL nPos, nLen, nSel
nPos = THIS.SELSTART && 當前游標位置
nLen = LEN(ALLTRIM(THIS.VALUE)) && 文本框中的文本長度
nSel = THIS.SELLENGTH && 選定的字元數
THIS.PARENT.TICKCOUNT = 0
* 關閉 Keypress 事件中的所有默認處理;
* 要用代碼來處理, 這是必須的
NODEFAULT
DO CASE
* 檢查/捕捉 nKeycode >= 65, <= 122 (限制輸入爲字母
* nKeycode = 32 (允許空格). 要允許
* 輸入數位或其他字元,
* 參考幫助文件中的 INKEY() 主題
* 39 是單引號
CASE (nKeyCode >= 65 AND nKeyCode <= 122) OR nKeyCode = 32;
OR nKeyCode = 44 OR nKeyCode = 45 OR nKeyCode = 39
* 插入新的字元在右邊
THIS.VALUE = UPPER(LEFT(THIS.VALUE, nPos) + ;
CHR(nKeyCode) + RIGHT(THIS.VALUE,;
nLen - (nPos + nSel)))
* 增加我們的位置變數, 這樣我們在後面放入一個新字母
nPos = nPos + 1
nSel = 0
* 檢查/捕捉 SHIFT-左箭頭組合 (左高亮度)
CASE nKeyCode = 52
* 向左邊移動一位, 選定數量加一
IF nPos > 0
nPos = nPos - 1
nSel = nSel + 1
ENDIF
* 檢查/捕捉 SHIFT-右箭頭組合 (右高亮度)
CASE nKeyCode = 54
* 增加選定數一, 如果有更多的選定
IF (nPos + nSel) < nLen
nSel = nSel + 1
ENDIF
* 檢查/捕捉 SHIFT-HOME 組合 (左結束高亮)
CASE nKeyCode = 55
* Set the number of characters selected to the number of
* characters between our current position and the start
* position, then move to the start position
nSel = nSel + nPos
nPos = 0
* 檢查/捕捉 SHIFT-END (右結束高亮)
CASE nKeyCode = 49
* Set the number of characters selected to the number to
* the right of our current position
nSel = nLen - nPos
* 檢查/捕捉 LEFT-ARROW
CASE nKeyCode = 19
* Deselect any selected characters
nSel = 0
* Move left one
IF nPos > 0
nPos = nPos - 1
ENDIF
* 檢查/捕捉 RIGHT-ARROW
CASE nKeyCode = 4
* Deselect any selected characters
nSel = 0
* Move right one
IF nPos < nLen
nPos = nPos + 1
ENDIF
* 檢查/捕捉 HOME
CASE nKeyCode = 1
* Deselect any selected characters
nSel = 0
* Move to the start
nPos = 0
* 檢查/捕捉 END
CASE nKeyCode = 6
* Deselect any selected characters
nSel = 0
* Move to the end
nPos = nLen
* 檢查/捕捉 DELETE
CASE nKeyCode = 7
* If we have not 'highlighted' the letter we want to delete,
* the count of letters to delete will be zero, so we have
* to manually set the letter to remove
IF nSel = 0
nSel = 1
ENDIF
* Rebuild the string without the deleted character(s)
THIS.VALUE = LEFT(THIS.VALUE, nPos) + ;
RIGHT(THIS.VALUE, nLen - (nPos + nSel))
* Deselect any selected characters
nSel = 0
* 檢查/捕捉 BACKSPACE
CASE nKeycode = 127
* If no letters are 'highlighted', just delete the one
* before the cursor and
* move the cursor back one
IF nSel = 0
IF nPos > 0
THIS.VALUE = LEFT(THIS.VALUE, nPos - 1) + ;
RIGHT(THIS.VALUE, nLen - nPos)
nPos = nPos - 1
ENDIF
* If letters are highlighted, remove the block of
* highlighted letters, and don't move the cursor
* (just like hitting DELETE)
ELSE
THIS.VALUE = LEFT(THIS.VALUE, nPos) + ;
RIGHT(THIS.VALUE, nLen - (nPos + nSel))
ENDIF
* Deselect any selected characters
nSel = 0
ENDCASE
* Get rid of whitespace at the end of the entered word
IF nLen != LEN(ALLTRIM(THIS.VALUE))
THIS.MAXLENGTH = LEN(ALLTRIM(THIS.VALUE)) + 1
ENDIF
* This moves the cursor to the current position in the string in the
* text box
THIS.SELSTART = nPos
* And this selects the proper number of characters
THIS.SELLENGTH = nSel
保存並運行表單. 在文本框中打入要查找的欄位. 在短暫的停留後, 任何匹配的欄位將被定位且在表格中顯示出來. 用不同的時間間隔試驗, 直到你找到一個你覺得滿意的值.
一般注意
在該示例中, 假定文本框名爲 Text1. 如果文本框的不同, 修改代碼中的有關部分.
NODEFAULT 命令關閉 KeyPress 事件所有的默認處理, 並允許代碼完全控制按鍵處理. 該命令是必須的.
正象在注釋中注明, 修改模仿並不完美, 但它已經相當接近目的了. _________________ #############################
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
學會VFP使用者社區的搜尋,Code才會更有趣~
############################# |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|