VFP function to get the first line of a piece of text
Here are the three techniques
function GetFirstLineMLINE( tcMultilineText as string, tnMaxLen as Integer )
local lnSaveMemoWidth, lnSaveMLine, lcReturn
lnSaveMLine = _mline
lnSaveMemoWidth = set("Memowidth")
set memowidth to m.tnMaxLen
lcReturn = mline(m.tcMultiLineText,1)
set memowidth to m.lnSaveMemoWidth
if _mline< =len(m.tcMultiLineText)
_mline = m.lnSaveMLine
return left(m.lcReturn,m.tnMaxLen-2)+'..'
else
_mline = m.lnSaveMLine
return m.lcReturn
endif
function GetFirstLineAT( tcMultilineText as string, tnMaxLen as Integer ) local nPos1, nPos2 nPos1 = at(chr(13),m.tcMultilineText) nPos2 = at(chr(10),m.tcMultilineText) if m.nPos1==0 nPos1 = len(m.tcMultiLineText) endif if m.nPos2>0 nPos1 = min(m.nPos1,m.nPos2) endif if (m.nPos1-1 < = m.tnMaxLen) and m.nPos1<=len(m.tcMultiLineText) return left(m.tcMultilineText,m.nPos1-1) else return left(m.tcMultilineText,m.tnMaxLen-2)+'..' endif
function GetFirstLineALINE( tcMultilineText as string, tnMaxLen as Integer ) local laLine[1], nLines nLines = alines(laLine,m.tcMultiLineText) if ( len(laLine[1]) < = m.tnMaxLen and m.nLines==1 ) return laLine[1] else return left(laLine[1],m.tnMaxLen-2)+'..' endif
And finally the hybrid version. Note it differs somewhat from the final function to be a fairer comparison
function GetFirstLineHybrid(tcMultilineText as string, tnMaxLen as Integer )
* Optimize out the case of a short string
if (len(m.tcMultilineText)< =m.tnMaxLen ;
and (not chr(13)$m.tcMultilineText) ;
and (not chr(10)$m.tcMultilineText) )
return m.tcMultilineText
else
* extract the first line
local lnSaveMemoWidth, lnSaveMLine, lcReturn
lnSaveMLine = _mline
lnSaveMemoWidth = set("Memowidth")
set memowidth to m.tnMaxLen
lcReturn = mline(m.tcMultiLineText,1)
_mline = m.lnSaveMLine
set memowidth to m.lnSaveMemoWidth
return left(m.lcReturn,m.tnMaxLen-2)+'..'
endif
THE END