首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >支持多面创建的VID布局窗格[rebol2]

支持多面创建的VID布局窗格[rebol2]
EN

Stack Overflow用户
提问于 2015-04-29 03:01:12
回答 2查看 221关注 0票数 5

请考虑以下简单的rebol2代码来说明我的问题:

代码语言:javascript
复制
REBOL []
a: make face [
    offset: 0x0
    color: yellow
    size: 20x20
]
b: make face [
    offset: 0x0
    color: red
    size: 60x60
    pane: reduce [
        make a [offset: 0x0]
        make a [offset: 10x10]
        make a [offset: 10x20]
    ]
]
view layout [
    box 200x200 white with [
        pane: reduce [
            make b [offset: 0x30] ;; one 'instance' of b
        ]
    ]
]

这里的要点是,布局(或面)能够在其窗格块中显示一组面,这样就可以对同一面进行多个创建(本例中是b)。显示的代码运行良好,b的唯一实例(让我这样称呼它)将按其应有的方式显示。

但是现在假设我修改了代码,例如,我有两个b实例

代码语言:javascript
复制
view  layout [
    box 200x200 white with [
        pane: reduce [
            make b [offset: 0x30]
            make b [offset: 0x10]
        ]
    ]
]

此时,我得到了错误。

代码语言:javascript
复制
** Script Error: Face object reused (in more than one pane): none
** Where: view
** Near: show scr-face
if new [do-events]

从这里我推测的信息来看,face b正以某种方式被重用,并破坏了我想要实现的目标。我对此做了大量的研究,在某些时候,我发现通过克隆(使用make)将脸传递给pane是有可能的;这就是我认为我正在做的事情,但没有取得任何成功。

在这种情况下,我的问题是:我如何解决这个问题?rebol2可以提供这个“面实例化”吗?还是最好尝试一下rebol2之外的其他东西(也许是rebol3)?

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2015-04-29 20:59:20

Rebol2绝对可以这样做。

当您第二次使用b时,您将使用相同的a实例,这就是问题所在。

您可以编写一个函数,该函数创建必要的faces并将其附加到块中并返回。别忘了每次都创造一个(第一张脸)。

此外,检查文档中的迭代面。

在这里,我添加了一个示例:

代码语言:javascript
复制
REBOL []
make-pane: func [ofst [pair! block!] /local a b faces] [
    a: make face [
        offset: 0x0
        color: yellow
        size: 20x20
    ]
    faces: copy []
    either block? ofst [
        foreach o ofst [
            append faces make a [offset: o]
        ]
    ] [
        append faces make a [offset: ofst]
    ]
    b: make face [
        offset: 0x0
        color: red
        size: 60x60
        pane: faces
    ]
]

view  layout [
    box 200x200 white with [
        pane: make-pane [5x30 0x10 20x5]
    ]
]

您可以更改该函数以获得更多的参数以更改颜色和其他方面。

票数 3
EN

Stack Overflow用户

发布于 2015-05-03 22:22:11

我在评论中说过,我会回来分享我的发现,我想我得到了一些有趣的东西。正如@endo64所指出的那样,迭代面孔是很棘手的,也许并不最适合我第一次提出这个问题时打算做的事情--通过面板实现简单/向前的方法来实例化对象。

我想出了下面的代码,它实现了一种实例器。它的灵感在一定程度上来自于@endo64的脸谱制作方法,以及一些反复修改过的面孔。此实例器有一个核心限制,即不接受传递给要在同一个窗格中创建的构造函数的多种类型的对象。

无论如何,我发现这是一个有趣的练习,我想把它张贴在这里,以防止它可能是有用的人。

我使用了问题中的相同代码,现在解决/避免了在主布局窗格中创建多个b对象的限制。ab现在持有一个instantiator对象,该对象接收要在其窗格中创建的对象和应该放置对象的位置块(对偏移)。

代码语言:javascript
复制
a: make face [
    offset: 0x0
    color: yellow
    size: 30x20
]

b: make face [
    offset: 0x0
    color: red
    size: 100x100
    inst_b: _instantiator/new reduce a [10x10 10x70 80x80 30x30] ; instantiator here  
    pane: get in inst_b 'pane_function
]

实例化代码是:

代码语言:javascript
复制
_instantiator: make object! [
    _obj: copy []
    _offsets: copy []

    new: func [
        obj [object!] "object to create inside pane"
        offs [block!] "instances offsets"
    ][
        make self [
            _obj: obj
            _offsets: offs
        ]
    ]   
    pane_function: func [face index] [
        if integer? index [
            if index <= length? _offsets [
                _obj/offset: to-pair reduce [_offsets/:index/x _offsets/:index/y]
                _obj
            ]
        ]
    ]   
]

主要布局代码是:

代码语言:javascript
复制
_inst: _instantiator/new reduce b [0x0 50x50 130x130] ;;3 b objects are created in the positions indicated in the pairs block
_lo: layout [
    mybox: box 500x500 white with [
        offset: 0x0     
        pane: get in _inst 'pane_function
    ]   
]
view center-face _lo
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29933559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档