Displaybox-VerschlüsselungEs ist ein bekanntes Problem, dass das Ersetzen von Anzeigefeldern bei der Verschlüsselung nicht funktioniert, aber ich dachte, ich könnte sie in assoziative Arrays einfügen, und es würde funktionieren. Vielleicht bin ich heute nur besonders schlecht in meinem Job. Hat jemand eine bessere Möglichkeit, mit der Displaybox-Verschlüsselung umzugehen, die NICHT im Anzeigebaum surft? Das Halten einer Here- oder Global-Variablen ist auch ein Nichtstarter.
do_something = function ({aa}, {Default Local},
cb = aa["cb2"];
rb = aa["rb"];
show(cb<<CLASS name=""></CLASS>Betreff: Verschlüsselung der Anzeigebox @vince_faller ,
Ich habe Ihr Skript auf JMP PRO 14.3 und 15.0 getestet und es hat funktioniert. Ich habe dann die Funktion geändert, um deutlicher zu machen, dass sich die Benutzeroberfläche geändert hat.
Ich habe neue JMP-Sitzungen zum Testen geöffnet. ??
do_something = function ({aa}, {Default Local},
cb = aa["cb2"];
rb = aa["rb"];
show(cb<<CLASS name="">1,
for(i=1, i<=nitems(ml), i++,
ml[i] = char(num(ml[i]) +1);
),
//else
ml = {"1", "2"}
);
cb << Set Items(EvalList(ml)); // but this doesn't????
);
gen_dummy_cb_ui = Function ({}, {Default Local},
vlb = Vlistbox(
btn = buttonbox("Press me"),
cb1 = Combo Box ({"Change me", "B"}),
cb2 = Combo Box ({"This should change"}),
rb = radiobox({"1", "2"})
);
aa = Associative Array ({"cb1", "cb2", "rb"}, Eval List ({cb1, cb2, rb}));
Eval (Substitute (
Expr (
btn << Set Function (
Function ({this}, {cb},
do_something(DV_AA)
)
);
cb1 << Set Function (
Function ({this, index}, {cb},
do_something(DV_AA)
)
);
)
,
Expr (DV_AA), aa
));
return(vlb);
);
New Window ("",
gen_dummy_cb_ui();
);
</CLASS>
Betreff: Verschlüsselung der AnzeigeboxVince - wenn Sie das Skript verschlüsseln, ich Überlegen Wahrscheinlich wird die Textdarstellung der Anzeigefelder im assoziativen Array gestreamt. Es gibt keine Möglichkeit, dies zurück zu streamen und mit den tatsächlichen Boxen im Speicher verbunden zu werden. (Das ist möglicherweise nicht genau richtig. Ich weiß nicht, warum es sie streamen muss.)
Mein Workaround verwendet temp = NewNameSpace () ohne expliziten Namen. Fügen Sie die Daten nach der Erstellung zu temp hinzu (temp: b1 = box;), und übergeben Sie dann temp << G. etName als Parameter für die Rückrufe. Verwenden Sie am anderen Ende temp = NameSpace (übergebener Name), um den Namespace zurückzugewinnen. Fügen Sie zum Schluss eine hinzu OnClose Handler zum Fenster, um den Namespace zu löschen.
Die unbenannten Namespaces erhalten einen internen Namen wie "# 37".
Also ungefähr so:
do_something = Function( {ns},
{Default Local},
Show( ns );
ns = Namespace( ns );
Show( ns );
cb = ns:cb2;
rb = ns:rb;
Show( cb << class name ); // this works
cb << Set Items( {"1", "2"} ); // but this doesn't????
);
gen_dummy_cb_ui = Function( {},
{Default Local},
vlb = V List Box(
btn = Button Box( "Press me" ),
cb1 = Combo Box( {"Change me", "B"} ),
cb2 = Combo Box( {"This should change"} ),
rb = Radio Box( {"1", "2"} )
);
//aa = Associative Array( {"cb1", "cb2", "rb"}, Eval List( {cb1, cb2, rb} ) );
temp = New Namespace();
temp:cb1 = cb1;
temp:cb2 = cb2;
temp:rb = rb;
Eval(
Substitute(
Expr(
btn << Set Function(
Function( {this},
{cb},
Show( "btn" );
do_something( DV_NS );
)
);
cb1 << Set Function(
Function( {this, index},
{cb},
Show( "cb1" );
do_something( DV_NS );
)
);
),
Expr( DV_NS ), temp << getname
)
);
Return( Eval List( {vlb, temp << getname} ) );
);
{box, ns} = gen_dummy_cb_ui();
New Window( "", box );
Eval(
Eval Expr(
box << onclose(
Delete Namespaces( Expr( ns ) );
1;
)
)
);
Show( Namespace( ns ) );Betreff: Verschlüsselung der Anzeigebox@ gzmorgan0, hat es bei dir funktioniert, auch nachdem du es verschlüsselt hast?
@Craige_Hales Ich habe das schon einmal gemacht, ähnlich wie Drews Pseudo Object Oriented-Stil.
Das Problem, auf das ich stoße, ist, dass ich, wenn ich eine Kopie einer Box dynamisch erstellen muss, eine Liste der erstellten Namespaces führen muss, um sie später zu löschen.
Und wenn die Schaltfläche (oder was auch immer), mit der die Kopie der Box erstellt wird, nicht mit der Funktion spricht, mit der das Hauptfenster erstellt wird, weiß sie nicht, zu welcher Liste sie hinzugefügt werden soll.
Es wird sehr schnell sehr unruhig.
Das mag ein bisschen esoterisch sein, aber ich stoße die ganze Zeit darauf.
Das, was mich WIRKLICH verwirrt, ist, warum ich << Klassenname nennen kann. Aber nicht << Set Items, wenn es sich um eine Textinterpretation handelt.
Betreff: Verschlüsselung der AnzeigeboxVince,
Entschuldigung, ich habe den Verschlüsselungsteil verpasst.
Ich schlage vor, Sie binden Ihr Skript in eine Skriptbox () ein und führen die Skriptbox aus. Dann verschlüsseln Sie es, es scheint für mich zu funktionieren.
jslbox= ScriptBox("\[
do_something = function ({aa}, {Default Local},
cb = aa["cb2"];
rb = aa["rb"];
show(cb<<CLASS name=""></CLASS>
Betreff: Verschlüsselung der AnzeigeboxDas würde leider alle unsere Unit-Tests unterbrechen. Außerdem wäre es ein Alptraum zu unterstützen, da alles eine Zeichenfolge ist.
Ich werde damit spielen, um zu sehen, ob ich interessante Leckerbissen zu meinem Vorteil nutzen kann.