Well I never found anything that worked, so sort of came-up with a kludge.
Basically it relies on a combination of reading the screen (via SaveScreen) and stuffing down-arrows and Ctrl-L's (the keyboard shortcut I use for "Locate text.").
It isn't pretty code, but I figured I'd post it here as someone may be able to use it.
// ==========================================
// User Defined Function (UDF) for MemoEdit
// ==========================================
FUNCTION MemoEditFind( nMode, nLine, nCol )
LOCAL nKey := LASTKEY()
LOCAL nRetVal := ME_DEFAULT // Default action
LOCAL cSearch, nFoundPos
if nMode == ME_INIT
return ME_DEFAULT
endif
if (nMode == ME_UNKEY .or. nMode == ME_UNKEYX) .and. nKey = K_CTRL_L
if SearchGet
PushRow = Row()
PushCol = Col()
@22,0 clear to 22,79
clear gets
@22,0 say " Search: " get SearchString pict "XXXXXXXXXXXXXXXXXXXXXXXXX"
read
* @22,0 say ""
* accept "Search string? " to SearchString
@PushRow,PushCol say ""
SearchGet = .f.
endif
* @22,0 say " Ctrl-L to locate text "
ThisLine = SaveScreen(row(),col(),row(),78)
ThisLine = CharOdd(ThisLine)
ThisLine = trim(CharOdd(ThisLine))
if ThisLine = LastLine
LastLineCount = LastLineCount + 1
if LastLineCount < 10
* tone(1000,1)
* ? "Duplicate Line!"
keyboard chr(24) + chr(12)
return ME_DEFAULT
else
LastLineCount = 0
SearchGet = .t.
return ME_DEFAULT
endif
else
LastLine = ThisLine
endif
LastLineCount = 0
FindIt = at(upper(trim(SearchString)),upper(ThisLine))
if FindIt > 0
* tone(2000,2)
keyboard replicate(chr(4),FindIt)
SearchGet = .t.
return ME_DEFAULT
endif
* tone(3000,3)
keyboard chr(1) + chr(24) + chr(12)
return ME_DEFAULT
endif
RETURN nRetVal