函数中的 GUI 元素未以 Red 语言显示
GUI elements from a function not being displayed in Red language
我正在使用以下代码尝试从函数中获取 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]]
没有错误消息,循环继续正常,还显示 windows。但这只是一个没有任何文本、字段或按钮的小空 windows。
这段代码有什么问题?
编辑:将 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
这在 rebol/view 对我有用:
lay: mypanelfn
insert head lay 'across
view layout lay
我认为您在学习这些内容时需要先查看生成的 VID 代码以确保在尝试查看之前没有问题。
您不一定需要那里的功能,但是:
view mypanelfn
有效。
注意:Rebol 中的等效代码需要 layout
:view layout mypanelfn
发生这种情况的原因是因为 view
处理 blocks!
([]
内的任何内容)。所以你不必 do
它。
一般来说,最好将 Red 视为一种功能性消息传递语言。一切都是表达式,这与带有过程和语句的命令式语言不同。
再一次;您需要为要处理的元素使用唯一的名称。这是一个使用 reduce 而不是 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 ] ] ] ]
我建议您使用控制台中的命令来查看它们的作用。例如。
rejoin ['t i]
使用 t 和 i 的 (reduced/get-) 值创建一个字符串 "t1"
。
to-word
将其更改为红色 (bol) 字 t1
to-setword tname
创建一个集合词 t1:
to-set-path reduce [tname 'text ]
创建一个集合路径t1/text:
此方法不需要设置任何变量——它的工作原理是将面孔的每个迭代包含在一个公共 parent (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
是第一个 child (pane/1
) 是文本框的 panel
面孔(origin
不创建面孔)。
我正在使用以下代码尝试从函数中获取 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]]
没有错误消息,循环继续正常,还显示 windows。但这只是一个没有任何文本、字段或按钮的小空 windows。
这段代码有什么问题?
编辑:将 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
这在 rebol/view 对我有用:
lay: mypanelfn
insert head lay 'across
view layout lay
我认为您在学习这些内容时需要先查看生成的 VID 代码以确保在尝试查看之前没有问题。
您不一定需要那里的功能,但是:
view mypanelfn
有效。
注意:Rebol 中的等效代码需要 layout
:view layout mypanelfn
发生这种情况的原因是因为 view
处理 blocks!
([]
内的任何内容)。所以你不必 do
它。
一般来说,最好将 Red 视为一种功能性消息传递语言。一切都是表达式,这与带有过程和语句的命令式语言不同。
再一次;您需要为要处理的元素使用唯一的名称。这是一个使用 reduce 而不是 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 ] ] ] ]
我建议您使用控制台中的命令来查看它们的作用。例如。
rejoin ['t i]
使用 t 和 i 的 (reduced/get-) 值创建一个字符串 "t1"
。
to-word
将其更改为红色 (bol) 字 t1
to-setword tname
创建一个集合词 t1:
to-set-path reduce [tname 'text ]
创建一个集合路径t1/text:
此方法不需要设置任何变量——它的工作原理是将面孔的每个迭代包含在一个公共 parent (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
是第一个 child (pane/1
) 是文本框的 panel
面孔(origin
不创建面孔)。