  | 
				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 堆 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |