program inheritancedemo; {$mode objfpc}{$H+} uses Classes, Gtk3,GObject2,GLib2, Math, gtk3mybutton; // these procedures are signal handlers. they are called when a signal is emitted procedure Gtk_Window_Destroy(Sender: PGtkWidget; user_data: gpointer); cdecl; begin if gtk_main_level > 0 then gtk_main_quit; end; procedure Button_Click(Sender: PGtkWidget; user_data: gpointer); cdecl; begin gtk_main_quit; end; procedure CreateWidgets; var Win: PGtkWindow; Button: PMyButton; begin // first create window Win := TGtkWindow.new(GTK_WINDOW_TOPLEVEL); Win^.set_title('Hello World!'); Win^.set_size_request(300,200); //then create a button and add it to the window Button := TMyButton.new; Button^.label_:='Quit'; Button^.tooltip_text:='Don''t click me unless you want to!'; Win^.add(PGtkWidget(Button)); // now connect signals g_signal_connect_data(Win, 'destroy', TGCallback(@Gtk_Window_Destroy), nil, nil, 0); //g_signal_connect_data(Button, 'clicked', TGCallback(@Button_Click), nil, nil, 0); Button^.OnClicked:=@Button^.QuitProgram; Win^.show_all; end; begin SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision]); gtk_init(@argc, @argv); CreateWidgets; gtk_main; end.