|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
朱育興
註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
第 1 樓
|
發表於: 星期日 一月 04, 2004 2:14 pm 文章主題: [原創]VFP 之 MLINE() 函數改良 |
|
|
* 為求排版美觀,空白為全形,若要測試,請轉為半形後再測試
FUNCTION F_MLine
* 2004/01/04 朱育興 YSC E-Mail:y5096@ms23.hinet.net
* 說明:MLINE() 的功能改良
* --------------------------------------------------------------------------------------
* 變數名稱 型態 說明
* --------------------------------------------------------------------------------------
* Input : L_mcMemoFieldName C 代表附註欄位或字串。
* L_nLineNumber N 代表在所指定之 L_mcMemoFieldName 中,由
* L_nNumberOfCharacters 位置開始之指定列號。
* (L_nNumberOfCharacters) N 代表由偏離附註欄位開頭 L_nNumberOfCharacters 個
* 字元的位置開始計算 L_nLineNumber。
* ˇ 0
* (L_nMemoWidth) N 代表在 L_mcMemoFieldName 中每一取得的列之內容,其
* 最多能取得的最大字元數。
* ˇ Set("MEMOWIDTH")
* Output: MLineo_cCurLine C 傳回所指定之 L_mcMemoFieldName 中之指定列號
* L_nLineNumber 的列內容。
* --------------------------------------------------------------------------------------
* 說明:
* 1. 與 MLINE() 的功能相同,但保留 Dos 版本有關 MLINE() 全形字的處理能力。
*
* 2. MLINE() 的 2 大缺點:
* a. 動作範圍內最右方的全形字被截斷時有下列 2 種處理方式:
* i. 為保持全形字的完整,尋找動作範圍內最右方的「空白字元」作為終點。
* ii. 如果找不到空白字元則最右方之全形字會被截斷成亂碼。
* b. MEMLINES() 函數會依上項的處理方式回應行數。
*
* 0 1 2
* 例如: 123456789012345678901234
* M_ADDR = "台中市 406 北屯區_三光巷"
* SET MEMOWIDTH TO 12
*
* _MLINE = 0
* ? MLINE(M_ADDR,1,_MLINE) && --> "台中市 406 "
*
* * ------------------------------------------------------ *
* * 「北」字被截斷的情況下尋找最右方的「空白字元」作為終點,
* * 如果找不到空白字元則最右方之全形字會被截斷成亂碼。
* * 註: 下面 # 代表亂碼
* * ------------------------------------------------------ *
*
* ? MLINE(M_ADDR,1,_MLINE) && --> "北屯區_三光#"
* ? MLINE(M_ADDR,1,_MLINE) && --> "#"
*
* _MLINE = 0
* ? F_MLine(M_ADDR,1,_MLINE) && --> "台中市 406 "
* ? F_MLine(M_ADDR,1,_MLINE) && --> "北屯區_三光"
* ? F_MLine(M_ADDR,1,_MLINE) && --> "巷"
*
* 3. 為了解決 Set Memowidth to 不得小於 8 的限制,方法如下:
*
* 例如:欲以 6 的長度為 Memowidth,則:
* ? F_MLine("1234567890",1,0,6) && --> "123456"
* ? F_MLine("1234567890",2,0,6) && --> "7890"
*
* 4. MLINE() 函數處理 CHR(10) 與 CHR(13) 的原則
* a. CHR(10):
* 它每擷取一列的內容時,CHR(10) 字元忽略不納入該列的內容中;但 _MLINE 值會加 1。
* b. CHR(13):
* 它每擷取一列的內容時,CHR(13) 字元忽略不納入該列的內容中;但 _MLINE 值會加 1,
* 且該列內容就到此結束。
* c. 如果該列內容擷取結束之過程中並不是因 CHR(13) 的因素而是達到其最多能取得的最大
* 字元數,在此情況下:
* i. 若下一個字元是 CHR(13) 字元時,_MLINE 值會加 1。
* ii. 若下一個字元是 CHR(10) 字元時,_MLINE 值會加 1,且繼續讀取下一個字元,若還
* 是 CHR(10) 字元,則處理方式同前,直到不是 CHR(10) 字元才停止。
* --------------------------------------------------------------------------------------
PARAMETERS L_mcMemoFieldName,L_nLineNumber,L_nNumberOfCharacters,L_nMemoWidth
* 參數預設
IF PCOUNT() <= 2
MLine_nStartPosition = 0
ELSE
MLine_nStartPosition = MAX(L_nNumberOfCharacters,0)
ENDIF
IF PCOUNT() <= 3
MLine_nMEMOWIDTH = SET("MEMOWIDTH")
ELSE
MLine_nMEMOWIDTH = MAX(L_nMemoWidth,0)
ENDIF
MLineo_cCurLine = SPACE(0)
MLine_cMemoField = SUBSTR(L_mcMemoFieldName,MLine_nStartPosition+1)
MLine_nNumberOfCharacters = 0
FOR MLine_nSUB_A = 1 TO L_nLineNumber
MLine_mSubstr = SUBSTR(MLine_cMemoField,MLine_nNumberOfCharacters+1)
* 取得 MLineo_cCurLine 與合法的 CHR(13) 字元數
MLineo_cCurLine = CHRTRAN(MLine_mSubstr,CHR(10),SPACE(0))
MLine_nChr13CNT = IIF(SUBSTR(MLineo_cCurLine,MLine_nMEMOWIDTH+1,1)=CHR(13),1,0)
MLineo_cCurLine = SUBSTR(MLineo_cCurLine,1,MLine_nMEMOWIDTH)
MLine_nAtChr13 = AT(CHR(13),MLineo_cCurLine)
IF MLine_nAtChr13 != 0
MLine_nChr13CNT = 1
MLineo_cCurLine = LEFT(MLineo_cCurLine,MLine_nAtChr13-1)
ENDIF
MLineo_cCurLine = LEFTC(MLineo_cCurLine,LENC(MLineo_cCurLine))
* 取得合法的 CHR(10) 字元數
MLine_nChr10CNT = 0
MLine_nAtChr13 = AT(CHR(13),MLine_mSubstr)
IF MLine_nAtChr13 != 0
MLine_mSubstr = SUBSTR(MLine_mSubstr,1,AT(CHR(13),MLine_mSubstr)-1)
ENDIF
MLine_mSubstr = CHR(10) + MLine_mSubstr + CHR(10)
MLine_cStr4Chr10 = SPACE(0)
FOR MLine_nSUB_B = 1 TO OCCURS(CHR(10),MLine_mSubstr)-2
MLine_cStr4Chr10 = MLine_cStr4Chr10 + STREXTRA(MLine_mSubstr,CHR(10),CHR(10),MLine_nSUB_B)
IF LEN(MLine_cStr4Chr10) > MLine_nMEMOWIDTH
EXIT
ENDIF
MLine_nChr10CNT = MLine_nChr10CNT + 1
ENDFOR
* 計算與偏離附註欄位開頭 L_nNumberOfCharacters 個字元後所移動的字元數
MLine_nNumberOfCharacters = MLine_nNumberOfCharacters + LEN(MLineo_cCurLine) + ;
MLine_nChr13CNT + MLine_nChr10CNT
ENDFOR
_MLINE = MLine_nStartPosition + MLine_nNumberOfCharacters
RETURN MLineo_cCurLine |
|
回頂端 |
|
|
ericklin
註冊時間: 2007-11-14 文章: 107 來自: 台中市
第 2 樓
|
發表於: 星期三 五月 16, 2012 9:42 pm 文章主題: |
|
|
好用 like 堆 |
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|