[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Liste aller Eigenschaften eines Objekts

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Liste aller Eigenschaften eines Objekts

JuMayr
Beiträge gesamt: 96

12. Dez 2012, 21:35
Beitrag # 1 von 3
Bewertung:
(2953 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo zusammen,

basierend auf dem Script von IndiSnip
http://indisnip.wordpress.com/2010/12/29/quicktip-find-properties-quickly/
habe ich versucht ein erweitertes Script zu erstellen.

Ziel ist es von app alle Objekte und Eigenschaften mit den jeweiligen Werten auszulesen.

Genaugenommen kann das Script das jetzt schon.
Die Erweiterung soll sein, dass bei einem gefundenen Objekt tiefer verschachtelt wird.

Beispiel:
Für _objekt = app; erhalte ich als erste Zeilen folgendes zurück:

Application.activeBook = cannot read
Application.activeDocument = [object Document]
Application.activeScript = cannot read
Application.activeScriptUndoMode = 1699967573
Application.activeWindow = [object LayoutWindow]
Application.alignDistributePreferences = [object AlignDistributePreference]

Nun möchte ich für den Fall, dass im Rückgabewert object vorkommt die Funktion rekursiv aufrufen und zusätzlich zu app auch die Werte für app.activeDocument erhalten.

Mein bisheriger Ansatz:

Code
// object 
var _objekt = app;
var _resultArray = [];

// hier wird Array mit den Werten von app gefüllt.
readObject(_objekt);

// nun durchlaufe ich das Array und prüfe, ob einer der Werte nach Split und Substring den Inhalt "object" hat.
for (x = 0; x < _resultArray.length; x++) {
try {
var tempResult = _resultArray[x].toString().split(" = ");
if (tempResult[1].substring(1,7) == "object") {
var subObjekt = tempResult[0].split(".");
// hier sollte eigentlich die Funktion erneut aufgerufen werden mit dem Parameter
readObject(_objekt+"."+subObjekt[1]);
}
} catch (e) {
alert(e);
}
}


// display properties
alert_scroll("Object properties", _resultArray.sort());

//Eigenschaften auslesen
function readObject (_objekt){
for (var i = 0; i < _objekt.reflect.properties.length; i++) {
var _property = _objekt.reflect.properties[i];
if (_property.toString() === "__proto__" || _property.toString() === "reflect" || _property.toString() === "properties") continue;
try { _result = _objekt[_property]; }
catch (e) { _result = "cannot read"; }
if (_result != null && _result.constructor.name === "Array") _resultArray.push(_objekt.constructor.name + "." + _property + " = [" + _result + "]");
else _resultArray.push(_objekt.constructor.name + "." + _property + " = " + _result);
}
}

// Scrollable alert function
function alert_scroll (title, input){
if (input instanceof Array)
input = input.join ("\r");
var w = new Window ("dialog", title);
var list = w.add ("edittext", undefined, input, {multiline: true, scrolling: true});
list.maximumSize.height = w.maximumSize.height-100;
list.minimumSize.width = 250;
w.add ("button", undefined, "Close", {name: "ok"});
w.show ();
}


Leider werden die Eigentschaften der subObjekte nicht aufgerufen.
Hat jemand eine Idee, wo ich mich da verrant habe?

Viele Grüße und eine besinnliche Adventszeit.
Jürgen
X

Liste aller Eigenschaften eines Objekts

WernerPerplies
Beiträge gesamt: 2762

13. Dez 2012, 06:53
Beitrag # 2 von 3
Beitrag ID: #505553
Bewertung:
(2899 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

hier habe ich etwas ähnliches gemacht:

WpsCompareObjects

Du musst dabei beachten, dass Du bei vielen Objekten in Endlosschleifen laufen kannst.

Deshalb arbeite ich mit Excludelisten, um bestimmte Objekte vom Auslesen auszuschließen.

Klassiker solcher Probleme sind zum Beispiel Parentobjekte, da rufst dann anschließend gleich wieder Dein gerade behandeltes Objekt auf.


als Antwort auf: [#505546]

Liste aller Eigenschaften eines Objekts

fabiantheblind
Beiträge gesamt:

13. Dez 2012, 10:35
Beitrag # 3 von 3
Beitrag ID: #505565
Bewertung:
(2861 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Jürgen,

gerade neulich habe ich ebenfalls mit recursiven Funktionen hantiert. Ich habe mich an diesem Beispiel entlang gehangelt um die Funktion aufzubauen. Vielleicht hilft dir das ja. Wie Werner bereits erwähnte. Sei vorsichtig mit Endlosschleifen.

Code
var meta = new Object(); 
meta.res = "";
main();

function main() {
var val = 11;
var cnt = 0;
var result = recurs(val,cnt);
alert(meta.res);
return "End Of function 'main()'";
};

function recurs(p1,counter) {
p1--;
counter++;

if (p1 <= 0) {
$.writeln(counter);
meta.res = String("We are at the end of the recursion in " + counter +" loops")
return ;
}else {
recurs(p1,counter);
}
}


P.S. Wenn "var meta" nicht global ist funktioniert es nicht.


als Antwort auf: [#505546]
(Dieser Beitrag wurde von fabiantheblind am 13. Dez 2012, 10:39 geändert)