5

Tenho eventos ao que ao pressionar diferentes teclas realiza algumas ações porém preciso usar a esma coisa em mais de um form, como posso fazer isso?

Achei meio complicada a questão de herança em em C# Windows Forms.

Um exemplo que utilizo para capturar o o pressionamento das teclas e sintetizá-las.

Coloquei um exemplo do que quero utilizar em outro form, mas coloquei um trecho e como é bem extenso ficaria ruim de copiar e colar em outros forms. No código abaixo ao pressionar as teclas eu utilizo o sintetizador para reproduzi-las.

 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");
        }}
4
  • Que tipo de código você quer reutilizar? Tem como postar um exemplo?
    – Jéf Bueno
    Commented 16/07/2016 às 20:07
  • Jovem, o que é sintetiza?
    – Jéf Bueno
    Commented 16/07/2016 às 20:17
  • sintetiza é o objeto criado, utilizando a API speech, para sintetizar textos..
    – LocalHost
    Commented 16/07/2016 às 20:21
  • Alguma das respostas abaixo resolveu o seu problema? Acha que pode aceitar uma delas? Veja o tour como fazer isso, se ainda não sabe como fazê-lo. Assim ajuda a comunidade identificando qual foi a melhor solução para você. Só pode aceitar apenas uma delas, mas pode votar em qualquer pergunta ou resposta que achar útil no site todo.
    – Maniero
    Commented 24/09/2016 às 16:07

3 Respostas 3

4

Isso é muito simples. Crie uma classe com um método que centralize o código destes eventos. Exemplo:

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
    }
}

Dentro dos forms, use

public void Form1_KeyDown(object sender, KeyEventArgs e)
{
    SintetizadorHelper.Reproduzir(sintetiza, e.KeyCode);
}
1
  • Obrigado, bastante, valeuzão
    – LocalHost
    Commented 16/07/2016 às 20:50
4

Isto independe de ser evento. Isto é um problema em que você cria uma indireção simples como um código normal. Ou seja, basta criar um método genérico com o devidos parâmetros em uma classe auxiliar e chamá-lo onde for necessário. Não precisa nada de herança. Seria algo parecido com isto:

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");
        }
    }

Aí usa assim:

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

Possivelmente pode simplificar um pouco o código usando apenas duas condições no lugar de 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());
    }

Coloquei no GitHub para referência futura.

Desta forma usa-se a matemática para achar o caracteres a ser usado como argumento. 48 é o código ASCII de caractere "0". Então soma-se o deslocamento das opções obtidas (obtido pela diferença o código usado e o primeiro código, assim se for o primeiro, o deslocamento do caractere será 0, se for o segundo, o deslocamento será 1, e assim por diante).

1

Acredito que o ideal seria utilizar herança mesmo, mas se você não quer utilizar herança, então pode criar uma classe com um método estático, algo como:

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");
    }
}

E dentro de cada Form você apenas chama o método responsável.

public void Form1_KeyDown(object sender, KeyEventArgs e)
{
    ClasseRecemCriada.KeyPressed(sender, e);
}
4
  • O ideal é herança mesmo, mas como minha principal linguagem nao é C# entao nao tinha pensado em algo do tipo, só vou ver se consigo implementar isso aqui, mas acredito que seja isso mesmo
    – LocalHost
    Commented 16/07/2016 às 20:33
  • Por que o ideal seria usar herança?
    – Jéf Bueno
    Commented 16/07/2016 às 20:42
  • Me pareceu certo no caso de ser necessário realizar pequenas alterações para cada form em especial, mas agora parando para pensar seria indiferente implementar um override ou meramente adicionar o que precisasse antes de chamar o método. Commented 16/07/2016 às 20:50
  • Obrigado, fiz mais ou menos como você fez
    – LocalHost
    Commented 16/07/2016 às 20:51

Você deve fazer log-in para responder a esta pergunta.

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .