VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

[原創]VFP 之 MLINE() 函數改良

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
朱育興



註冊時間: 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
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
ericklin



註冊時間: 2007-11-14
文章: 107
來自: 台中市

第 2 樓

發表發表於: 星期三 五月 16, 2012 9:42 pm    文章主題: 引言回覆

好用 like 堆
回頂端
檢視會員個人資料 發送私人訊息 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作