2017-09-17 2 views
1

J'utilise le code suivant pour essayer d'obtenir des éléments de l'interface graphique d'une fonction:éléments de l'interface graphique d'une fonction pas dans la langue rouge

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]] 

Il n'y a pas de message d'erreur et la boucle aller sur tous les droits et fenêtres est également affiché. Mais ce n'est qu'une petite fenêtre vide sans aucun texte, champs ou boutons.

Quel est le problème avec ce code?

Edit: mettre probe avant collect spectacles (j'ai ajouté des sauts de ligne pour plus de clarté):

[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

En fait, 'view mypanelfn' fonctionne parfaitement. Tous les éléments de l'interface graphique sont affichés. Mais cliquer sur un bouton ne change que la dernière étiquette de texte, et non l'étiquette de texte correspondante. Comment cela peut-il être corrigé? – rnso

+0

Utiliser 'self/text' –

+0

Quelle entrée' text'? Je ne suis pas capable d'ajouter 'self' n'importe où avec succès. – rnso

Répondre

1

encore une fois; vous avez besoin de noms uniques pour les éléments que vous voulez traiter. Voici une solution avec réduire au lieu de composer

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 ] ] ] ] 

Je vous recommande d'utiliser les commandes dans la console pour voir ce qu'ils font. Par exemple.

rejoin ['t i] crée une chaîne "t1" avec t et la valeur (réduit/get-) de i.

to-word changements qui à un rouge (BOL) mot t1

to-setword tname crée un ensemble de mots t1:

to-set-path reduce [tname 'text ] crée un ensemble chemin t1/text:

+0

Oui, ça marche très bien. Les éléments de texte sont étiquetés comme 't1, t2' etc. et les boutons de clic n'affectent que l'élément de texte correspondant. Ce sera utile si vous pouvez expliquer comment fonctionne cet étiquetage, c'est-à-dire utiliser 'to-word, rejoin, to-set-word, to-set-path' etc. – rnso

+0

Qu'est-ce que' to-set-path'? – rnso

1

cela fonctionne pour moi dans rebol/vue:

lay: mypanelfn 
insert head lay 'across 
view layout lay 

enter image description here

I penser pendant que vous apprenez ce genre de choses, vous devez regarder le code VID généré pour vérifier qu'il n'y a pas de problèmes avant tryi ng pour l'afficher.

+0

La sortie renvoyée par la fonction semble correcte (voir modifier dans ma question ci-dessus). Alors pourquoi mon code ne fonctionne pas en rouge? – rnso

+0

Votre code ne fonctionne pas pour moi en rouge. L'erreur est: '*** Script Error: lay n'a aucune valeur; *** Où: tête; *** Stack: mypanelfn '(j'ai ajouté des points-virgules au lieu de sauts de ligne). – rnso

2

Vous ne devez pas nécessairement la fonction là, cependant:

view mypanelfn 

Works.

Note: le code équivalent en Rebol nécessite layout: view layout mypanelfn

La raison pour laquelle cela se produit est parce que view processus blocks! (quoi que ce soit à l'intérieur []). Donc, vous ne devez pas do il.

En général, il est préférable de considérer Red comme un langage fonctionnel de transmission de messages. Tout est une expression, contrairement aux langages impératifs avec des procédures et des déclarations.

3

Cette méthode ne nécessite pas la mise en toute variables- il fonctionne en contenant chaque itération de faces dans un parent commun (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 est le visage dont le premier enfant (pane/1) est la zone de texte (origin ne crée pas de visage).

+1

@rnso Mes segments de code respectent le guide de style de codage Rebol/Red - veuillez vous y reporter avant de le modifier. – rgchris