GtkBuilder F#对象引用未设置为对象的实例

时间:2017-03-01 18:56:56

标签: f# gtk3 gtkbuilder

我在运行简单应用程序时制作主窗口时出现问题,给出的错误是 - 对象引用未设置为对象的实例。

当应用程序被调试并且错误发生在 handler.window1.ShowAll()

时会发生这种情况

我确实在线发现了一些代码,提示添加一些成员代码,如成员this.Whatever()= window1 但是我不知道这是否与我的代码相关,或者放在哪里它

我很高兴你可以给我任何帮助,因为我一整天都在努力让这项工作以多种方式运作而根本不可能。

namespace potato
module Main =

    open System
    open Gtk

    type Handler()=class
        [<Object>]
        [<DefaultValue(true)>]
        val mutable window1 : Window
    end

        [<EntryPoint>]
        let Main(args) = 
            Application.Init()

            let builder =  new Builder("GUI.ui")
            let handler = new Handler()
            builder.Autoconnect(handler)

            handler.window1.ShowAll()
            Application.Run()
            0

这是glade.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkWindow" id="window1">
    <property name="width_request">1024</property>
    <property name="height_request">576</property>
    <property name="can_focus">False</property>
    <child>
      <placeholder/>
    </child>
  </object>
</interface>

1 个答案:

答案 0 :(得分:3)

是的,问题就在眼前,我最终不得不通过旧的测试项目来查看并了解@scrwtp暗示的内容,这是针对gtk3 gtkbuilder修复的旧工作代码。

namespace potato
module Main =

open System
open Gtk

type Handler()=class
    [<Builder.Object>]
    [<DefaultValue(true)>]
    val mutable window1 : Window
end

let OnDelete (args:DeleteEventArgs) =
    Application.Quit()
    args.RetVal <- true 

[<EntryPoint>]
let Main (args) = 
    Application.Init()

    let gxml =  new Builder("GUI.xml")
    let handler = new Handler()
    do gxml.Autoconnect(handler)

    handler.window1.DeleteEvent
    |> Event.add OnDelete

    handler.window1.ShowAll()
    Application.Run()
    0

原因,我现在明白了,我已经指定了一个处理程序并且没有传递给它,因为没有任何东西被传递给IE :( handler.window1.DeleteEvent)它只是在我调用showall时不会显示,希望这有助于其他人有类似的问题