How to reuse event code?

I have events to which pressing different Keys performs some actions but I need to use the esma thing in more than one Form , How can I do that?

I found the issue of inheritance in C# Windows Forms somewhat complicated.

An example I use to capture the pressing of the keys and synthesize them.

I put an example of what I want to use in another form, but I put an excerpt and as it is very extensive it would be bad to copy and paste into other forms . In the code below when pressing the keys I use the synthesizer to play them.

 public void Form1_KeyDown(object sender, KeyEventArgs e)
  {
  if (e.KeyCode == Keys.NumPad1)
        {
            sintetiza.SpeakAsync("1");
        }
        if (e.KeyCode == Keys.NumPad2)
        {
            sintetiza.SpeakAsync("2");
        }
        if (e.KeyCode == Keys.NumPad3)
        {
            sintetiza.SpeakAsync("3");
        }
        if (e.KeyCode == Keys.NumPad4)
        {
            sintetiza.SpeakAsync("4");
        }
        if (e.KeyCode == Keys.NumPad5)
        {
            sintetiza.SpeakAsync("5");
        }
        if (e.KeyCode == Keys.NumPad6)
        {
            sintetiza.SpeakAsync("6");
        }
        if (e.KeyCode == Keys.NumPad7)
        {
            sintetiza.SpeakAsync("7");
        }
        if (e.KeyCode == Keys.NumPad8)
        {
            sintetiza.SpeakAsync("8");
        }
        if (e.KeyCode == Keys.NumPad9)
        {
            sintetiza.SpeakAsync("9");
        }
        if (e.KeyCode == Keys.NumPad0)
        {
            sintetiza.SpeakAsync("0");
        }
        if (e.KeyCode == Keys.D1)
        {
            sintetiza.SpeakAsync("1");
        }
        if (e.KeyCode == Keys.D2)
        {
            sintetiza.SpeakAsync("2");
        }
        if (e.KeyCode == Keys.D3)
        {
            sintetiza.SpeakAsync("3");
        }
        if (e.KeyCode == Keys.D4)
        {
            sintetiza.SpeakAsync("4");
        }
        if (e.KeyCode == Keys.D5)
        {
            sintetiza.SpeakAsync("5");
        }
        if (e.KeyCode == Keys.D6)
        {
            sintetiza.SpeakAsync("6");
        }
        if (e.KeyCode == Keys.D7)
        {
            sintetiza.SpeakAsync("7");
        }
        if (e.KeyCode == Keys.D8)
        {
            sintetiza.SpeakAsync("8");
        }
        if (e.KeyCode == Keys.D9)
        {
            sintetiza.SpeakAsync("9");
        }
        if (e.KeyCode == Keys.D0)
        {
            sintetiza.SpeakAsync("0");
        }}
Author: Maniero, 2016-07-16

3 answers

This is very simple. Create a class with a method that centralizes the code of these events. Example:

public class SintetizadorHelper //use um nome melhor
{
    // adapte o tipo recebido por parâmetro
    public static void Reproduzir(Sintetizador sintetiza, Keys key)
    {
        if (key.KeyCode == Keys.NumPad1)
        {
            sintetiza.SpeakAsync("1");
        }

        //resto do código
    }
}

Inside the forms, use

public void Form1_KeyDown(object sender, KeyEventArgs e)
{
    SintetizadorHelper.Reproduzir(sintetiza, e.KeyCode);
}
 4
Author: LINQ, 2016-07-16 20:42:46

This is independent of being an event. This is a problem where you create a simple indirection like normal code. That is, just create a generic method with the proper parameters in an auxiliary class and call it where necessary. You don't need any inheritance. It would look something like this:

