Как изменить метку в gtkada иglade

У меня возникли проблемы с set_text, чтобы изменить метку, когда я нажал кнопку

ошибка:

Builder results
    C:\Users\MaxPayne\Desktop\Ada workspace\Gui3\src\window_play.adb
        42:16 expected an access type with designated type "Gtk_Label_Record" defined at gtk-label.ads:189
        42:16 found package or procedure name

Ошибка в строке: Set_Text (Label, "Кнопка нажимает:" & Natural'Image (Count));

Это пример кода: of simple_glade3.adb

with Gtk;            use Gtk;
with Gtk.Main;       use Gtk.Main;
with Gtk.Widget;     use Gtk.Widget;
with Gtkada.Builder; use Gtkada.Builder;

-- the following package is user defined.
with Simple_Callbacks; use Simple_Callbacks;
with Window_Play; use Window_Play;

with Gtk.Builder; use Gtk.Builder;
with Gtk.Window; use Gtk.Window;
with Gtk.Button; use Gtk.Button;
with Gtkada.Handlers;  use Gtkada.Handlers;
use Gtkada.Handlers;

with Glib; use Glib;
with Glib.Error; use Glib.Error;
with Gtk.Main;
with Gtk.Label; use Gtk.Label;
with Gtk.Frame;     use Gtk.Frame;
with ada.Text_IO; use ada.Text_IO;


procedure Simple_Glade3 is

   Builder : Gtkada_Builder;
   error : aliased GError;
   Win   : Gtk_Window;
   ret : GUint;
   Button : Gtk_Button;

begin
   Gtk.Main.Init;

   Gtk_New (Builder);
   ret := Builder.Add_From_File ("welcomemenu.glade", error'Access);

   Register_Handler
     (Builder      => Builder,
      Handler_Name => "Main_Quit", -- from XML file <signal handler=..>
      Handler      => Simple_Callbacks.Quit'Access);

   Do_Connect (Builder);

   button := Gtk_Button (Builder.Get_Object ("btn_play"));
   button.On_Clicked (changeLabel'Access);

   Win := Gtk_Window (Builder.Get_Object ("win_main"));
   Win.Show_All;
   Gtk.Main.Main;

   Ada.Text_IO.Put_Line ("The demo is over");
   Unref (Builder);


end Simple_Glade3;

window_play.ads

with Gtkada.Builder; use Gtkada.Builder;
with Gtk.Main;
with Gtk.Button; use Gtk.Button;
package Window_Play is

   procedure Quit (Object : access Gtkada_Builder_Record'Class);
   procedure changeLabel (Self : access Gtk_Button_Record'Class);

end Window_Play;

window_play.adb

with Gtk;            use Gtk;
with Gtk.Main;       use Gtk.Main;
with Glib.Error;     use Glib.Error;
with Gtk.Widget;     use Gtk.Widget;
with Ada.Text_IO;
with Gtkada.Builder; use Gtkada.Builder;

-- the following package is user defined.
with Simple_Callbacks; use Simple_Callbacks;

with Gtk.Builder; use Gtk.Builder;
with Gtk.Window; use Gtk.Window;
with Gtk.Button; use Gtk.Button;
with Gtkada.Handlers;  use Gtkada.Handlers;

with Glib; use Glib;
with Glib.Error; use Glib.Error;
with Gtk.Main;
with Ada.Text_IO; use Ada.Text_IO;
with Gtk.Label; use Gtk.Label;


package body Window_Play is

   Builder : Gtkada_Builder;
   error : aliased GError;
   Win   : Gtk_Window;
   ret : GUint;
   Button : Gtk_Button;
   Count  : Natural := 0;

   procedure Quit (Object : access Gtkada_Builder_Record'Class) is
      pragma Unreferenced (Object);
   begin
      Gtk.Main.Main_Quit;
   end Quit;

   procedure changeLabel (Self : access Gtk_Button_Record'Class) is
   begin
     Count := Count + 1;
     Set_Text (Label, "The button clicks:" & Natural'Image (Count));
   end changeLabel;

end Window_Play;

person user2689972    schedule 11.09.2015    source источник
comment
Префикс сообщения об ошибке 42:16 означает «строка 42, столбец 16». Сущность в столбце 16 этой строки — Label, которая нигде не объявлена; возможно, вы имели в виду Self?   -  person Simon Wright    schedule 11.09.2015
comment
Я уже добавляю метку: Gtk_Label; объявить метку, но ошибка: предупреждение 31: 4: метка переменной читается, но никогда не назначается   -  person user2689972    schedule 12.09.2015
comment
Это не ошибка, это предупреждение. Возможно, вам лучше инициализировать Label. Но в чем смысл параметра changeLabel `Self``? (Обратите внимание, я сам не использую Gtk, это просто наблюдения о вашем коде).   -  person Simon Wright    schedule 12.09.2015


Ответы (1)


Как указал Саймон, компилятор не видит переменную с именем Label в строке 42. Вместо этого он видит пакет Gtk.Label и догадывается, что это то, на что вы ссылаетесь. Предполагая, что вы намерены изменить то, что отображает кнопка, вы должны просто использовать

Self.Set_Label ("The button clicks:" & Count'Img);
person manuBriot    schedule 14.09.2015