所附代码编译并运行。
$ ./xml_code XML 加载正常
(xml_code:31196):Gtk-CRITICAL **:22:24:59.048:gtk_color_chooser_get_rgba:断言“GTK_IS_COLOR_CHOOSER(选择器)”失败 红色:0.00000000000000E+00 绿色:6.64864036484338E-310 蓝色:6.95298171953014E-310 阿尔法:6.64864036156160E-310
(xml_code:31196):Gtk-CRITICAL **:22:25:02.163:gtk_color_chooser_get_rgba:断言“GTK_IS_COLOR_CHOOSER(选择器)”失败 红色:0.00000000000000E+00 绿色:6.64864036484338E-310 蓝色:6.95298171953014E-310 阿尔法:6.64864036156160E-310 ^C $
但我无法检索用户输入的颜色。 事实上,我不知道如何加载window_callbacks.adb文件中的“procedure On_Color1_Color_Set”过程中“Self”变量的值。 我找不到加载变量的正确方法。也许这是来自 GtkAda 的问题,因为 C 代码运行正确,我不知道? 谢谢 马克
--=- xml_code.adb -=-
-- units from Gtk
with Gtk.Main;
with Glib.Error; use Glib.Error;
with Gtk.Widget; use Gtk.Widget;
with Gtk.Builder; use Gtk.Builder;
with Gtkada.Builder; use Gtkada.Builder;
-- Ada predefined units
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions;
-- Application specific units
with Window_Callbacks; use Window_Callbacks;
procedure XML_Code is
Builder : Gtkada_Builder;
Error : aliased Glib.Error.GError;
-- xml / Glade
Mon_Interface : Constant String := "<?xml version=""1.0"" encoding=""UTF-8""?>"
& "<!-- Generated with glade 3.40.0 -->"
& "<interface>"
& " <requires lib=""gtk+"" version=""3.24""/>"
& " <object class=""GtkAdjustment"" id=""adjustment1"">"
& " <property name=""upper"">100</property>"
& " <property name=""step-increment"">1</property>"
& " <property name=""page-increment"">10</property>"
& " </object>"
& " <object class=""GtkListStore"" id=""liststore1"">"
& " <columns>"
& " <!-- column-name Col_1 -->"
& " <column type=""gchararray""/>"
& " </columns>"
& " <data>"
& " <row>"
& " <col id=""0"">Ligne-1</col>"
& " </row>"
& " <row>"
& " <col id=""0"">bbb</col>"
& " </row>"
& " <row>"
& " <col id=""0"">dddd</col>"
& " </row>"
& " <row>"
& " <col id=""0"">eeeeeeee</col>"
& " </row>"
& " <row>"
& " <col id=""0"">ligne-5</col>"
& " </row>"
& " <row>"
& " <col id=""0"">ligne-6</col>"
& " </row>"
& " </data>"
& " </object>"
& " <object class=""GtkWindow"" id=""window"">"
& " <property name=""name"">window</property>"
& " <property name=""width-request"">89</property>"
& " <property name=""height-request"">3</property>"
& " <property name=""can-focus"">False</property>"
& " <property name=""hexpand"">True</property>"
& " <property name=""vexpand"">True</property>"
& " <property name=""border-width"">0</property>"
& " <property name=""window-position"">center</property>"
& " <property name=""gravity"">center</property>"
& " <child>"
& " <object class=""GtkFixed"" id=""fixed1"">"
& " <property name=""name"">fixed1</property>"
& " <property name=""visible"">True</property>"
& " <property name=""can-focus"">False</property>"
& " <child>"
& " <object class=""GtkColorButton"" id=""color1"">"
& " <property name=""width-request"">100</property>"
& " <property name=""height-request"">33</property>"
& " <property name=""visible"">True</property>"
& " <property name=""can-focus"">True</property>"
& " <property name=""receives-default"">True</property>"
& " <signal name=""color-set"" handler=""on_color1_color_set"" swapped=""no""/>"
& " </object>"
& " <packing>"
& " <property name=""x"">298</property>"
& " <property name=""y"">303</property>"
& " </packing>"
& " </child>"
& " </object>"
& " </child>"
& " </object>"
& "</interface>";
use type Glib.Guint;
begin
Gtk.Main.Init;
Gtk_New (Builder);
if Add_From_String (Gtk_Builder(Builder), Mon_Interface, Error'Access) = 0 then
Put_Line ("Error : " & Get_Message (Error));
Error_Free (Error);
return;
end if;
Put_Line ("Loading of XML is OK ");
Register_Handler (Builder, "on_window1_delete_event", On_Window1_Delete_Event'Access);
Register_Handler (Builder, "on_color1_color_set", On_Color1_Color_Set'Access);
Do_Connect (Builder);
Show_All (Gtk_Widget (Get_Object (GTK_Builder (Builder), "window")));
Gtk.Main.Main;
Unref (Builder);
end XML_Code;
--=- window_callbacks.ads -=-
with Gtkada.Builder; use Gtkada.Builder;
package Window_Callbacks is
function On_Window1_Delete_Event (Builder : access Gtkada_Builder_Record'Class) return Boolean; --Ajout
Procedure On_Color1_Color_Set (Builder : access Gtkada_Builder_Record'Class);
end Window_Callbacks;
--=- window_callbacks.adb --=--
-- units from GtkAda
with Gtk.Main;
with Gtk.Color_Chooser; use Gtk.Color_Chooser;
with Gdk.RGBA; use Gdk.RGBA;
-- units from Glib
with Glib; use Glib;
-- Ada predefined units
with Ada.Text_IO; use Ada.Text_IO;
package body Window_Callbacks is
-----------------------------------------------
-- On_Window1_Delete_Event
-----------------------------------------------
function On_Window1_Delete_Event
(Builder : access Gtkada_Builder_Record'Class) return Boolean is
pragma Unreferenced (Builder); -- C'est sciemment que Builder n'est pas utilisé dans la fonction
begin
Gtk.Main.Main_Quit;
return False;
end On_Window1_Delete_Event;
---------------------------------
-- On_Color1_Color_Set --
---------------------------------
procedure On_Color1_Color_Set (Builder : access Gtkada_Builder_Record'Class) is
pragma Unreferenced (Builder);
Self : Gtk_Color_Chooser;
Color : Gdk_RGBA;
begin
Gtk.Color_Chooser.Get_RGBA (Self, Color);
put_line ("Red : " & Gdouble'Image (Color.Red));
put_line ("Green : " & Gdouble'Image (Color.Green));
put_line ("Blue : " & Gdouble'Image (Color.Blue));
put_line ("Alpha : " & Gdouble'Image (Color.Alpha));
end On_Color1_Color_Set;
end Window_Callbacks;
问题在于,在On_Color1_Color_Set中,self只是一个空值。 Gtk_Color_Chooser 已关闭,因此无法访问它。 您唯一可以使用的是按钮 Color1。
首先,将 Color_Button 的声明添加到
with
语句中
with Gtk.Color_Button; use Gtk.Color_Button;
with Gtk.Widget; use Gtk.Widget;
Gtk.Color_Chooser 可以删除。 在回调中
procedure On_Color1_Color_Set(builder: access Gtkada_Builder_Record'Class) is
self: Gtk_Color_Button;
widget: Gtk_Widget;
rgba: Gdk_RGBA;
begin
-- This can all be done in one statement but it
-- is more difficult to track in the debugger
widget := Gtk_Widget(builder.Get_Object("color1"));
-- Get the color button
self := Gtk_Color_Button(widget);
-- Get the RGBA value from the button
Gtk.Color_Button.Get_RGBA(self, rgba);
-- Convert RGBA to a string
declare
color: constant String := To_String(rgba);
begin
Put_Line(color);
-- RGB values in floating point format
Put_Line("Red " & rgba.red'image);
Put_Line("Green " & rgba.green'image);
Put_Line("Blue " & rgba.blue'image);
Put_Line("Alpha " & rgba.alpha'image);
end;
end On_Color1_Color_Set;