static class UtilAlgumaCoisa {
    public static void ProcessaTeclas(Keys key, SpeechSynthesizer sintetiza) {
        if (key == Keys.NumPad1) {
            sintetiza.SpeakAsync("1");
        }
        if (key == Keys.NumPad2) {
            sintetiza.SpeakAsync("2");
        }
        if (key == Keys.NumPad3) {
            sintetiza.SpeakAsync("3");
        }
        if (key == Keys.NumPad4) {
            sintetiza.SpeakAsync("4");
        }
        if (key == Keys.NumPad5) {
            sintetiza.SpeakAsync("5");
        }
        if (key == Keys.NumPad6) {
            sintetiza.SpeakAsync("6");
        }
        if (key == Keys.NumPad7) {
            sintetiza.SpeakAsync("7");
        }
        if (key == Keys.NumPad8) {
            sintetiza.SpeakAsync("8");
        }
        if (key == Keys.NumPad9) {
            sintetiza.SpeakAsync("9");
        }
        if (key == Keys.NumPad0) {
            sintetiza.SpeakAsync("0");
        }
        if (key == Keys.D1) {
            sintetiza.SpeakAsync("1");
        }
        if (key == Keys.D2) {
            sintetiza.SpeakAsync("2");
        }
        if (key == Keys.D3) {
            sintetiza.SpeakAsync("3");
        }
        if (key == Keys.D4) {
            sintetiza.SpeakAsync("4");
        }
        if (key == Keys.D5) {
            sintetiza.SpeakAsync("5");
        }
        if (key == Keys.D6) {
            sintetiza.SpeakAsync("6");
        }
        if (key == Keys.D7) {
            sintetiza.SpeakAsync("7");
        }
        if (key == Keys.D8) {
            sintetiza.SpeakAsync("8");
        }
        if (key == Keys.D9) {
            sintetiza.SpeakAsync("9");
        }
        if (key == Keys.D0) {
            sintetiza.SpeakAsync("0");
        }
    }

Then uses like this:

public void Form1_KeyDown(object sender, KeyEventArgs e) {
    UtilAlgumaCoisa.ProcessaTeclas(e.KeyCode, sintetiza);
}

Can possibly simplify the code a bit by using just two conditions instead of 20:

static class UtilAlgumaCoisa {
    public static void ProcessaTeclas(Keys key, SpeechSynthesizer sintetiza) {
        if (key >= Keys.NumPad0 && key <= Keys.NumPad9) sintetiza.SpeakAsync(((char)(48 + Keys.NumPad0 - key)).ToString());
        if (key >= Keys.D0 && key <= Keys.D9) sintetiza.SpeakAsync(((char)(48 + Keys.D0 - key)).ToString());
    }

I put on GitHub for future reference .

In this way one uses mathematics to find the character to be used as an argument. 48 is the ASCII code of character "0". Then add the offset of the options obtained (obtained by the difference the code used and the first code, so if it is the first, the offset of the character will be 0, if it is the second, the offset will be 1, and so on).

 4
Author: Maniero, 2020-02-07 17:14:44

I think the ideal would be to use inheritance itself, but if you don't want to use inheritance, then you can create a class with a static method, something like:

public static void KeyPressed(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.NumPad1)
    {
        sintetiza.SpeakAsync("1");
    }
    if (e.KeyCode == Keys.NumPad2)
    {
        sintetiza.SpeakAsync("2");
    }
    if (e.KeyCode == Keys.NumPad3)
    {
        sintetiza.SpeakAsync("3");
    }
    if (e.KeyCode == Keys.NumPad4)
    {
        sintetiza.SpeakAsync("4");
    }
    if (e.KeyCode == Keys.NumPad5)
    {
        sintetiza.SpeakAsync("5");
    }
    if (e.KeyCode == Keys.NumPad6)
    {
        sintetiza.SpeakAsync("6");
    }
    if (e.KeyCode == Keys.NumPad7)
    {
        sintetiza.SpeakAsync("7");
    }
    if (e.KeyCode == Keys.NumPad8)
    {
        sintetiza.SpeakAsync("8");
    }
    if (e.KeyCode == Keys.NumPad9)
    {
        sintetiza.SpeakAsync("9");
    }
    if (e.KeyCode == Keys.NumPad0)
    {
        sintetiza.SpeakAsync("0");
    }
    if (e.KeyCode == Keys.D1)
    {
        sintetiza.SpeakAsync("1");
    }
    if (e.KeyCode == Keys.D2)
    {
        sintetiza.SpeakAsync("2");
    }
    if (e.KeyCode == Keys.D3)
    {
        sintetiza.SpeakAsync("3");
    }
    if (e.KeyCode == Keys.D4)
    {
        sintetiza.SpeakAsync("4");
    }
    if (e.KeyCode == Keys.D5)
    {
        sintetiza.SpeakAsync("5");
    }
    if (e.KeyCode == Keys.D6)
    {
        sintetiza.SpeakAsync("6");
    }
    if (e.KeyCode == Keys.D7)
    {
        sintetiza.SpeakAsync("7");
    }
    if (e.KeyCode == Keys.D8)
    {
        sintetiza.SpeakAsync("8");
    }
    if (e.KeyCode == Keys.D9)
    {
        sintetiza.SpeakAsync("9");
    }
    if (e.KeyCode == Keys.D0)
    {
        sintetiza.SpeakAsync("0");
    }
}

And inside each Form you just call the responsible method.

public void Form1_KeyDown(object sender, KeyEventArgs e)
{
    ClasseRecemCriada.KeyPressed(sender, e);
}
 1
Author: Christian Beregula, 2016-07-16 20:27:34