It would appear that the problem you were running into was
dBASE's steadfast refusal to evaluate an expression as an
argument to @ SAY. Really you can only have a variable or a
literal as an argument to @ SAY.
The routine that I am presenting here has only been tested under
dBASE II version 2.4 (yet to be released by Ashton-Tate).
Copyright (c) 1983, by: Bill Weinman, PO Box 60807, Los Angeles,
CA 90060 pursuant to the following paragraph:
Reserving the right to sell these routines myself in any form
that I wish, I hereby donate this file in it's origional form as
of 10 May 1983 to the public domain. You may do with it as you
wish.
TIP: Try turning of the terminal's cursor! ( ?? chr(27)+'.0' for
the Televideo 950 and ?? chr(27)+'.2' to turn it back on ).
10 May 1983
Bill E. Weinman
Business Computer Services
P O Box 60807
Los Angeles, CA 90060
ENDIF F
*****************************************************************
* initialization section
set talk off
set colon off
erase
store ' ' to string
store 0 to col
store 0 to colfin
store 0 to row
@ 10,10 say 'Enter the string to be animated: ' get string
@ 11,10 say ' Enter the column to start in: ' get col pict '##'
@ 12,10 say ' Enter the column to finish in: ' get colfin pict '##'
@ 13,10 say ' Enter the line to animate on: ' get row pict '##'
read
clear gets
erase
store col+1 to initcol
store trim(string) to string
store len(string) to length
* the "if not firsttime" within the "do while not done" loop
* is to force dbase to read the entire routine into memory
* before executing it. this eliminates any disk bound delays
* in the middle of animation.
store t to firsttime
store f to done
do while .not. done
if .not. firsttime
* the animation starts here
do while (initcol-col) # length
* first, evaluate the sub-string
store $(string,1,initcol-col) to partial
@ row,col say partial
store col-1 to col
enddo
do while col > colfin
@ row,col say string+' '
store col-1 to col
enddo
* a little flash
store col+1 to col
store 0 to wait
* low is a logical switch used to control the
* alternation of the flash (only for terminals
* that support rev video or dual intensity)
store t to low
do while wait < 10
if .not. low
set inte off
@ row,col say string
store t to low
else
set inte on
@ row,col say string
store f to low
endif
store wait+1 to wait
enddo
store t to done
endif firsttime
store f to firsttime
enddo
* rele firsttime, done, row, col, wait, string, partial, length, low
set inte on