我创建了一个程序“freedisk”来在Gtk3网格中显示一些数据。一个新窗口填充了一些用于布局和标记的框,主要内容可以更新,填充网格,本身在VBox中。
数据显示工作正常;问题出在更新过程中。我打算销毁网格中的子窗口小部件,并使用新数据重新创建它们。
存在一个应该触发更新的按钮,单击它时会通过处理程序传递VBox的名称(在程序“Content_Box”中调用),然后运行相应的子程序来销毁Content_Box子节点并重新创建它们。
简化代码如下(处理程序包优先):
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;
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是计算和显示数据的子程序;我暂时把它留在了外面,尽量让事情尽可能简短。
主程序代码(再次大大简化)是:
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上构建的。
答案 0 :(得分:1)
错误消息显示它需要类型Handler
但找到对过程Refresh_Process
的访问权限(尽管基于您提供的代码,我希望编译器找到{{1} }}?),这意味着参数配置文件不兼容。
查看您提供的链接中的示例,回调期望Refresh_Clicked
具有模式Data
。尝试将回调更改为
in