>Hi,
>how do I write the code for the following example in order to use name expression and to avoid macro substitution?
>
>I have the names of tables named like tablename1, tablename2 etc. The names are created by lcDbf="tablename"+ALLTRIM(STR(i)), where i is a number 1,2 etc. In each table I have a field named "cfield". the referenced field is stored in the variable lcField=lcDbf+".cfield". Further I have the following string in a form lcString="Thisform.Check"+ALLTRIM(STR(i))+".Caption"
>To set the caption I use &lcString=&lcDir, which works. I have tried to avoid macro substitution by doing the following:
>
>&lcString=(lcDir), does not work
>&lcString=EVALUATE(lcDir), works (but EVALUATE() is not a name expression?)
>(lcString)=EVALUATE(lcDir), generates the error "unrecognized command verb"
>EVALUATE(lcString))=EVALUATE(lcDir), generates the error "syntax error"
>
>In this case it looks like you can not entirely avoid macro substitution, or do you have any sugestion?
You could use :
store eval(m.lcDir) to (m.lcString)
or :
store eval(m.lcDir) to ("Thisform.Check"+ALLTRIM(STR(i))+".Caption")
or :
store eval("tablename"+ALLTRIM(STR(ix))+".cField") to ;
("Thisform.Check"+ALLTRIM(STR(i))+".Caption")
Genarally I need to set more than one properties thus I prefer a style like :
for ix=1 to lnObjects
with eval("Thisform.Check"+ALLTRIM(STR(ix)))
.Caption = eval("tablename"+ALLTRIM(STR(ix))+".cField")
.Someproperty = ...
endwith
endfor
Cetin