如何在动作方法中找到被点击的按钮

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();