Deutsch   English   Français   Italiano  
<shv0d7$1sv$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!weretis.net!feeder6.news.weretis.net!feeder8.news.weretis.net!eternal-september.org!reader02.eternal-september.org!.POSTED!not-for-mail
From: "J-P. Rosen" <rosen@adalog.fr>
Newsgroups: fr.comp.lang.ada
Subject: Re: Les Callback en Ada
Date: Thu, 16 Sep 2021 10:48:40 +0200
Organization: Adalog
Lines: 59
Message-ID: <shv0d7$1sv$1@dont-email.me>
References: <e0c35ed1-c15f-419f-a724-07a3c3bf5d2an@googlegroups.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 16 Sep 2021 08:48:39 -0000 (UTC)
Injection-Info: reader02.eternal-september.org; posting-host="5b60779584a2e5b71f73877a7f1951e3";
	logging-data="1951"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18rDB1TT8rbAK04C+9h6yU/"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101
 Thunderbird/78.14.0
Cancel-Lock: sha1:yTnKaMFSppR+M28MJEAy2vSspP0=
In-Reply-To: <e0c35ed1-c15f-419f-a724-07a3c3bf5d2an@googlegroups.com>
Content-Language: fr
Bytes: 3005

Le 16/09/2021 à 04:29, Danielle Mandi Mayagha a écrit :
> Salut Salut Je viens avec un tout petit (un gros enfaite) problème  qui me sauf un peu le cerveau. bon voila! j'essaie de faire un Callback avec un Bouton mais le souci c'est que ce bon vieux Gnat me dit ceci ( pour info je suis carrément nul en anglais😊😛) :
>    Instantiation error at gtk-handlers.ads : 1039
> Subprogram must not be deeper than access type.
> 
[...]

> voici mon code :
> 
> WITH Gtk.Main;             USE Gtk.Main;
> WITH Gtk.Widget;         USE Gtk.Widget;
> WITH Gtk.Window;        USE Gtk.Window;
> WITH Gtk.Enums;          USE Gtk.Enums;
> WITH Gtk.Button;           USE Gtk.Button;
> WITH Gtk.Handlers;
> 
> Procedure Test is
> 
> Package P_Callback is new Gtk.Handlers.Callback (Gtk_Widget_Record);
> USE P_Callback;
> 
> Procedure Stop_Program ( Emetteur : Gtk_Widget_Record'Class ) is
> Pragma Unreferenced (Emetteur);
> begin
> Main_Quit;
> 
> end Stop_Program;
Ici, Stop_Program est un sous-programme interne à la procédure Test
> 
> Win : Gtk_Window;
> Bouton : Gtk_Button;
> 
> begin
> Init;
> 
> Gtk_New (Win);
> Win.Set_Default_Size (600,400);
> 
> Gtk_New (Bouton,"Le Bouton");
> 
> 
> Win.Add (Bouton);
> 
> P_Callback.Connect (Bouton,"Clicked", To_marshaller (Stop_Program'Access));
Le type attendu par To_Marshaller est un pointeur global. On ne peut lui 
passer un sous-programme local, car il y aurait un risque de pouvoir 
accéder au sous-programme après être sorti de sa portée.

Le plus simple: sors Stop_Program de Test en le mettant dans un fichier 
séparé. (bien sûr, pour pouvoir y accéder, Test devra faire un "with 
Stop_Program;")


-- 
J-P. Rosen
Adalog
2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
Tel: +33 1 45 29 21 52
https://www.adalog.fr