Search code examples
f#gtk3gtkbuilder

GtkBuilder F# Object reference not set to an instance of an object


I have a problem with making the mainwindow on my simple app run, The error given is that - Object reference not set to an instance of an object.

this happens when the app is getting debugged and the error occurs at handler.window1.ShowAll()

I did find some code online which hints at adding some member code as in member this.Whatever() = window1 however i have no idea if this is relevent to my code, or where to put it.

i am happy for any help you can give me as i have been trying all day to get this working in many ways and simply cannot.

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

Here is the 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>

Solution

  • Right, the problem was right in front of my eyes, and i ended up having to go through old test projects to see and realise what @scrwtp was hinting at, this is the old working code fixed for 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
    

    The reason, i now understand is that i had specified a handler and passed nothing to it, because nothing was passed it IE:(handler.window1.DeleteEvent) it simply wouldnt show when i called showall, hope this helps someone else with a similar problem