【问题标题】:How to do different things in one procedure depends on event如何在一个过程中做不同的事情取决于事件
【发布时间】:2015-09-10 04:17:56
【问题描述】:

美好的一天。

我们有 3 个按钮、3 个编辑和 3 个复选框。按下按钮时,相应编辑的文本应变为“10”、“20”或“30”,并且复选框应变为选中状态:

如何通过创建一个而不是三个过程来做到这一点? C# 或/和 Delphi(我认为方法必须相同)。这个问题看起来很简单,但我不明白。

【问题讨论】:

  • 您实际使用哪种语言进行编程?显示代码
  • 没有代码,我只是在表单上放了控件!我从 Delphi 开始,然后我在 C# 中尝试过,但在那里也无法使用。实际上,这对我来说并不重要。我可以创建 3 个过程(每个按钮一个),但我只需要一个,正如我所说的。
  • 创建一个按钮 groupid 索引
  • 使用一个通用事件处理程序并根据按下的按钮切换行为
  • @Drew Pierce 我不太明白,你是说分组框还是数组还是别的什么?

标签: c# delphi events event-handling


【解决方案1】:

编写一个事件处理程序并找出哪个组件触发了该事件。在德尔福:

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 的实现以适应您决定使用的任何容器。

【讨论】:

  • 哦,谢谢!这个例子和描述就够了,剩下的代码我可以写了
  • 我已经充实了一点。我希望其余的都清楚。
【解决方案2】:

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

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;

【讨论】:

  • 文本框是否被禁用?
  • 默认启用编辑组件。
【解决方案3】:

您可以在事件处理程序中接收调用者。 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;
        }
    }

【讨论】:

  • 每次点击按钮时创建新控件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多