用红色语言制作GUI对象



我有一个小面板的简单代码:

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

,但我必须将其中的两个放在一个窗口上。我想创建单个对象类,并从中创建2个对象。我看到可以创建对象如下:

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

但是我会有以下错误:

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

如何完成?感谢您的帮助。

编辑:我尝试使用do,但只能用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

我想创建单个对象类,并从中创建2个对象。

没有红色的对象系统,因此在尝试更复杂的GUI结构之前,您应该真正尝试先掌握基本的红色概念。RED是一种非常灵活的面向数据的语言,因此您可以通过例如构建参数化块模板来利用它来发挥自己的优势,并组装它们以形成正确的VID代码块。这是一个示例:

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

了解面部树(类似于HTML DOM,更简单),是掌握Red GUI系统的重要组成部分。由于还没有太多文档(您可以从http://docs.red-lang.org开始),欢迎您在红色/帮助吉特室问实时问题。

对象一起工作而不是在 vid 方言中,用 layout替换 view

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

您可以像其他任何对象一样检查它: ?? lay

例如,使用pane访问lay的内容:

>> ? lay/pane/1

但是,更有用的功能可能是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对将对象组合在一起很有用:

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

,但使用compose使用 vid 方言可能会更容易。

另请参阅此问题

我猜您正在寻找的是样式而不是对象,以创建布局。到目前为止,还没有红色的官方样式功能。但是您可以像这样动态创建布局

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

您可以多次将一个预定义单词块附加到要查看的块上,您将获得重复的元素。

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

您参考块中的命名元素时会出现问题。但是,一个单词不能指出重复元素的一个以上元素,因此在完整解决方案中撰写以创建唯一的名称。

也许有一个红色的错误,因为我认为compose/deep也会在内部深处进行括号,而不需要更多构成 -

最新更新