3

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>
Ambush
  • 125
  • 11
  • 2
    Who and where creates an instance of Window and assigns it to `window1`? As the error is saying, it's null at the time `ShowAll` is being called. – scrwtp Mar 01 '17 at 20:24
  • yep, i do realise this, i was struggling code this properly as i am still very much a learner, i have managed to get some help to solve it and understand it a bit better, i will check and if so will post the result – Ambush Mar 01 '17 at 20:33
  • Nothing wrong with not knowing things, no reason to be apologetic. Just meant to ask for clarification/drop you a hint. – scrwtp Mar 01 '17 at 21:02
  • its still eluding me at the moment, but will give it another go tomorow. – Ambush Mar 01 '17 at 22:47
  • @scrwtp, i can't figure this out, as far as i can tell the window1 is not being passed along, and i cant figure how to do this – Ambush Mar 02 '17 at 13:25
  • i am thick sometimes, i have the solution and it was right in front of me, i will post it now, many thanks for your help in pointing it out to me ! – Ambush Mar 02 '17 at 15:15

1 Answers1

3

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

Ambush
  • 125
  • 11
  • For my own understanding - the actual missing bit was the `gxml.Autoconnect(handler)` line, right? I suppose that instantiates the object graph described by the xml and connects it to the `handler` object, so that the `window1` property on the handler gets set to the `GtkWindow` object from the xml? – scrwtp Mar 02 '17 at 19:52
  • no, as far as i can tell the autoconnect was connected originally just as builder rather than gxml, but as i hadn't added a window1 event, there was nothing to do, therefore no window and null, i think it could have been any event at all just to specify, that it had something to do – Ambush Mar 02 '17 at 21:13
  • at least i hope that was it, just a blank handler ? – Ambush Mar 02 '17 at 21:25
  • I could imagine this being the case, but there's nothing about the delete event in the line where you saw an error (the `ShowAll` call). What would happen if you now dropped the `Autoconnect` line? _Disclaimer: I know nothing about gtk_ – scrwtp Mar 02 '17 at 21:33
  • I will give this try, i am pretty sure that without the Autoconnect though it would end up having to be recoded to be a simple Gtk app minus the external glade interface designer – Ambush Mar 03 '17 at 10:36
  • yep, it just throws a null reference again, but this time at handler.window1.DeleteEvent because the builder and handler are no longer connected – Ambush Mar 03 '17 at 10:39