如何在一个过程中做不同的事情取决于事件
How to do different things in one procedure depends on event
美好的一天。
我们有 3 个按钮、3 个编辑项和 3 个复选框。按下按钮时,相应编辑的文本应变为“10”、“20”或“30”,并且复选框应被选中:
如何通过创建一个过程而不是三个过程来做到这一点? C# or/and Delphi (我认为方法必须相同)。问题看起来很简单,但是我想不通。
使用一个通用事件处理程序找出按下了哪个按钮并相应地设置属性:
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;
编写单个事件处理程序并找出触发该事件的组件。在 Delphi:
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 语句都变得非常笨拙。因此,您可以声明一个包含相关编辑控件的结构。在Delphi
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
的实现,以适应您决定使用的任何容器。
您可以在事件处理程序中接收调用者。发件人对象将持有触发您的事件处理程序的控件。在本例中,它是被点击的按钮。只需查看调用者的内容(或特定名称)并在正确的控件上进行操作。这是 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;
}
}
美好的一天。
我们有 3 个按钮、3 个编辑项和 3 个复选框。按下按钮时,相应编辑的文本应变为“10”、“20”或“30”,并且复选框应被选中:
如何通过创建一个过程而不是三个过程来做到这一点? C# or/and Delphi (我认为方法必须相同)。问题看起来很简单,但是我想不通。
使用一个通用事件处理程序找出按下了哪个按钮并相应地设置属性:
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;
编写单个事件处理程序并找出触发该事件的组件。在 Delphi:
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 语句都变得非常笨拙。因此,您可以声明一个包含相关编辑控件的结构。在Delphi
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
的实现,以适应您决定使用的任何容器。
您可以在事件处理程序中接收调用者。发件人对象将持有触发您的事件处理程序的控件。在本例中,它是被点击的按钮。只需查看调用者的内容(或特定名称)并在正确的控件上进行操作。这是 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;
}
}