Post by Gerdi » 24 Sep 2020, 16:34
Wenn man die Skript-Ausgabe nicht nur ansehen will, sondern wirklich als Eingabe für neu Skripte verwenden will, dann fehlen bei der vorigen Lösung noch die Hochkommas für die Werte der Objekt-Keys, wenn sie keine
Numbers sind. Die Hochkomma Einrahmung der nicht Number Werte schlägt nur zu wenn die betreffenden Default-Einstellungen nicht verändert werden. Des Weiteren wurden 2 Trimm() Funktionen entfernt, die noch Überbleibsel einer älteren Version waren in der die Zeile mit der Rekursion ein "`r`n" am Zeilenende hatte, dadurch entstand Müll der mit Trim entfernt wurde.
Im Beispiel unten lässt der 1. MsgBox-Befehl alle Werte in Hochkommas einrahmen.
Hinweis: 2 Innen-Hochkommas direkt nebeneinander ergeben 1 wirksames. Der 2. MsgBox-Befehl gibt Numbers ohne Hochkommas aus.
Code: Select all
A := {}
A.Name := "Demo Objekt"
A.Zweck := "nur Demo (Objekt hat keinen realen Nutzen)"
A.B := {}
A.B.Zaehler := 1
A.B.KommaZahl := -5.589
A.B.C := {}
A.B.C.D := {}
A.B.C.D.a := "VW"
A.B.C.D.b := "BMW"
A.B.C.D.E := {}
A.B.C.D.E.F := {}
A.B.C.D.E.F.G := {}
A.B.C.D.E.F.G.1 := {}
A.B.C.D.E.F.G.1 := {KeyA: "ValueA", KeyB: "ValueB",KeyN: "...", KeyZ: "WertZ"}
; A.B.C.D.E.F.G.2 := A ; Zirkelbezug zum Testen
A.B.C.D.E.F.G.H := "Pedal"
A.B.C.D.1 := "Daimler"
; HochK="
; Te :=" := " HochK
MsgBox % O_GetAll_(A,"A",,, """" ," := """)
; MsgBox % O_GetAll_(A,"A",,,HochK,Te)
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
MsgBox % O_GetAll_(A,"A")
; Clipboard := O_GetAll_(A)
GetAll(o,oN="",NT="",Ke="",Ve="", WZ="",T="1",V=""){ ; fuer die Anzeige eines Objektes ; oN -> Objekt Name Nt -> Trenner Ke -> KeyEnde ; Ve -> Value Ende WZ -> Wert ZuweisugsZeichen nur intern: T -> Tiefe ; V -> fuer interne Vaeter
; Aufrufbeispiele:
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
; oder ueber O_GetAll_()
IP := false
if (WZ = " := " and Ve = "")
IP := true
if(T>99)
{
SoundBeep,300
return "Error Abruch wegen Zirkelbezug oder zu hoher Verschachtelungstiefe."
}
for key,val in o
{
if (IsObject(val))
{
ges .= V NT key Ke "`r`n" ; Listet Enden ohne Blaetter
ges .= GetAll(val,oN,NT,Ke,Ve,WZ,T+1,V NT key) ; Listet Rekursiv
}
else
{
if IP
{
if val is not number
HK="
else
HK:=
}
ges .= V NT key WZ HK val Ve HK "`r`n" ; Listet Blaetter
}
}
return ges
}
O_GetAll_(o,oN="",NT=".",Ke="",Ve="", WZ="",T="1"){ ; fuer die Anzeige eines Objektes in AHK einlese Schreibweise
; Aufrufbeispiele:
; MsgBox % O_GetAll_(A,"A")
; MsgBox % O_GetAll_(A)
if (WZ="")
WZ:=" := "
else if (WZ=0)
WZ:=""
if (Ke="")
Ke:=" := {}"
if (Ke=0)
Ke:=""
if (oN="")
oN:="Obj"
ges := GetAll(o,oN,NT,Ke,Ve, WZ)
Loop, Parse,ges,`n,`r
{
if((A_LoopField)<>"")
cges .= oN A_LoopField "`r`n"
}
if(IsObject(o) and oN<>"")
cGes := oN Ke "`r`n" cGes
return cGes
}
Unten folgen jeweils die neueste Funktionen mit Aufrufbeispielen, wobei mein Ziel ist, dass man den Output in eine Datei schreiben kann, die dann über #Include eingelesen werden kann und dadurch ein Duplikat des Ursprünglichen Objektes entsteht.
Code: Select all
; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
B := [[[6,"Sieben",8],[8,9,10],[10,11]] , [[9,10,11],[11,12,13],[13,14,15]] , [[12,13,14],[14,15,16],[16,17,18]]]
B[1,3,3] := "Zwoelf"
B[2,2,2] := "Zwoelf"
B.1.1.1 := "ZWOELF"
A := {}
A.Name := "Demo Objekt"
A.Zweck := "nur Demo (Objekt hat keinen realen Nutzen)"
A.B := {}
A.B.Zaehler := 1
temp0 := "Komma-Zahl"
A.B[temp0] := -5.589
A.B.WasMitProzent := "-5.589%"
Temp1:="Leerzeichen Key"
Temp2:="Tabulator im" A_Tab "Key"
A.B[Temp1] := {}
A.B[Temp1][Temp2] := "Der Schlüssel-Name ist: Tabulator im" A_Tab "Key"
A.B.C := {}
A.B.C.D := {}
A.B.C.D.a := "VW"
A.B.C.D.b := "BMW"
A.B.C.D.E := {}
A.B.C.D.E.F := {}
A.B.C.D.E.F.G := {}
A.B.C.D.E.F.G.2 := B.1.1
; A[B,C,D,a]:= Porsche
A.B.C.D.E.F.G.1 := {}
A.B.C.D.E.F.G.1 := {KeyA: "ValueA", KeyB: "ValueB",KeyN: "...", KeyZ: "WertZ"}
; A.B.C.D.E.F.G.2 := A ; Zirkelbezug zum Testen
A.B.C.D.E.F.G.H := "Pedal"
A.B.C.D.E.F.G["""Ha""ns"] := "P""ed""al"
A.B.C.D.1 := "Daimler"
; Clipboard := GetAll(A,"A",15,A_Tab,A_Tab,,A_Tab)
; Te :=" := " HochK
; MsgBox % O_GetAll_(A,"A",15,,, """" ," := """)
; MsgBox % GetAll(A,"A",15,A_Tab,A_Tab,,A_Tab)
Clipboard := O_GetAll_(A,"A",11)
MsgBox % Clipboard
; MsgBox % ___KeyA A_Tab ___KeyB A_Tab ___KeyN A_Tab ___KeyZ ; diese Zeile zeigt wie unsauber AHK mit Dynamischen lokalen Variablen umgeht, sie sollte eigentlich nichts anzeigen.
; Hilft bei:
; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
; dient direkt zur Anzeige von Objekten oder zum Textvergleich 2er Objekte. wenn die Ausgaben 2er Übjekte gleich sind, dann sind auch di Objekte gleich!
GetAll(o,oN="",MT="",NT="",Ke="",Ve="", WZ="",T="1",V=""){ ; fuer die Anzeige eines Objektes ; oN -> Objekt Name Nt -> Trenner Ke -> KeyEnde ; Ve -> Value Ende WZ -> Wert ZuweisugsZeichen nur intern: T -> Tiefe ; V -> fuer interne Vaeter
; Aufrufbeispiele:
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
; oder ueber O_GetAll_()
IP := false
if (WZ = " := " and Ve = "") ; wenn Ausnahmebehandlungen gewuenscht
IP := true
if(MT="")
MT := 16
if(T>MT)
{
SoundBeep,300 ; Tonsignal bei erreichender willkuerlichen Maximaltiefe
return A_Tab "Error Abruch wegen Zirkelbezug oder zu hoher Verschachtelungstiefe." A_Tab
}
for key,val in o ; Schleife uber alle Key's und Werte des Objektes
{
HK2:=""
if(IP and not TryKey(Key)) ; wenn Ausnahmebehandlungen gewuenscht und wenn notwendig
{
HK2=``"
StringReplace,key,key,","", ; "" werden beim Einlesen zu " das gilt auch beim Ruecklesen
}
; MsgBox % "Ausnahmebehandlung fuer >>>" Key "<<<"
if (IsObject(val))
{ ; wenn Val kein Wert sondern Objekt, dann rekursif tiefer rein
ges .= V NT HK2 key HK2 Ke "`r`n" ; Listet Enden ohne Blaetter
ges .= GetAll(val,oN,MT,NT,Ke,Ve,WZ,T+1,V NT HK2 key HK2) ; Listet Rekursiv ; Rekursiver Aufruf
}
else
{
if IP
{ ; wenn Unterscheidung zwischen numerischen und String-Werten gewuenscht
if val is not number
HK=" ; Werte mit "
else
HK:= ; Werte ohne "
}
if IP
StringReplace,val,val,","",All ; "" werden beim Einlesen zu " das gilt auch beim Ruecklesen
ges .= V NT HK2 key HK2 WZ HK val Ve HK "`r`n" ; Listet Blaetter
}
}
return ges
}
TryKey(Var){ ; Prueft Key-Variable ob der Key in der Notation Obj.Key := Val vertraeglich ist.
try
{
___%Var% := "egal " ; wegen der Schwachstelle in AHK, locale Variablen nicht konsequent lokal zu lassen, werden hier die 3mal Unterstrich Variablen eingefuehrt. Vorschlag: Die ___Vars werden nur in Funktionen verwendet, in Hauptprogrammen sind sie nur bei sofortiger Verwendung erlaubt, da sie ja von Funktionen dynamisch veraendert werden koennten.
if(Var = "")
return 0
if(___%Var%) = ""
return 0
}
catch
return 0
return 1
}
; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
O_GetAll_(o,oN="",MT="",NT=".",Ke="",Ve="", WZ="",T="1"){ ; fuer die Anzeige eines Objektes in AHK einlese Schreibweise
; Aufrufbeispiele:
; MsgBox % O_GetAll_(A,"A")
; MsgBox % O_GetAll_(A)
KN := {}
if (WZ="")
WZ:=" := "
else if (WZ=0)
WZ:=""
if (Ke="")
Ke:=" := {}"
if (Ke=0)
Ke:=""
if (oN="")
oN:="Obj"
ges := GetAll(o,oN,MT,NT,Ke,Ve, WZ) ; rekursive Funktion aufrufen
Loop, Parse,ges,`n,`r
{ ; erhaltene Zeilen einzeln bearbeiten
if((A_LoopField)<>"") ; Leezeilen auslassen
{
LoopField :=
Ers := StrSplit(A_LoopField,"``""") ; trennen bei `"
if(Ers.MaxIndex()>1) ; wenn Ausnahme
{ ; Ja ; VorZeilen Schreiben + ObjektNamen vorne in Zeile einfuegen
G=0
Loop % Ers.MaxIndex()
{ ; Schleife ueber Elemente zwischen `"
++G
if(G=2) ; von gerader Indexnummer ausgehend
{ ; zusammenschreiben
VZ .= "____" A_Index " := """ Ers[A_Index] """`r`n" ; Vorzeile schreiben
G=0
LoopField .= SubStr(Ers[A_Index-1],1,-1) ; HauptZeilenElement vor Ausnahme zufügen
LoopField .= "[" "____" A_Index "]" ; HauptZeilenElement Ausnahme zufügen
if(A_Index +1 = Ers.MaxIndex()) ; wenn Element wegen Schleifen-Maximal-Index nicht berucksichtigt wuerde
LoopField .= Ers[A_Index+1] ; HauptZeilenElement nach Ausnahme zufügen
}
}
cges .= VZ oN LoopField "`r`n" ; HauptZeilenElemente allen Zeilen zufuegen
VZ :=
}
else
cges .= oN A_LoopField "`r`n" ; Nein ; ObjektNamen vorne in Zeile einfuegen
}
}
if(IsObject(o) and oN<>"")
cGes := oN Ke "`r`n" cGes ; WurzelElement vorne zufuegen
return cGes
}
Wenn man die Skript-Ausgabe nicht nur ansehen will, sondern wirklich als Eingabe für neu Skripte verwenden will, dann fehlen bei der vorigen Lösung noch die Hochkommas für die Werte der Objekt-Keys, wenn sie keine [u]Numbers[/u] sind. Die Hochkomma Einrahmung der nicht Number Werte schlägt nur zu wenn die betreffenden Default-Einstellungen nicht verändert werden. Des Weiteren wurden 2 Trimm() Funktionen entfernt, die noch Überbleibsel einer älteren Version waren in der die Zeile mit der Rekursion ein "`r`n" am Zeilenende hatte, dadurch entstand Müll der mit Trim entfernt wurde.
Im Beispiel unten lässt der 1. MsgBox-Befehl alle Werte in Hochkommas einrahmen.
Hinweis: 2 Innen-Hochkommas direkt nebeneinander ergeben 1 wirksames. Der 2. MsgBox-Befehl gibt Numbers ohne Hochkommas aus.[code]A := {}
A.Name := "Demo Objekt"
A.Zweck := "nur Demo (Objekt hat keinen realen Nutzen)"
A.B := {}
A.B.Zaehler := 1
A.B.KommaZahl := -5.589
A.B.C := {}
A.B.C.D := {}
A.B.C.D.a := "VW"
A.B.C.D.b := "BMW"
A.B.C.D.E := {}
A.B.C.D.E.F := {}
A.B.C.D.E.F.G := {}
A.B.C.D.E.F.G.1 := {}
A.B.C.D.E.F.G.1 := {KeyA: "ValueA", KeyB: "ValueB",KeyN: "...", KeyZ: "WertZ"}
; A.B.C.D.E.F.G.2 := A ; Zirkelbezug zum Testen
A.B.C.D.E.F.G.H := "Pedal"
A.B.C.D.1 := "Daimler"
; HochK="
; Te :=" := " HochK
MsgBox % O_GetAll_(A,"A",,, """" ," := """)
; MsgBox % O_GetAll_(A,"A",,,HochK,Te)
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
MsgBox % O_GetAll_(A,"A")
; Clipboard := O_GetAll_(A)
GetAll(o,oN="",NT="",Ke="",Ve="", WZ="",T="1",V=""){ ; fuer die Anzeige eines Objektes ; oN -> Objekt Name Nt -> Trenner Ke -> KeyEnde ; Ve -> Value Ende WZ -> Wert ZuweisugsZeichen nur intern: T -> Tiefe ; V -> fuer interne Vaeter
; Aufrufbeispiele:
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
; oder ueber O_GetAll_()
IP := false
if (WZ = " := " and Ve = "")
IP := true
if(T>99)
{
SoundBeep,300
return "Error Abruch wegen Zirkelbezug oder zu hoher Verschachtelungstiefe."
}
for key,val in o
{
if (IsObject(val))
{
ges .= V NT key Ke "`r`n" ; Listet Enden ohne Blaetter
ges .= GetAll(val,oN,NT,Ke,Ve,WZ,T+1,V NT key) ; Listet Rekursiv
}
else
{
if IP
{
if val is not number
HK="
else
HK:=
}
ges .= V NT key WZ HK val Ve HK "`r`n" ; Listet Blaetter
}
}
return ges
}
O_GetAll_(o,oN="",NT=".",Ke="",Ve="", WZ="",T="1"){ ; fuer die Anzeige eines Objektes in AHK einlese Schreibweise
; Aufrufbeispiele:
; MsgBox % O_GetAll_(A,"A")
; MsgBox % O_GetAll_(A)
if (WZ="")
WZ:=" := "
else if (WZ=0)
WZ:=""
if (Ke="")
Ke:=" := {}"
if (Ke=0)
Ke:=""
if (oN="")
oN:="Obj"
ges := GetAll(o,oN,NT,Ke,Ve, WZ)
Loop, Parse,ges,`n,`r
{
if((A_LoopField)<>"")
cges .= oN A_LoopField "`r`n"
}
if(IsObject(o) and oN<>"")
cGes := oN Ke "`r`n" cGes
return cGes
}[/code]
Unten folgen jeweils die neueste Funktionen mit Aufrufbeispielen, wobei mein Ziel ist, dass man den Output in eine Datei schreiben kann, die dann über #Include eingelesen werden kann und dadurch ein Duplikat des Ursprünglichen Objektes entsteht.[code]; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
B := [[[6,"Sieben",8],[8,9,10],[10,11]] , [[9,10,11],[11,12,13],[13,14,15]] , [[12,13,14],[14,15,16],[16,17,18]]]
B[1,3,3] := "Zwoelf"
B[2,2,2] := "Zwoelf"
B.1.1.1 := "ZWOELF"
A := {}
A.Name := "Demo Objekt"
A.Zweck := "nur Demo (Objekt hat keinen realen Nutzen)"
A.B := {}
A.B.Zaehler := 1
temp0 := "Komma-Zahl"
A.B[temp0] := -5.589
A.B.WasMitProzent := "-5.589%"
Temp1:="Leerzeichen Key"
Temp2:="Tabulator im" A_Tab "Key"
A.B[Temp1] := {}
A.B[Temp1][Temp2] := "Der Schlüssel-Name ist: Tabulator im" A_Tab "Key"
A.B.C := {}
A.B.C.D := {}
A.B.C.D.a := "VW"
A.B.C.D.b := "BMW"
A.B.C.D.E := {}
A.B.C.D.E.F := {}
A.B.C.D.E.F.G := {}
A.B.C.D.E.F.G.2 := B.1.1
; A[B,C,D,a]:= Porsche
A.B.C.D.E.F.G.1 := {}
A.B.C.D.E.F.G.1 := {KeyA: "ValueA", KeyB: "ValueB",KeyN: "...", KeyZ: "WertZ"}
; A.B.C.D.E.F.G.2 := A ; Zirkelbezug zum Testen
A.B.C.D.E.F.G.H := "Pedal"
A.B.C.D.E.F.G["""Ha""ns"] := "P""ed""al"
A.B.C.D.1 := "Daimler"
; Clipboard := GetAll(A,"A",15,A_Tab,A_Tab,,A_Tab)
; Te :=" := " HochK
; MsgBox % O_GetAll_(A,"A",15,,, """" ," := """)
; MsgBox % GetAll(A,"A",15,A_Tab,A_Tab,,A_Tab)
Clipboard := O_GetAll_(A,"A",11)
MsgBox % Clipboard
; MsgBox % ___KeyA A_Tab ___KeyB A_Tab ___KeyN A_Tab ___KeyZ ; diese Zeile zeigt wie unsauber AHK mit Dynamischen lokalen Variablen umgeht, sie sollte eigentlich nichts anzeigen.
; Hilft bei:
; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
; dient direkt zur Anzeige von Objekten oder zum Textvergleich 2er Objekte. wenn die Ausgaben 2er Übjekte gleich sind, dann sind auch di Objekte gleich!
GetAll(o,oN="",MT="",NT="",Ke="",Ve="", WZ="",T="1",V=""){ ; fuer die Anzeige eines Objektes ; oN -> Objekt Name Nt -> Trenner Ke -> KeyEnde ; Ve -> Value Ende WZ -> Wert ZuweisugsZeichen nur intern: T -> Tiefe ; V -> fuer interne Vaeter
; Aufrufbeispiele:
; MsgBox % GetAll(A,"A",A_Tab,A_Tab,,A_Tab)
; oder ueber O_GetAll_()
IP := false
if (WZ = " := " and Ve = "") ; wenn Ausnahmebehandlungen gewuenscht
IP := true
if(MT="")
MT := 16
if(T>MT)
{
SoundBeep,300 ; Tonsignal bei erreichender willkuerlichen Maximaltiefe
return A_Tab "Error Abruch wegen Zirkelbezug oder zu hoher Verschachtelungstiefe." A_Tab
}
for key,val in o ; Schleife uber alle Key's und Werte des Objektes
{
HK2:=""
if(IP and not TryKey(Key)) ; wenn Ausnahmebehandlungen gewuenscht und wenn notwendig
{
HK2=``"
StringReplace,key,key,","", ; "" werden beim Einlesen zu " das gilt auch beim Ruecklesen
}
; MsgBox % "Ausnahmebehandlung fuer >>>" Key "<<<"
if (IsObject(val))
{ ; wenn Val kein Wert sondern Objekt, dann rekursif tiefer rein
ges .= V NT HK2 key HK2 Ke "`r`n" ; Listet Enden ohne Blaetter
ges .= GetAll(val,oN,MT,NT,Ke,Ve,WZ,T+1,V NT HK2 key HK2) ; Listet Rekursiv ; Rekursiver Aufruf
}
else
{
if IP
{ ; wenn Unterscheidung zwischen numerischen und String-Werten gewuenscht
if val is not number
HK=" ; Werte mit "
else
HK:= ; Werte ohne "
}
if IP
StringReplace,val,val,","",All ; "" werden beim Einlesen zu " das gilt auch beim Ruecklesen
ges .= V NT HK2 key HK2 WZ HK val Ve HK "`r`n" ; Listet Blaetter
}
}
return ges
}
TryKey(Var){ ; Prueft Key-Variable ob der Key in der Notation Obj.Key := Val vertraeglich ist.
try
{
___%Var% := "egal " ; wegen der Schwachstelle in AHK, locale Variablen nicht konsequent lokal zu lassen, werden hier die 3mal Unterstrich Variablen eingefuehrt. Vorschlag: Die ___Vars werden nur in Funktionen verwendet, in Hauptprogrammen sind sie nur bei sofortiger Verwendung erlaubt, da sie ja von Funktionen dynamisch veraendert werden koennten.
if(Var = "")
return 0
if(___%Var%) = ""
return 0
}
catch
return 0
return 1
}
; erstellt von einem bestehenden Ahk-Objekt eine Textstring, der mit Ahk als Script eingelesen (z.B. via include), wieder das gleiche Objekt ergibt.
O_GetAll_(o,oN="",MT="",NT=".",Ke="",Ve="", WZ="",T="1"){ ; fuer die Anzeige eines Objektes in AHK einlese Schreibweise
; Aufrufbeispiele:
; MsgBox % O_GetAll_(A,"A")
; MsgBox % O_GetAll_(A)
KN := {}
if (WZ="")
WZ:=" := "
else if (WZ=0)
WZ:=""
if (Ke="")
Ke:=" := {}"
if (Ke=0)
Ke:=""
if (oN="")
oN:="Obj"
ges := GetAll(o,oN,MT,NT,Ke,Ve, WZ) ; rekursive Funktion aufrufen
Loop, Parse,ges,`n,`r
{ ; erhaltene Zeilen einzeln bearbeiten
if((A_LoopField)<>"") ; Leezeilen auslassen
{
LoopField :=
Ers := StrSplit(A_LoopField,"``""") ; trennen bei `"
if(Ers.MaxIndex()>1) ; wenn Ausnahme
{ ; Ja ; VorZeilen Schreiben + ObjektNamen vorne in Zeile einfuegen
G=0
Loop % Ers.MaxIndex()
{ ; Schleife ueber Elemente zwischen `"
++G
if(G=2) ; von gerader Indexnummer ausgehend
{ ; zusammenschreiben
VZ .= "____" A_Index " := """ Ers[A_Index] """`r`n" ; Vorzeile schreiben
G=0
LoopField .= SubStr(Ers[A_Index-1],1,-1) ; HauptZeilenElement vor Ausnahme zufügen
LoopField .= "[" "____" A_Index "]" ; HauptZeilenElement Ausnahme zufügen
if(A_Index +1 = Ers.MaxIndex()) ; wenn Element wegen Schleifen-Maximal-Index nicht berucksichtigt wuerde
LoopField .= Ers[A_Index+1] ; HauptZeilenElement nach Ausnahme zufügen
}
}
cges .= VZ oN LoopField "`r`n" ; HauptZeilenElemente allen Zeilen zufuegen
VZ :=
}
else
cges .= oN A_LoopField "`r`n" ; Nein ; ObjektNamen vorne in Zeile einfuegen
}
}
if(IsObject(o) and oN<>"")
cGes := oN Ke "`r`n" cGes ; WurzelElement vorne zufuegen
return cGes
}[/code]