如何在protoInfoButton上打开protoFloatNGo窗口“关于”点击?

时间:2013-08-15 12:10:46

标签: newtonscript

我已经在 NewtonScript程序员指南中查看了“View Instantiation”(第3-26页)以及“声明中的内幕故事”附录(第A-1页)和使用Macintosh编写牛顿编程中的“声明视图”部分,第2版。我相信我明白了,但我似乎无法通过点击protoFloatNGo中的“关于”来打开protoInfoButton窗口。

我开始使用以下应用程序(其中newtStatusBar带有protoInfoButton,当点击“关于”时会发送DoInfoAbout(),并使用{{3}进行编译},在tntk中运行,并使用Einstein探索数据结构:

infoButtonView := {
    _proto: protoInfoButton,
    DoInfoAbout: func ()
        begin
            :Notify(kNotifyAlert, "MyApp", "DoInfoAbout() got called!");
        end,
    DoInfoPrefs: func ()
        begin
            :Notify(kNotifyAlert, "MyApp", "DoInfoPrefs() got called!");
        end
};

mainView := {
    _proto: protoFloater,
    viewFlags: vApplication + vVisible + vClickable,
    appSymbol: kAppSymbol,
    viewJustify: vjParentFullH + vjParentFullV,
    viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
    stepChildren: [
        {
            _proto: protoTitle,
            title: kAppTitle
        },
        {
            _proto: newtStatusBar,
            menuLeftButtons: [infoButtonView],
            menuRightButtons: []
        },
    ],
};

{
    app: kAppSymbol,
    text: kAppTitle,
    theForm: mainView,
}

让我看看我是否可以解释我目前对该问题的理解......我需要定义一个protoFloatNGo模板/布局,需要在运行时将其实例化为视图,我需要能够在protoFloatNGo中获得对infoButtonView:DoInfoAbout()视图(不是模板/布局)的引用,以便我可以在其上调用:Open()

protoFloatNGo并不特别:

{
    _proto: protoFloatNGo,
    stepChildren: [
        {
            _proto: protoTitle,
            title: "About"
        },
    ],
}

我的理解是我需要在protoFloatNGo中设置mainView以便它在运行时可用,所以我尝试将其放在插槽中(mainView.aboutLayout),但我当我尝试以aboutLayout(我期望的)或GetRoot().|MyApp:MyCompany|.aboutLayout访问它时,得到-48807(未定义的变量)错误。当然,这只会让我得到布局/模板,而不是视图。所以,我也尝试将其添加到mainView.stepChildren,但似乎无法在GetView()中引用它(这是NewtonScript程序员指南中记录的,并建议使用NTK的“声明为”功能)。

所以,按照“声明中的内幕故事”(我通过使用ViewFrame探索Newtoban的运行副本确认),我模仿了stepAllocateContext / preAllocatedContext结构,如下所示:

mainView := {
    _proto: protoFloater,
    viewFlags: vApplication + vVisible + vClickable,
    appSymbol: kAppSymbol,
    viewJustify: vjParentFullH + vjParentFullV,
    viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
    stepChildren: [
        {
            _proto: protoTitle,
            title: kAppTitle
        },
        {
            _proto: newtStatusBar,
            menuLeftButtons: [infoButtonView],
            menuRightButtons: []
        },
        {
            _proto: protoFloatNGo,
            preAllocatedContext: 'aboutView,
            stepChildren: [
                {
                    _proto: protoTitle,
                    title: "About"
                },
            ],
        },
    ],
    aboutView: nil,
    stepAllocateContext: ['aboutView, aboutView],
};

不幸的是,在编译时,我在爱因斯坦安装软件包时遇到了“问题”,表明代码存在一些未知问题。

即使我确实让“声明为”功能正常工作,我该怎么称呼呢?我可以GetRoot().|MyApp:MyCompany|.layoutView:Open();吗?

1 个答案:

答案 0 :(得分:1)

当涉及到步骤子项及其分配时,您的代码看起来是正确的,但我不明白为什么它不起作用...我尝试了相同的方法,但没有newtStatusBar,这看起来很好:

kAppSymbol := '|ProtoTest:40Hz|;
kAppTitle := "ProtoTest";
kVersion := "1.0";

infoButtonProto := {
        _proto: protoInfoButton,
        DoInfoAbout: func ()
        begin
                if not Visible(:Parent().aboutView) then :Parent().aboutView:Open();
        end,
        DoInfoPrefs: func ()
        begin
                :Notify(kNotifyAlert, "MyApp", "DoInfoPrefs() got called!");
        end
};

aboutView := {
        preallocatedContext: 'aboutView,
        _proto: protoFloatNGo,
        viewJustify: vjParentFullH + vjParentCenterV,
        viewBounds: {left: 12, top: 0, right: -12, bottom: 220},
        stepChildren: [
                {
                        _proto: protoTitle,
                        title: "About"
                },
        ],
};

mainView := {
        _proto: protoApp,
        title: kAppTitle,
        appSymbol: kAppSymbol,

        stepChildren: [
                {
                        _proto: infoButtonProto,
                        viewJustify: vjParentRightH + vjParentBottomV + vjCenterH + vjCenterV,
                        viewBounds: {left: -39, top: -16, right: -26, bottom: -3}
                },
        ],

        aboutView: nil,
        stepAllocateContext: [
                'aboutView, aboutView
        ],


        viewJustify: vjParentFullH + vjParentFullV,
        viewBounds: {left: 16, top: 16, right: -16, bottom: -16},
};

{
        app: kAppSymbol,
        text: kAppTitle,
        theForm: mainView,
}
  

即使我确实让“声明为”功能正常工作,我该怎么做   然后打电话给它?我可以做GetRoot()。| MyApp:MyCompany | .layoutView:Open();?

正如您在infoButtonProto中看到的,您可以使用:Parent()方法(或_parent插槽)引用应用程序本身(及其包含的所有插槽),因为该按钮是应用程序的子项。对于aboutView也是如此,它的父亲也应该是app本身。