无法使用Gtkada中的回调处理程序传递框小部件

时间:2017-11-27 23:24:51

标签: callback gtk3 ada gtkada

我创建了一个程序“freedisk”来在Gtk3网格中显示一些数据。一个新窗口填充了一些用于布局和标记的框,主要内容可以更新,填充网格,本身在VBox中。

数据显示工作正常;问题出在更新过程中。我打算销毁网格中的子窗口小部件,并使用新数据重新创建它们。

存在一个应该触发更新的按钮,单击它时会通过处理程序传递VBox的名称(在程序“Content_Box”中调用),然后运行相应的子程序来销毁Content_Box子节点并重新创建它们。

简化代码如下(处理程序包优先):

Freedisk_Cb.ads

package Freedisk_Cb is


   package User_Callback is new Gtk.Handlers.User_Callback
     (Gtk_Widget_Record, Gtk_Box);

   procedure Refresh_Clicked
     (Self : access Gtk_Widget_Record'Class;
      Data : in out Gtk_Box);


end Freedisk_Cb;

Freedisk_Cb.adb

package body Freedisk_Cb is


   procedure Refresh_Clicked
     (Self : access Gtk_Widget_Record'Class;
      Data : in out Gtk_Box)
   is
      begin
         Make_Table (Data);
   end Refresh_Clicked;


end Freedisk_Cb;

Make_Table是计算和显示数据的子程序;我暂时把它留在了外面,尽量让事情尽可能简短。

主程序代码(再次大大简化)是:

freedisk.adb

   Gtk_New (Win);

   Gtk_New_VBox (Content_Box, False, 0);

   Gtk_New (Refresh_Button, "Refresh");

   User_Callback.Object_Connect
     (Refresh_Button, "clicked",
      User_Callback.To_Marshaller (Refresh_Clicked'Access),
      Slot_Object => Win, User_Data => Content_Box);

因此,当我尝试构建它时,我会收到以下错误:

  

freedisk.adb:103:20:没有候选人的解释与实际情况相符:
  freedisk.adb:103:51:期望类型“Handler”在gtk-marshallers.ads:546中定义,实例在gtk-handlers.ads:1164,实例   at freedisk_cb.ads:13
  freedisk.adb:103:51:找到对第103行定义的过程“Refresh_Process”的类型访问权限   freedisk.adb:103:51:==>在gtk-handlers.ads:1205调用“To_Marshaller”,在freedisk_cb.ads:13实例   freedisk.adb:103:51:==>在gtk-handlers.ads:1200调用“To_Marshaller”,在freedisk_cb.ads:13实例   freedisk.adb:103:51:==>在打电话给   gtk-handlers.ads:1195上的“To_Marshaller”,freedisk_cb.ads:13上的实例

等等。

如果传递给回调的VBox“数据”不是输出变量,我不会遇到这个问题,但这种方式并没有多大用处。显然缺少一些基本的东西。

我已经查看了Gtkada文档Plunker的信号页面中的示例 - 提到的示例将其代码列在目录examples / user_data中,遗憾的是我无法将locate(我下载了Gtkada的二进制和源代码发布版)。

先谢谢。任何帮助表示赞赏。

我现在上传完整的代码:http://docs.adacore.com/live/wave/gtkada/html/gtkada_ug/signals.html

可以下载单个文件或完整的tarball。

它是使用2016 GPL Gnat,Gprbuild和Gtkada在Slackware 14.2 x64上构建的。

1 个答案:

答案 0 :(得分:1)

错误消息显示它需要类型Handler但找到对过程Refresh_Process的访问权限(尽管基于您提供的代码,我希望编译器找到{{1} }}?),这意味着参数配置文件不兼容。

查看您提供的链接中的示例,回调期望Refresh_Clicked具有模式Data。尝试将回调更改为

in