From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: gtkada evenhandler on_procedure method , how to access children of topwindow in the eventhandler
Date: Sat, 2 Nov 2019 20:21:29 +0100
Date: 2019-11-02T20:21:29+01:00 [thread overview]
Message-ID: <qpkkvo$19f0$1@gioia.aioe.org> (raw)
In-Reply-To: 36f758fe-203a-47d9-94f9-7db446a86002@googlegroups.com
On 2019-11-02 20:07, Alain De Vos wrote:
> On Saturday, November 2, 2019 at 11:22:49 AM UTC+1, Alain De Vos wrote:
>> I have a window with obe button and one label and want to change the text on the label when the button is pressed in the eventhandler, I pass the top window.
>>
>> procedure hello is
>> Top : Gtk.Window.Gtk_Window;
>> Button : Gtk_Button;
>> Label : Gtk_Label;
>> VBox : Gtk_Box;
>> procedure Create_Window is
>> begin
>> Gtk.Window.Gtk_New
>> (Window => Top,
>> The_Type => Gtk.Enums.Window_Toplevel);
>> Gtk.Window.Set_Title (Window => Top, Title => "Hello from ADA");
>> Gtk_New(Button);
>> Button.On_Clicked (Call => On_Button_Click'Access,
>> Slot => Top);
>> Gtk_New(Label);
>> Gtk_New_Vbox(VBox);
>> Add (VBox,Button);
>> Add (VBox,Label);
>> Add (Top,VBox);
>> Gtk.Window.Show_All (Top);
>> end Create_Window;
>> begin
>> Gtk.Main.Init;
>> Create_Window;
>> Gtk.Main.Main;
>> end hello;
>>
>> I pass the topwindow to the eventhandler(slot).
>> In the eventhandler I need go from the Top to the Vbox to the Label and set the text on the label ... button pressed. I probably need to set a property in the main and query it in the handler and cast the correct type ...
>> {The label is not directly visible in the handler ...}
>>
>> package body buttonhandler is
>> procedure On_Button_Click (Top : access Glib.Object.GObject_Record'Class) is
>> begin
>> Put_line ("Hallo");
>> -- I need to go from Top to Vbox to Label and set text ... ????
>> end On_Button_Click;
>> end buttonhandler;
>
> Ok, so now I try to force a casting, but I'm still not there,
>
> package body buttonhandler is
> type MyVBoxR is new Gtk_VBox_Record with record
> Button : Gtk_Button;
> Label : Gtk_Label;
> end record;
> type MyVBoxT is access all MyVBoxR'Class;
> procedure On_Button_Click (T : access Glib.Object.GObject_Record'Class) is
> MyVBox : MyVBoxT;
> begin
> Put_line ("You pressed");
> MyVBox :=MyVBoxT (T); -- Dangerous
> Gtk.Button.Set_Label (MyVBox.Button,"You pressed");
> end On_Button_Click;
> end buttonhandler;
>
> No compile time warning but a runtime error on "MyVBox :=MyVBoxT (T);" ,
> the error is :
> Hallo
> raised CONSTRAINT_ERROR : buttonhandler.adb:15 tag check failed
Which is why the idea is bad.
The proper conversion would look like this:
MyVBoxR'Class (T.all)'Unchecked_Access
However in Ada it is done rather this way:
procedure On_Button_Click (T : access GObject_Record'Class) is
MyVBox : MyVBoxR'Class renames MyVBoxR'Class (T.all);
begin
MyVBox.Button.Set_Label ("You pressed");
...
Note that in GtkAda you must catch and suppress exceptions. If Ada
exceptions propagate into C code they kill all application. The right
way is this:
with GLib.Messages; use GLib.Messages;
procedure On_Button_Click (T : access GObject_Record'Class) is
begin
declare
MyVBox : MyVBoxR'Class renames MyVBoxR'Class (T.all);
begin
MyVBox.Button.Set_Label ("You pressed");
...
end;
exception
when Error : others =>
Log
( "MyApp",
Log_Level_Critical,
( "Fault: "
& Exception_Information (Error)
& " in On_Button_Click "
) );
end On_Button_Click;
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2019-11-02 19:21 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-02 10:22 gtkada evenhandler on_procedure method , how to access children of topwindow in the eventhandler Alain De Vos
2019-11-02 11:00 ` Alain De Vos
2019-11-02 11:03 ` Dmitry A. Kazakov
2019-11-02 15:27 ` Alain De Vos
2019-11-02 16:18 ` Dmitry A. Kazakov
2019-11-02 19:07 ` Alain De Vos
2019-11-02 19:21 ` Dmitry A. Kazakov [this message]
2019-11-02 22:03 ` Alain De Vos
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox