如何在动作方法中找到被点击的按钮
How to find the clicked button in the action method
当我有一个对话框并且多个按钮具有相同的点击回调(操作方法)时,我最想知道哪个按钮被按下了。我该怎么做?
示例:
class ButtonDialog : UIFrame{
void button_pressed(object self){
// how do I get this button
TagGroup pressed_button = ?;
result("The button " + pressed_button + " is pressed.\n");
}
object init(object self){
TagGroup dlg, dlg_items, button1, button2;
dlg = DLGCreateDialog("Press a button", dlg_items);
button1 = DLGCreatePushButton("Button 1", "button_pressed");
button1.DLGIdentifier("button1");
dlg_items.DLGAddElement(button1);
button2 = DLGCreatePushButton("Button 2", "button_pressed");
button2.DLGIdentifier("button2");
dlg_items.DLGAddElement(button2);
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();
在我当前的程序中,我从 TagGroup
创建了多行。每行都有多个按钮执行相同的操作,但针对它们的特定行。因此我需要知道是哪个按钮来修改行。 TagGroup
的长度和行数也不固定。所以我不能创建 button1_pressed
, button2_pressed
, ... 函数,除非在运行中用代码评估做一些奇怪的事情,我想尽可能避免。
所以我找到了一个我可以接受的答案,但我仍然希望有更好的结果。
我目前的想法是使用 DualStateBevelButtons。如果单击按钮,状态会更改并执行回调。然后检查所有按钮是否更改了状态。如果是,这就是被点击的按钮,状态被重置。
这个解决方案非常非常大的缺点是,只有允许带有图像的按钮,没有文本是可能的。所以这并不是真正的通用解决方案。
rgbimage button_img = RGBImage("button-image", 4, 16, 16);
button_img = max(0, 255 - iradius / 8 * 255);
class ButtonDialog : UIFrame{
TagGroup buttons;
void button_pressed(object self){
for(number i = 0; i < buttons.TagGroupCountTags(); i++){
TagGroup button;
if(buttons.TagGroupGetIndexedTagAsTagGroup(i, button)){
if(button.DLGGetValue() == 1){
// this button is toggled so it is clicked
string identifier;
button.DLGGetIdentifier(identifier);
result("Button " + i + " (" + identifier + ") is clicked.\n");
// reset button state
button.DLGBevelButtonOn(0);
// do not continue searching, found pressed button already
break;
}
}
}
}
object init(object self){
TagGroup dlg, dlg_items, button1, button2;
dlg = DLGCreateDialog("Press a button", dlg_items);
buttons = NewTagList();
button1 = DLGCreateDualStateBevelButton("button1", button_img, button_img, "button_pressed");
buttons.TagGroupInsertTagAsTagGroup(infinity(), button1);
dlg_items.DLGAddElement(button1);
button2 = DLGCreateDualStateBevelButton("button2", button_img, button_img, "button_pressed");
buttons.TagGroupInsertTagAsTagGroup(infinity(), button2);
dlg_items.DLGAddElement(button2);
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();
您不能在 push-button 的简单 call-back 中传递参数这一事实有点令人失望。最简单的解决方案(尽管不优雅)是使用 simple-one-line-callback 方法,这些方法是唯一的,但它们本身会调用通用方法,如下面的代码所示。
当然 mile7 声明按钮的数量在编译时不固定,这是一个问题。但是除非(潜在的)按钮数量很多,否则这种方法仍然是最简单和最干净的方法,并且由于每个“硬编码”call-back 只是一行进行了非常系统的更改,因此使用起来应该相当简单Notepad++ 或类似的工具提供足够广泛的此类调用集。 (如果其中一些实际上从未使用过,也没有什么坏处。)
class ButtonDialog : UIFrame{
void button_pressed(object self, string buttonID){
// how do I get this button
TagGroup pressed_button = self.LookUpElement(buttonID);
if ( pressed_button.TagGroupIsValid() )
result("The button " + buttonID + " is pressed.\n");
else
result("The button " + buttonID + " was not found!\n");
}
// Need to be done for each button
void button_pressed_0(object self) { self.button_pressed("button0"); }
void button_pressed_1(object self) { self.button_pressed("button1"); }
object init(object self){
TagGroup dlg, dlg_items
dlg = DLGCreateDialog("Press a button", dlg_items);
number nButtons = 2
for( number n=0; n<nButtons; n++ ){
TagGroup button = DLGCreatePushButton("Button " + n , "button_pressed_" + n);
button.DLGIdentifier("button" + n);
dlg_items.DLGAddElement(button);
}
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();
当我有一个对话框并且多个按钮具有相同的点击回调(操作方法)时,我最想知道哪个按钮被按下了。我该怎么做?
示例:
class ButtonDialog : UIFrame{
void button_pressed(object self){
// how do I get this button
TagGroup pressed_button = ?;
result("The button " + pressed_button + " is pressed.\n");
}
object init(object self){
TagGroup dlg, dlg_items, button1, button2;
dlg = DLGCreateDialog("Press a button", dlg_items);
button1 = DLGCreatePushButton("Button 1", "button_pressed");
button1.DLGIdentifier("button1");
dlg_items.DLGAddElement(button1);
button2 = DLGCreatePushButton("Button 2", "button_pressed");
button2.DLGIdentifier("button2");
dlg_items.DLGAddElement(button2);
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();
在我当前的程序中,我从 TagGroup
创建了多行。每行都有多个按钮执行相同的操作,但针对它们的特定行。因此我需要知道是哪个按钮来修改行。 TagGroup
的长度和行数也不固定。所以我不能创建 button1_pressed
, button2_pressed
, ... 函数,除非在运行中用代码评估做一些奇怪的事情,我想尽可能避免。
所以我找到了一个我可以接受的答案,但我仍然希望有更好的结果。
我目前的想法是使用 DualStateBevelButtons。如果单击按钮,状态会更改并执行回调。然后检查所有按钮是否更改了状态。如果是,这就是被点击的按钮,状态被重置。
这个解决方案非常非常大的缺点是,只有允许带有图像的按钮,没有文本是可能的。所以这并不是真正的通用解决方案。
rgbimage button_img = RGBImage("button-image", 4, 16, 16);
button_img = max(0, 255 - iradius / 8 * 255);
class ButtonDialog : UIFrame{
TagGroup buttons;
void button_pressed(object self){
for(number i = 0; i < buttons.TagGroupCountTags(); i++){
TagGroup button;
if(buttons.TagGroupGetIndexedTagAsTagGroup(i, button)){
if(button.DLGGetValue() == 1){
// this button is toggled so it is clicked
string identifier;
button.DLGGetIdentifier(identifier);
result("Button " + i + " (" + identifier + ") is clicked.\n");
// reset button state
button.DLGBevelButtonOn(0);
// do not continue searching, found pressed button already
break;
}
}
}
}
object init(object self){
TagGroup dlg, dlg_items, button1, button2;
dlg = DLGCreateDialog("Press a button", dlg_items);
buttons = NewTagList();
button1 = DLGCreateDualStateBevelButton("button1", button_img, button_img, "button_pressed");
buttons.TagGroupInsertTagAsTagGroup(infinity(), button1);
dlg_items.DLGAddElement(button1);
button2 = DLGCreateDualStateBevelButton("button2", button_img, button_img, "button_pressed");
buttons.TagGroupInsertTagAsTagGroup(infinity(), button2);
dlg_items.DLGAddElement(button2);
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();
您不能在 push-button 的简单 call-back 中传递参数这一事实有点令人失望。最简单的解决方案(尽管不优雅)是使用 simple-one-line-callback 方法,这些方法是唯一的,但它们本身会调用通用方法,如下面的代码所示。
当然 mile7 声明按钮的数量在编译时不固定,这是一个问题。但是除非(潜在的)按钮数量很多,否则这种方法仍然是最简单和最干净的方法,并且由于每个“硬编码”call-back 只是一行进行了非常系统的更改,因此使用起来应该相当简单Notepad++ 或类似的工具提供足够广泛的此类调用集。 (如果其中一些实际上从未使用过,也没有什么坏处。)
class ButtonDialog : UIFrame{
void button_pressed(object self, string buttonID){
// how do I get this button
TagGroup pressed_button = self.LookUpElement(buttonID);
if ( pressed_button.TagGroupIsValid() )
result("The button " + buttonID + " is pressed.\n");
else
result("The button " + buttonID + " was not found!\n");
}
// Need to be done for each button
void button_pressed_0(object self) { self.button_pressed("button0"); }
void button_pressed_1(object self) { self.button_pressed("button1"); }
object init(object self){
TagGroup dlg, dlg_items
dlg = DLGCreateDialog("Press a button", dlg_items);
number nButtons = 2
for( number n=0; n<nButtons; n++ ){
TagGroup button = DLGCreatePushButton("Button " + n , "button_pressed_" + n);
button.DLGIdentifier("button" + n);
dlg_items.DLGAddElement(button);
}
self.super.init(dlg);
return self;
}
}
object dialog = alloc(ButtonDialog).init();
dialog.pose();