使用 GtkAda 发出信号

2024-03-23

我担心的是我创建了一个回调函数,它应该显示Gtk_Entry当我们点击Gtk_Button但当我点击按钮时什么也没有发生。我不明白。

File.ads

Package Test is

    Type T_Test is record
        Conteneur : Gtk_Fixe;
        L_Entree : Gtk_Entry;
    end Record;

    Procedure Le_Callback (Emetteur : access Gtk_Button_Record'Class);

    Package P is new Gtk.Handlers.Callback (Gtk_Button_Record);

    Use P;

end Test;

File.adb

Package body Test is

    Procedure Initialise_Conteneur (Object : T_Test) is
    begin
        Gtk_New (Object.Conteneur);

    end Initialise_Conteneur;

    Procedure Le_Callback (Emetteur : access Gtk_Button_Record'Classs) is
        V : T_Test;

    begin
        Initialise_Conteneur (Object => V);
        Gtk_New (V.L_Entree);
        V.Conteneur.Add (V.L_Entree);

        V.L_Entree.Show;

    end Le_Callback;
end Test;

Main.adb

Procedure Main is
    Win : Gtk_Window;
    Button : Gtk_Button;
    Posix : T_Test;

begin
    Init;
    Initialize (object => Posix);

    1
    Gtk_New (Win);
    Win.Set_Default_Size (600,400);

    Gtk_New (Button,"Bouton");

    Test.P.Connect (Widget => Button,
                    Name => Signal_Clicked,
                    Marsh => P.To_Marshaller (Le_Test'Access),
                    After => true);

    Posix.Conteneur.Add (Button);
    Win.Add (Posix.Conteneur);

    Win.Show_All;
    Main;

end Main;

修改后的答案。

稍微修改了包...导出 Main 中调用的 Initialize 方法。 (我还添加了一个按钮而不是一个条目,以使我的生活更简单)

with Gtk; use Gtk;
with Gtk.Button; use Gtk.Button;
with Gtk.Handlers; use Gtk.Handlers;
with Gtk.Fixed; use Gtk.Fixed;


Package Test is

    Type T_Test is record
        Conteneur : Gtk_Fixed;
        Bouton : Gtk_Button;
    end Record;
    
    procedure Initialize (Object : out T_Test);

    Procedure Le_Callback (Emetteur : access Gtk_Button_Record'Class);

    Package P is new Gtk.Handlers.Callback (Gtk_Button_Record);

    Use P;

end Test;

包体中的几个问题...

  1. 初始化函数中的参数传递方式。
  2. 确保新的可见对象与旧的可见对象位于不同的位置...(请注意,就手动布局而言,GTK_Fixed 是一个比其他容器更难使用的容器
  3. 回调创建一个新容器(现在里面有一个按钮)...但是直到该容器属于某个东西之前,它无法显示。主窗口在此包中不直接可见,因此我将其添加到发出信号的按钮的父容器中。 (有多种方法可以将用户数据传递给处理程序;您可以使用它来传递顶级窗口或其他一些容器)
  4. 当然,我们必须显示修改,所以让我们重新绘制顶层窗口。

(垃圾文本修复标记问题)

Package body Test is

    Procedure Initialise_Conteneur (Object : out T_Test) is
    begin
        Gtk_New (Object.Conteneur);
    end Initialise_Conteneur;
    
    procedure Initialize (Object : out T_Test) renames Initialise_Conteneur;
  
    Procedure Le_Callback (Emetteur : access Gtk_Button_Record'Class) is
        V : T_Test;
    begin
        Initialise_Conteneur (Object => V);
        Gtk_New (V.Bouton,"Autre_Bouton");
        V.Conteneur.Add (V.Bouton);
        -- make sure it doesn't sit on the other button... 
        -- Using gtk.fixed is hard work compared to newer containers
        V.Conteneur.Move(V.Bouton,0,35);

        -- Add our new GTK_Fixed container to the outer one
        -- note Get_Parent returns a GTK_Widget'Class so we must 
        -- view convert to a GTK_Container or GTK_Fixed to see the Add method
        Gtk_Fixed(Emetteur.Get_Parent).Add(V.Conteneur);

        -- And re-display the top level window
        Emetteur.Get_Toplevel.Show_All;
    end Le_Callback;
end Test;

还有主程序(连接Le_Callback,而不是不存在的Le_Test)...

with Gtk.Button; use Gtk.Button;
with Gtk.Window; use Gtk.Window;
with Gtk.Main;
with test; use test;

Procedure Main is
    Win : Gtk_Window;
    Button : Gtk_Button;
    Posix : T_Test;

begin
    Gtk.Main.Init;
    Initialize (object => Posix);

    Gtk_New (Win);
    Win.Set_Default_Size (600,400);

    Gtk_New (Button,"Bouton");

    Test.P.Connect (Widget => Button,
                    Name => Signal_Clicked,
                    Marsh => P.To_Marshaller (Le_Callback'Access),
                    After => true);
            

    Posix.Conteneur.Add (Button);
    Win.Add (Posix.Conteneur);
    Win.Show_All;
    GTK.Main.Main;

end Main;

还有我的探地雷达文件。

with "gtkada";
-- with "gtkada_gl";
project Test is
   for Main use ("main.adb");
   for Source_Dirs use (".");
   for Object_Dir use "obj";
   for Exec_Dir use ".";

   package Compiler is
      for Default_Switches ("Ada") use ("-g", "-O1", "-gnatafo");
   end Compiler;
   package Binder is
      for Default_Switches ("Ada") use ("-E");
   end Binder;
   package Linker is
--      for Default_Switches ("Ada") use ("-lgtkglada");
   end Linker;
end Test;

现在它可以构建了(将来,请使示例代码可构建!这会节省大量时间),我会看到一个按钮......

按下按钮,第二个按钮出现在其下方,因此我们知道处理程序已连接到该按钮,并接收按钮按下消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GtkAda 发出信号 的相关文章

  • Ada 中的自定义“图像属性”?

    所以我有一件事 type Thing is new record elements end record 我有一个将其字符串化的函数 function ToString t Thing returns string 我希望能够告诉 Ada
  • Ada 中的派生类型和子类型

    有什么区别 首先 术语 它是 Ada 不是 ADA 它是以 Ada Lovelace 命名的 它不是一个缩写词 子类型与其基类型兼容 因此您可以将基类型的操作数与基类型的操作数混合 例如 subtype Week Days is Integ
  • 谁能告诉我 pragma 语句的用法

    谁能告诉我 C 和 Ada 中 pragma 的使用 如果可能的话请提供一些例子 C99 中有 3 个标准编译指示 pragma STDC FP CONTRACT on off switch pragma STDC FENV ACCESS
  • 在 Ada 中创建子类型而不指定范围有什么意义?

    在Ada中 我经常看到这样的东西 type Number is new Integer 这有什么意义呢 难道你就不能快乐吗 Integer 我还看到过这样的代码 type Small Number is range 1 5 这对我来说是有道
  • 从 Ada 调用 scanf

    如何从 Ada 调用 scanf 也就是说 大概有一个适当的 pragma import 声明 但是声明会是什么样子呢 我感兴趣的是如何从 Ada 调用更难以驾驭的 C 函数 而不是如何解析字符串本身 所以我不是在寻找纯粹的 Ada 解决方
  • 是否可以声明具有无限上限的 Ada 范围?

    我想在 Ada 中声明记录类型的速度范围 下面的方法行不通 但是有没有办法让它工作呢 Speed in knots range 0 to unlimited Speed float Range 0 0 unlimited 我只想要这个数字的
  • Ada:从文件中读取

    我正在尝试读取一个包含单列的文件Long Float值在Ada如下 with Ada Text IO use Ada Text IO with Ada Long Float Text IO with Ada Sequential IO pr
  • Ada - 提出可访问性检查

    我从Github下载了这个程序 https github com raph amiard ada synth lib https github com raph amiard ada synth lib 我尝试了第一个例子 但遇到了一个例外
  • 将从 C 例程分配的数组传递给 Ada

    将结构 记录数组从 Ada 传递到 C 例程是一回事 在本例中 内存管理是在 Ada 中完成的 但是在与第三方库接口时经常会出现这样的问题 内存管理是在C部分完成的 例如 对于 C 结构 typedef struct MYREC int n
  • 如何从 Ada 源构建可从 C++ 代码调用的静态库?

    我需要使用一堆用 Ada 编写的代码构建一个静态库 可以从用 C C 编写的代码中调用这些代码 我通过互联网搜索并了解了一些知识gnatmake gnatbind and gnatlink 但仍然无法正确完成工作 另外 我读到有些工具依赖于
  • 标准 ada 包含路径是什么

    我在使用 apt get 安装的 Ubuntu 上使用 gnat 4 6 我需要知道在哪里安装下载的库 例如APQ http sourceforge net projects apq 我应该设置什么ADA INCLUDE PATH and
  • 从 Ada 程序启动可执行文件并读取结果

    I found this https stackoverflow com questions 32663224 why isnt my gnats standout file descriptor working问题和第一个答案包含一些示例
  • Ada:操作员不直接可见

    我正在使用 GNAT GPS studio IDE 来对 Ada 进行一些训练 我遇到了包可见性问题 首先 我在名为 DScale ads 的文件中指定一个包 其中包含以下类型 package DScale is type DMajor i
  • 如何在 Mac OS X 上获取内存泄漏的行编号堆栈跟踪?

    我已经成功获得了 Xcodeleaks报告我的命令行 GCC Ada 程序中的泄漏的工具 通过添加delay 11 0 最后让leaks进行检查 然后 export MallocStackLogging 1 foobar leaks foo
  • Ada:Windows 上的 cmake 和 PLplot 安装

    这是该帖子的后续内容Ada 绘制二维图 https stackoverflow com questions 3210207 ada plotting 2d graphs 我决定创建一个新帖子 因为这是一个单独的问题 Windows 版 PL
  • 从 Ada 访问 c 常量

    我有一个带有这样类型定义的头文件 ifndef SETSIZE define SETSIZE 32 endif typedef struct set unsigned array SETSIZE set t 要使用相应的 C 函数 我需要在
  • Ada95 中的线程和信号量

    如何在 Ada95 中使用线程 我可以使用哪些函数来创建 销毁 停止和启动它们 我如何在这种语言中使用信号量 并发性内置于该语言中 因此您可以为任务 即线程 和受保护对象 即比信号量 互斥体 条件变量更强大 使用特定的 Ada 语法 这使得
  • Ada T'Class 的基础知识

    虽然有点不好意思问这个问题 但我知道这是最好的 我已经使用 Ada 编程很多年了 并且几乎可以流利地理解该语言的每个部分 然而 我似乎始终无法完全理解 T Class 借用别人的话 有人可以 像我五岁一样解释一下吗 编辑 我买它只是为了拥有
  • 使用 SPARK 证明选择排序算法

    我试图证明我在 Ada 中的选择排序实现是正确的 我尝试了一些循环不变量 但使用 gnatprove 只能证明内部循环的不变量 package body Selection with SPARK Mode is procedure Sort
  • Mac OS 上的 Ada 编译器 GNAT

    我正在尝试使用 mac 上的终端编译 ada 但总是收到此错误 错误 x ada 中的 ada 值无效 有人知道如何解决这个问题吗 你可能没有安装Ada编译器 OSX自带的gcc不支持Ada 目前 有两种适用于 OSX 且支持 Ada 的免

随机推荐

  • 如何使用 Bootstrap 将按钮对齐到中心

    我使用 Bootstrap 创建了一个图块 在图块内部 靠近底部 我想要图块的三个按钮 开始 中间和结束 我制作了开始和结束按钮 但使用了两个div标签有pull left and pull right类 现在我想要的是放置中间按钮 这是我
  • browserify 和因子捆绑依赖 ID

    我正在使用 browserify 和 Factor bundle 来管理依赖项 理论上它应该工作得很好 我们在页面上有不同的端点 并且可以非常快速有效地运行因子包分割以进行缓存 问题是我遇到了这个问题 https github com su
  • React 在渲染之前在服务器中获取数据

    我是reactjs新手 我想在服务器中获取数据 以便它将包含数据的页面发送到客户端 当函数 getDefaultProps 返回像这样的虚拟数据 data books 时就可以了 但是不适用于下面的代码 代码按此顺序执行 并显示错误消息 无
  • ERD - 如何使用第三个实体作为“属性”来建模两个实体之间的关系

    我正在对实体关系图进行建模并陷入困境 我不确定我的考虑是否错误 或者 ERD 无法模拟我想要的内容 我有三个实体 员工 项目和角色 员工和项目之间存在关系 员工正在从事项目 但该员工不仅仅在这个项目上工作 他 她还有一个作为角色指定的操作领
  • 带有外键的 Django 表单

    我有一个用户可以拥有多本书的场景 我可以为用户和书籍创建两个不同的模型 并使用外键将它们关联起来 或者一对多是正确的方式 我已经为用户模型创建了一个 django 表单 但是当我这样做时 form as p 在模板中 仅显示用户模型字段 而
  • 如何在android中将 2021-07-06T19:27:46.811+0530 格式转换为 d MMM yyyy, hh:mm aaa 这种格式

    2021 07 06T19 27 46 811 0530 gt 当前值作为字符串 我想转换为 05 07 2021 06 45 am 这种格式 提前致谢 Use java time import java time OffsetDateTi
  • 获取 PostgreSQL 中今天生日的所有条目

    我有以下查询 我需要实现一个需要发送给今天生日的所有客户的邮件程序 这种情况每天都会发生 现在我需要实现的只是使用 Postgres SQL 查询选择生日客户端 而不是在 PHP 中过滤它们 数据库中存储的日期格式为 YYYY MM DD
  • vb.net 向存储过程发送参数

    你好 这是我在 vb net 中使用 ms Visual Studio 2010 的第一个项目 我想创建一个可以将参数发送到 transact sql 数据库中的存储过程的类 我知道如何在 vb 6 中执行此操作 但我不会确定这是否是在这里
  • 为什么我应该使用 (y,x) 而不是 (x,y) 来访问 opencv 中的像素?

    我必须使用 openCV 访问图像中的像素 但一开始我无法访问 因为 python 告诉我我想要访问的值超出范围 然后我搜索了这个错误 我发现我应该使用访问像素image y x 代替image x y 我在这个页面的评论中找到了这条信息
  • 自定义 jquery ui 日期选择器

    是否可以完全定制jquery ui http jqueryui com home日期选择器以匹配您的网站主题 包括标题 按钮和图像的位置 如果可能的话 应该采取什么方法 该怎么办呢 我想 几乎 完全重新设计它 还有哪些其他可能的选择 我尝试
  • 未处理的 Win32 异常

    在运行时 当 myApp exe 崩溃时 我收到 未处理的 Win32 异常 但我如何知道发生了哪个异常 哪里出了问题 对于 Native C 应用程序 请参阅我之前的回答 在 Windows 上检测 重定向核心转储 当软件崩溃时 http
  • 无法使用“PhpParser\Node\Scalar\String”作为类名,因为它是保留的

    当我使用 Composer 安装 Laravel 5 时 出现以下错误 无法按原样使用 PhpParser Node Scalar String 作为类名 保留在 Applications XAMPP xamppfiles htdocs l
  • ggplot2 在函数 R 内时似乎不起作用 [重复]

    这个问题在这里已经有答案了 我对 R 有点陌生 我一直在尝试将 R 脚本包装为函数 以便我可以从 Rserve 调用它 有谁知道为什么 ggplot2 不能在函数内部工作但在函数外部却工作得很好 png polarity png ggplo
  • 围绕其中心点旋转 UIImageView?

    我在 UIImageView 中有一个透明的 png self myImage 我想绕其中心点旋转 代码应该非常简单 self myImage layer setAnchorPoint CGPointMake 0 5 0 5 UIView
  • 在 Win64 下将 SOCKET 转换为 int 安全吗?

    我正在开发 POSIX C 程序的 Windows 端口 问题是标准 POSIX 函数 如accept 或bind 期望 int 作为第一个参数 而其WinSock 对应函数则使用 SOCKET 当编译为 32 位时 一切都很好 因为两者都
  • 获取图像大小而不将图像加载到内存中

    据我所知 您可以通过以下方式使用 PIL 获取图像大小 from PIL import Image im Image open image filename width height im size 但是 我想获取图像的宽度和高度witho
  • 使用 GStreamer 将视频转换为 WebM

    文档用于GStreamer令人困惑 这仍然不是诉诸的借口StackOverflow com 但仍然 是什么GStreamer命令行将任何视频文件 任何格式 转换为 WebM WebM 音频 这是我能找到的唯一带有示例的文档 http gst
  • 使用随机字段解析 JSON (java)

    我想转换一个JSON文件到一个CSV file My JSON文件来自DataBase存储在Firebase并且有这样的结构 PATIENT LbhwHC7Y6 umc age 31 name Phoebe LbhwTFJ6xjEf age
  • 更改 PHP 文件上传的默认临时目录

    我正在本地制作一个网站 允许上传 pdf 文件 当这些文件在本地上传时 它们会转到C xampp tmp但是当我在大学服务器上托管该网站时 我无权访问临时目录 有什么方法可以更改文件的默认临时位置吗 提前致谢 戴夫 可以使用以下命令配置上传
  • 使用 GtkAda 发出信号

    我担心的是我创建了一个回调函数 它应该显示Gtk Entry当我们点击Gtk Button但当我点击按钮时什么也没有发生 我不明白 File ads Package Test is Type T Test is record Contene