如何在一个程序中执行不同的操作取决于事件

时间:2015-06-24 05:44:29

标签: c# delphi events event-handling

美好的一天。

我们有3个按钮,3个编辑和3个复选框。按下按钮时,相应编辑的文本应变为" 10"," 20"或" 30"和复选框应该被选中:

enter image description here

如何通过创建一个过程而不是三个来完成它? C#或/和Delphi(我认为方法必须相同)。问题看起来很简单,但我无法理解。

3 个答案:

答案 0 :(得分:4)

编写单个事件处理程序并查找触发事件的组件。在德尔斐:

procedure TForm1.ButtonClick(Sender: TObject);
begin
  if Sender = Button1 then
    // react to Button1 being pressed
  else if Sender = Button2 then 
    // react to Button2 being pressed
  // etc. 
end;

在C#中,对于WinForms和WPF,发送方也会传递给事件处理程序。例如:

// WPF example
private void button_Click(object sender, RoutedEventArgs e)
{
    if (sender == button1)
      // and so on just as above
}

并且

// WinForms
private void button_Click(object sender, EventArgs e)
{
    if (sender == button1)
      // and so on just as above
}

当然所有这些if语句都非常笨重。因此,您可以声明包含相关编辑控件的结构。在德尔福

type
  TControlGroup = record
    Button: TButton;
    Edit: TEdit;
    CheckBox: TCheckBox;
    DefaultEditText: string;
  end;

定义这些数组,或者可能是字典。在构建表单时填充容器。然后添加一个方法以从按钮实例中查找结构。然后,这允许您参数化GUI代码以避免重复。

您的处理程序可能如下所示:

InitialiseGroup(FindGroup(Sender as TButton));
....
procedure TForm1.InitialiseGroup(const Group: TControlGroup);
begin
  Group.Edit.Text := Group.DefaultEditText;
  Group.CheckBox.Checked := True;
end;

显然,您需要填写FindGroup的实现,以适应您决定使用的任何容器。

答案 1 :(得分:3)

使用一个公共事件处理程序找出按下了哪个按钮并相应地设置属性:

procedure TForm1.ButtonClick(Sender: TObject);
begin
  if (Sender = Button1) then
  begin
    Edit1.Text := '10';
    Check1.Checked := True;
  end
  else
  if (Sender = Button2) then
  begin
    Edit2.Text := '20';
    Check2.Checked := True;
  end
  else
  if (Sender = Button3) then
  begin
    Edit3.Text := '30';
    Check3.Checked := True;
  end;
end;

答案 2 :(得分:1)

您可以在事件处理程序中接收调用者。 sender对象将保存触发事件处理程序的控件。在这种情况下,它是点击的按钮。只需查看调用者的内容(或特定名称)并操作正确的控件即可。这是C#WPF中的一个示例。

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        Button clickedButton = sender as Button;

        switch(clickedButton.Content.ToString())
        {
            case "Button1":
                textbox1.Text = "10";
                checkbox1.IsChecked = true;                                        
                break;
            case "Button2":
                textbox2.Text = "20";
                checkbox2.IsChecked = true;
                break;
            case "Button3":
                textbox3.Text = "30";
                checkbox3.IsChecked = true;                    
                break;
            default:
                break;
        }
    }