【发布时间】:2015-06-29 03:13:25
【问题描述】:
使用 GtkAda,我想确定哪个单选按钮被切换。
我想出的最好的是这段代码不是很漂亮,它会遍历所有按钮以查找切换的按钮:
procedure On_Pgm_Btn_Click
(Button : access Gtk.Widget.Gtk_Widget_Record'Class) is
Button_Array : array (Positive range <>) of Gtk_Radio_Button := (Pgm_Bit, Pgm_1, Pgm_2, Pgm_3, Pgm_4);
begin
for Index In Button_Array'range loop
if Button_Array(Index).Get_Active then
Selected_Program_Button := Button_Array(Index);
exit;
end if;
end loop;
end On_Pgm_Btn_Click;
这是用这个处理程序连接代码调用的:
Gtkada.Handlers.Widget_Callback.Connect (Pgm_Bit, "toggled", On_Pgm_Btn_Click'Unrestricted_Access);
Gtkada.Handlers.Widget_Callback.Connect (Pgm_1, "toggled", On_Pgm_Btn_Click'Unrestricted_Access);
Gtkada.Handlers.Widget_Callback.Connect (Pgm_2, "toggled", On_Pgm_Btn_Click'Unrestricted_Access);
Gtkada.Handlers.Widget_Callback.Connect (Pgm_3, "toggled", On_Pgm_Btn_Click'Unrestricted_Access);
Gtkada.Handlers.Widget_Callback.Connect (Pgm_4, "toggled", On_Pgm_Btn_Click'Unrestricted_Access);
在调试器中可以看到参数Button的值与产生事件的按钮地址相同,但是不知道这个参数的常规使用方式。它的类型是 Gtk.Widget.Gtk_Widget_Record'Class,这表明如果我对单选按钮进行未经检查的转换,我可能会破解代码;
如何从参数按钮中获取单选按钮?
(另外,如果有更好的方法来获取单选按钮组的状态,我想知道。我找不到任何好的例子。)
使用解决方案更新
从下面接受的答案中,我了解到视图转换的实现就像函数调用一样,如ARM 4.6 的示例所示。处理程序变成了这样:
procedure On_Pgm_Btn_Click
(Button : access Gtk.Widget.Gtk_Widget_Record'Class) is
This_Button : Gtk_Radio_Button;
begin
This_Button := Gtk_Radio_Button(Button);
if This_Button.Get_Active then
Selected_Program_Button := This_Button;
end if;
end On_Pgm_Btn_Click;
涉及的类型已经在 gtk-radio-button.ads 中定义为:
type Gtk_Radio_Button_Record is new Gtk_Check_Button_Record with null record;
type Gtk_Radio_Button is access all Gtk_Radio_Button_Record'Class;
在 gtk_widget.ads 中为:
type Gtk_Widget_Record is new GObject_Record with null record;
type Gtk_Widget is access all Gtk_Widget_Record'Class;
因此没有理由重新定义它们或使用已接受答案中提供的包和示例代码。
修改后的代码中重要的一行是:
This_Button := Gtk_Radio_Button(Button);
执行视图转换。
【问题讨论】:
-
为了迂腐,视图转换(像任何类型转换一样)看起来像函数调用;可能不像一个那样实现。