我正在使用以下代码尝试从函数中获取GUI元素:
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]]
没有任何错误消息和循环,并且还会显示窗口。但这只是一个没有任何文字,字段或按钮的小空窗口。
此代码有什么问题?
修改:在probe
节目之前放置collect
(为了清晰起见,我添加了换行符):
[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 :(得分:3)
此方法不需要设置任何变量 - 它通过在公共父(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
是panel
脸,其第一个孩子(pane/1
)是文本框(origin
不会创建脸部。)
答案 1 :(得分:2)
然而,你并不一定需要这个功能:
view mypanelfn
作品。
注意:Rebol中的等效代码需要layout
:view layout mypanelfn
发生这种情况的原因是view
处理blocks!
([]
内的任何内容)。所以你不必do
。
一般来说,将Red视为一种功能性的消息传递语言会更好。与具有程序和陈述的命令式语言形成对比,一切都是表达。
答案 2 :(得分:1)
这对我在rebol / view中起作用:
lay: mypanelfn
insert head lay 'across
view layout lay
我认为,在您学习这些内容时,您需要查看生成的VID代码,以便在尝试查看之前检查没有问题。
答案 3 :(得分:1)
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 ] ] ] ]
我建议您使用控制台中的命令查看它们的作用。例如。
rejoin ['t i]
创建一个字符串"t1"
,其中包含t和i的(减少/获取)值。
to-word
将其更改为红色(bol)字t1
to-setword tname
创建了一个字组t1:
to-set-path reduce [tname 'text ]
创建了一个设置路径t1/text: