Eine kleine Erläuterung des Hintergrunds:
LOCALs dürfen zwar für, aber nicht
in Makros verwendet werden. Makros werden zur Laufzeit interpretiert. Lokale Variablen existieren zu diesem Zeitpunkt nicht mehr unter den Namen, die wir ihnen gegeben haben, sondern sind vom Compiler aufgelöst. Namentlich existieren und in einer Symboltabelle verwaltet werden nur PRIVATEs und PUBLICs. Deshalb kann man private Variablen auch in Makros verwenden. Wenn ein lexikales Element als Speicher angesprochen wird (durch Zuweisung, in Formeln und Funktionen usw.), dann sucht Xbase++ nach diesem Element in den derzeit geöffneten Workareas und in den Symboltabellen. Wenn es dort nicht gefunden wird, wird das Element durch Wertezuweisung erzeugt (ansonsten crasht die Zeile). Genau das (also das Erzeugen) passiert in Deinem Code in dieser Zeile:
Code: Alles auswählen
&("test"+ALLTRIM(STR(i))) := aTest[i,1]+" "+aTest[i,2]+" "+aTest[i,3]
Der Makroexpander macht daraus bei i = 1:
Beim Ausführen der Zeile wird geprüft, ob das lexikale Symbol (!) "test1" ein Tabellenfeld oder eine private oder globale Variable ist. Da Du "test1" als LOCAL definiert hast, wird hier nicht gesucht - zur Laufzeit weiß Xbase++ quasi nicht mehr, dass diese Variable, die Du da deklariert hast, mal "test1" hieß. Also erzeugt es hier eine zusätzliche private Variable "test1" (Du hast jetzt zwei davon). Dann kommt die nächste Zeile:
Code: Alles auswählen
MSgBox("test1: "+test1+" test2: "+test2+" test3: "+test3)
Die arbeitet ohne Makro, wird also vom Compiler entsprechend aufgelöst. Hier wird auf lokale Variable zugegriffen, so sie existieren - und das tun sie, Du hast sie ja definiert. Anders wäre das bei diesem Code:
Code: Alles auswählen
MSgBox("test1: "+&("test1")+" test2: "+&("test2")+" test3: "+&("test3"))
Hier arbeitet der Makroexpander und erzwingt den Zugriff auf private Variable.
Das ist ein Vorteil der Sprache, aber auch ein Fallstrick. Lokale Variablen können in Makros nicht verwendet werden. Erfolgt im Makro eine Wertezuweisung zu einer bis dahin nicht existenten Variablen, wird sie erzeugt.