2017-09-17 1 views
1

angezeigt werden, verwende ich folgenden Code, um zu versuchen GUI-Elemente aus einer Funktion zu erhalten:GUI-Elemente aus einer Funktion nicht in Red Sprache

mypanelfn: func[] [ 
    collect[ 
     repeat i 10 [ 
     print append copy "i in loop: " i 
     keep [t: text] keep append copy "message: " i 
     keep [field "entry"  
       button "Click" [t/text: "clicked"] return]]]] 

    view [ 
    do [mypanelfn]] 

Es gibt keine Fehlermeldungen und Schleife geht auf alles in Ordnung und ein Fenster wird auch angezeigt. Aber das ist nur ein kleines leeres Fenster ohne Text, Felder oder Schaltflächen.

Was ist falsch an diesem Code?

Edit: Putting probe vor collect zeigt (ich habe für Klarheit hinzugefügt Zeilenumbrüche):

[t: text "message: 1" field "entry" button "Click" [t/text: "clicked"] return 
t: text "message: 2" field "entry" button "Click" [t/text: "clicked"] return 
t: text "message: 3" field "entry" button "Click" [t/text: "clicked"] return 
t: text "message: 4" field "entry" button "Click" [t/text: "clicked"] return 
t: text "message: 5" field "entry" button "Click" [t/text: "clicked"] return 
+0

Eigentlich funktioniert "view mypanelfn" perfekt. Alle GUI-Elemente werden angezeigt. Wenn Sie auf eine Schaltfläche klicken, wird nur die letzte Textbeschriftung und nicht die entsprechende Textbeschriftung geändert. Wie kann das korrigiert werden? – rnso

+0

Verwenden Sie 'self/text' –

+0

Welchen' text' Eintrag? Ich bin nicht in der Lage, "self" irgendwo mit Erfolg hinzuzufügen. – rnso

Antwort

1

noch einmal; Sie benötigen eindeutige Namen für Elemente, die Sie ansprechen möchten. Hier ist eine Lösung mit reduzieren statt compose

mypanelfn: func[] [ 
    collect[ 
    repeat i 10 [ 
     tname: to-word rejoin ['t i] 
     print append copy "i in loop: " i 
     keep reduce [to-set-word tname 'text] keep append copy "message: " i 
     keep reduce [ 
     'field "entry" 'button "Click" reduce [ 
      to-set-path reduce [ 
      tname 'text ] 
      "clicked" ] 
     'return ] ] ] ] 

Ich empfehle, dass Sie die Befehle in der Konsole verwenden, um zu sehen, was sie tun. Z.B.

rejoin ['t i] erstellt eine Zeichenfolge "t1" mit t und dem (reduzierten/get-) Wert von i.

to-word Änderungen, die an einem roten (bol) Wort t1

to-setword tname eine Set-Wort alle Variablen- Einstellung t1/text:

+0

Ja, es funktioniert sehr gut. Die Textelemente werden als "t1, t2" usw. bezeichnet, und das Klicken auf Schaltflächen wirkt sich nur auf das entsprechende Textelement aus. Es wird nützlich sein, wenn Sie erklären können, wie diese Kennzeichnung funktioniert, d. H. Verwendung von 'To-Word, Rejoin, To-Set-Word, To-Set-Pfad' usw. – rnso

+0

Was ist' to-set-path'? – rnso

1

das für mich arbeitet in Rebol/View:

lay: mypanelfn 
insert head lay 'across 
view layout lay 

enter image description here

I Denken Sie, während Sie dieses Zeug lernen, müssen Sie sich den generierten VID-Code anschauen, um zu überprüfen, dass es vor tryi keine Probleme gibt ng, um es anzuzeigen.

+0

Ausgabe zurückgegeben von der Funktion scheint in Ordnung (siehe Bearbeiten in meiner Frage oben). Warum funktioniert mein Code dann nicht in Rot? – rnso

+0

Ihr Code funktioniert bei mir nicht in Rot. Der Fehler ist: '*** Script Error: Lay hat keinen Wert; *** Wo: Kopf; *** Stack: mypanelf '(Ich habe Semikolons anstelle von Zeilenumbrüchen hinzugefügt). – rnso

2

Sie müssen nicht unbedingt die Funktion dort müssen jedoch:

view mypanelfn 

Works.

Hinweis: der entsprechende Code in Rebol erfordert layout: view layout mypanelfn

Der Grund dieser view Prozesse ist, da geschieht blocks! (alles innerhalb []). Sie müssen also nicht do es.

Im Allgemeinen ist es besser, sich Rot als eine funktionale, Nachrichtenübergabesprache vorzustellen. Alles ist ein Ausdruck, im Gegensatz zu Imperativsprachen mit Prozeduren und Anweisungen.

3

Diese Methode erfordert nicht schafft t1:

to-set-path reduce [tname 'text ] schafft eine Set-Pfad es funktioniert, indem es jede Iteration von Gesichtern innerhalb eines gemeinsamen Elternteils enthält (panel):

view collect [ 
    keep [below space 0x0] 
    repeat i 10 [ 
     keep compose/deep [ 
      panel [ 
       origin 0x0 
       text (rejoin ["Message Number: " i]) 
       field "entry" 
       button "Click" [face/parent/pane/1/text: "clicked"] 
      ] 
     ] 
    ] 
] 

face/parent ist das panel Gesicht, dessen erstes Kind (pane/1) das Textfeld ist (origin erstellt kein Gesicht).

+1

@rnso Meine Codesegmente entsprechen dem Rebol/Red Coding Style Guide - bitte beachten Sie das vor der Änderung. – rgchris

Verwandte Themen