2017-09-16 3 views
0

Je suit le code simple pour un petit panneau:objets GUI Making en langue rouge

view [ 
    t: text "label" 
    f: field 
    button "Click here" [t/text: f/text] ] 

Mais je dois faire deux d'entre eux et les mettre sur une seule fenêtre. Je veux créer une classe d'objet unique et en faire 2 objets. Je vois que les objets peuvent être créés comme suit:

obj: object [ 
    view [ 
     t: text "label" 
     f: field 
     button "Click here" [t/text: f/text] ] ] 

view [ 
    obj 
    obj  ] 

Mais je reçois l'erreur suivante:

*** Script Error: VID - invalid syntax at: [obj obj] 
*** Where: do 
*** Stack: view layout cause-error 

Comment cela peut-il être fait? Merci de votre aide.

Edit: J'ai essayé avec do mais ne pouvait gérer que avec does:

myview: object [ 
     show: does [view[ 
     below 
     t: text "1st time" 
     f: field "Enter value" 
     button "Click here" [f/text "clicked"] 
     area] ] ] 

    myview/show 

    print "READY TO SHOW 2nd OBJECT: " 
    myview2: copy myview 
    myview2/show 
+0

Vous mélangez encore des dialectes, c'est pourquoi il a gagné & # 39; travail. La vue ne comprend que le dialecte de la vidéo. Vous pouvez pré-traiter le bloc dans le dialecte do et alimenter le bloc du dialecte de la vidéo pour voir –

+1

Il semble qu'il existe 2 langues différentes, connectées très finement. – rnso

+1

Ils sont deux dialectes différents de la même langue. –

Répondre

1

I want to create single object class and make 2 objects out of it.

Il n'y a pas d'objet classe système en rouge, alors vous devriez vraiment essayer d'abord de saisir les concepts de base rouge avant d'essayer des constructions GUI plus complexes. Le rouge est un langage orienté données très flexible, vous pouvez donc l'utiliser à votre avantage, par exemple en construisant des modèles de blocs paramétrés et en les assemblant pour former un bloc correct de code VID. Voici un exemple:

make-row: func [label [string!] but-label [string!]][ 
    compose [ 
     t: text (label) 
     f: field 
     b: button (but-label) [face/extra/1/text: face/extra/2/text] 
     do [b/extra: reduce [t f]] 
    ] 
] 

view compose [ 
    (make-row "label" "Click") return 
    (make-row "label2" "Click2") 
] 

Comprendre l'arbre du visage (juste plus simple analogique au code HTML DOM,), est une partie importante de la maîtrise du système GUI de Red. Comme il n'y a pas encore beaucoup de documentation (vous pouvez commencer par http://docs.red-lang.org), vous êtes invités à poser des questions en direct sur red/help Gitter room.

+0

Qu'est-ce que 'do [b/extra: réduire [t f]]' faire? Pourquoi ne pas "visage/volet" plutôt que "visage/extra"? – rnso

+0

La facette '/ pane' est utilisée pour construire l'arborescence qui définit quel widget en contient d'autres. Vous ne voulez pas que 'button 'ait des widgets enfants, il n'y a donc aucune raison d'utiliser'/pane'. Le champ '/ extra' est une facette libre qui peut être utilisée pour attacher des données à l'objet visage. Dans ce cas, nous voulons enregistrer une référence aux faces de texte et de champ, afin que nous puissions l'utiliser lorsque le bouton est cliqué. Veuillez relire la [documentation] (https://doc.red-lang.org/fr/view.html#_face_object). – DocKimbel

2

Je suppose que ce que vous cherchez des styles et pas des objets afin de créer une mise en page. Jusqu'à présent, il n'y a pas de fonction de stylisation officielle en rouge. Mais vous pouvez créer votre mise en page dynamique comme celui-ci

view repeat i 2 [ 
    tname: to-word rejoin ['t i] 
    fname: to-word rejoin ['f i] 
    append v: [] compose/deep [ 
     (to-set-word tname) text "label" 
     (to-set-word fname) field 
     button "click here" [ 
      (to-set-path compose [(tname) text]) 
      (to-path compose [(fname) text]) 
     ] 
    ] 
] 

Vous pouvez simplement ajouter un bloc prédéfini de mots plusieurs fois au bloc que vous voulez voir et vous obtiendrez des éléments répétés.

txt_btn: [ 
    t: text "label" 
    f: field 
    button "Click here" [t/text: f/text] 
] 
view append append [] txt_btn txt_btn 

Le problème se pose lorsque vous faites référence à un élément nommé dans votre bloc. Mais un mot ne peut pointer vers plus d'un élément des éléments répétés, donc l'utilisation de composer dans la solution complète afin de créer des noms uniques.

Peut-être il y a un bogue dans rouge parce que je pensais compose/deep faisait ça aussi entre parenthèses au fond et pas besoin de plus cadrez -

+0

Oui, ça marche! Une explication du code sera également très utile. – rnso

+0

Comment puis-je accéder à chacun de ces panneaux/objets (quel est leur nom ou symbole) si le programme veut interagir avec eux séparément? – rnso

+0

Ceci est probablement un meilleur moyen de construire des mises en page. Vous pouvez modifier les objets par la suite de cette façon. –

2

Pour travailler avec objets au lieu de la VID dialecte, remplacer view avec layout :

lay: layout [ 
    t: text "label" 
    f: field 
    button "Click here" [t/text: f/text] 
] 

view lay 

Vous pouvez ensuite inspecter comme tout autre objet: ?? lay.

Par exemple, pour accéder au contenu de lay avec pane:

>> ? lay/pane/1 

Cependant, une fonction plus utile peut être dump-face:

>> dump-face lay 
Type: window Style: none Offset: 833x548 Size: 270x45 Text: "Red: untitled" 
    Type: text Style: text Offset: 10x10 Size: 80x24 Text: "label" 
    Type: field Style: field Offset: 100x10 Size: 80x24 Text: none 
    Type: button Style: button Offset: 190x9 Size: 70x25 Text: "Click here" 
== make object! [ 
    type: 'window 
    offset: 833x548 
... 

panel s sont utiles pour regrouper des objets:

>> dump-face blay: layout [p: panel button "hi"] 
Type: window Style: none Offset: none Size: 292x220 Text: none 
    Type: panel Style: panel Offset: 10x10 Size: 200x200 Text: none 
    Type: button Style: button Offset: 220x9 Size: 62x25 Text: "hi" 
== make object! [ 
    type: 'window 
    offset: none 
    ... 

Mais je Il est probablement plus facile d'utiliser le dialecte VID avec compose pour commencer.

Voir aussi this question

+0

'view lay' fonctionne mais je veux un autre objet' lay2 copy lay' qui fonctionne aussi mais je veux les montrer dans une vue et 'view [lay lay2]' lance une erreur: 'VID - syntaxe invalide à: [lay lay2 ] '. Comment puis-je montrer à la fois lay et lay2 dans une vue? – rnso