2016-05-25 11 views
7

Mit dem REBOL/View 2.7.8 Core möchte ich vorher ein Layout für die Ansicht vorbereiten, indem ich den verschiedenen Layoutelementen automatisch Wörter zuweise, wie im folgenden Beispiel. StattREBOL Layout: Wie man Layoutwörter automatisch erstellt - Wort hat keinen Kontext?

prepared-view: [across 
       cb1: check 
       label "Checkbox 1" 
       cb2: check 
       label "Checkbox 2" 
       cb3: check 
       label "Checkbox 3" 
       cb4: check 
       label "Checkbox 4" 
       ] 
    view layout prepared-view 

Ich würde so wie die Worte cb1-cb5 automatisch erstellt werden, zB:

prepared-view2: [ across ] 
    for i 1 4 1 [ 
     cbi: join "cb" i 
     cbi: join cbi ":" 
     cbi: join cbi " check" 
     append prepared-view2 to-block cbi 
     append prepared-view2 [ 
     label ] 
     append prepared-view2 to-string join "Checkbox " i 
     ] 
    view layout prepared-view2 

Doch während difference prepared-view prepared-view2 zeigt keine Unterschiede im Block analysiert werden (== []) , das zweite Skript führt zu einem Fehler:

Ich habe stundenlang versucht zu verstehen, warum, und ich denke, irgendwie müssen die neuen Wörter an den spezifischen Kontext gebunden sein, aber ich habe noch keine Lösung für das Problem gefunden.

Was muss ich tun?

Antwort

2
bind prepared-view2 'view 
view layout prepared-view2 

erstellt die richtigen Bindungen.

Und hier ist eine andere Art und Weise dynamisch Layouts erstellen

>> l: [ across ] 
== [across] 
>> append l to-set-word 'check 
== [across check:] 
>> append l 'check 
== [across check: check] 
>> append l "test" 
== [across check: check "test"] 
>> view layout l 

Und dann können Sie Loops verwenden, um verschiedene Variablen zu erstellen, um Ihr Layout hinzuzufügen.

+0

Ja, das hilft viel, danke! –

2

Wenn Sie TO-BLOCK verwenden, um eine Zeichenfolge in einen Block zu konvertieren, handelt es sich um eine Low-Level-Operation, die nicht die "normale" Bindung an "Standardkontexte" durchläuft. Alle Wörter ungebunden sein wird:

>> x: 10  
== 10 

>> code: to-block "print [x]" 
== [print [x]] 

>> do code 
** Script Error: print word has no context 
** Where: halt-view 
** Near: print [x] 

Also, wenn Sie Code aus rohen Strings zur Laufzeit, deren Lookups arbeiten, aufbauen wollen eine Option LOAD verwenden und es wird etwas default-ish tun, und das könnte funktionieren für einige Code (der loader ist, wie die Bindungen für den Code vorgenommen wurden Sie das herkam Quelle laufen):

>> x: 10 
== 10 

>> code: load "print [x]" 
== [print [x]] 

>> do code 
10 

oder Sie können die Kontexte/Objekte explizit nennen (oder durch ein Exemplar Wort in diesen Kontext gebunden) und BIND verwenden.

+0

... also ändere ich einfach 'append prepared-view2 in den Block cbi', um' prepared-view2 load cbi' anzuhängen ... ja, das funktioniert! –