comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: "subprogram must not be deeper than access type"
Date: Tue, 6 Oct 2020 08:08:04 +0200	[thread overview]
Message-ID: <rlh1k3$nka$1@gioia.aioe.org> (raw)
In-Reply-To: 3139cefa-f8e1-4fc1-be15-2615eeaa89fdn@googlegroups.com

On 06/10/2020 06:00, andrew...@gmail.com wrote:
> On Saturday, October 3, 2020 at 2:42:01 AM UTC-4, Dmitry A. Kazakov wrote:

> I guess I'm not sure what you mean by #1.  The handler package contains another package, Callback.  And the compiler never really gets to the methods (Destroy and Delete_Event), it stops when I try to create a new package from an existing one.

It stops on compiling a call to connect a handler to the event. The 
handler is declared deeper than the pointer the event uses to refer to 
the handler. The language requires that in order to prevent the 
situation when the handler ceases to exist but the event still may be 
emitted.

> Could you please show me an example of what you mean?
-----------------------------------------------------------------
with Gtk.Widget;  use Gtk.Widget;

package My_Handlers is
    function Delete_Event (Widget : access Gtk_Widget_Record'Class)
       return Boolean;
    procedure Destroy (Widget : access Gtk_Widget_Record'Class);
end My_Handlers;
-----------------------------------------------------------------
with Gtk.Main;

package body My_Handlers is
    function Delete_Event (Widget : access Gtk_Widget_Record'Class)
       return Boolean is
    begin
       return False;
    end Delete_Event;

    procedure Destroy (Widget : access Gtk_Widget_Record'Class) is
    begin
       Gtk.Main.Main_Quit;
    end Destroy;
end My_Handlers;
-----------------------------------------------------------------
with Gtk.Label;
with Gtk.Window;
with Gtk.Widget;
with Gtk.Handlers;
with Gtk.Main;
with My_Handlers;

procedure Event_Handlers_Window is
   Window : Gtk.Window.Gtk_Window;
   Label  : Gtk.Label.Gtk_Label;
begin
   Gtk.Main.Init;
   Gtk.Window.Gtk_New (Window);
   Gtk.Label.Gtk_New (Label, "Goodbye, World!");
   Gtk.Window.Add (Window, Label);
   Window.On_Delete (My_Handlers.Delete_Event'Access); -- Connect handler
   Window.On_Destroy (My_Handlers.Destroy'Access);

   Gtk.Label.Show_All (Label); -- Could drop this and use
   Gtk.Window.Show (Window);   -- Show_All here

   Gtk.Main.Main;
end Event_Handlers_Window;
-----------------------------------------------------------------
> Also, I looked through the docs and couldn't find Gtk.Missed... did you mean some other method/package?

    http://www.dmitry-kazakov.de/ada/gtkada_contributions.htm#5

Scroll down to the declarations of

Delete_Event_Handler
Destroy_Handler

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de

      reply	other threads:[~2020-10-06  6:08 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-03  4:39 "subprogram must not be deeper than access type" andrew...@gmail.com
2020-10-03  6:41 ` Dmitry A. Kazakov
2020-10-06  4:00   ` andrew...@gmail.com
2020-10-06  6:08     ` Dmitry A. Kazakov [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox