Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Murilo Neto

Eventos em C#

Recommended Posts

Olá a todos do Fórum iMasters. Sou novo neste fórum, e espero poder contribuir bastante e ser ajudado também.

 

Eis a dúvida:

 

Sou iniciante em C#. Estou utilizando um manual em espanhol (excelente por sinal, com mais de 300 páginas, que pode ser baixado pela URL: http://www.josanguapo.com), através do qual adiquiri uma grande familiaridade com a linguagem C#. Mas travei na parte dos eventos. Não há exemplos nessa parte. Fui dar uma olhada no SDK, mas não saiu muita coisa... estou trabalhando esclusivamente em modo console, para dominar bem a linguagem e só assim começar a estudar os Windows Forms. Será que alguém não teria um exemplo sobre eventos, e em modo console (eu sei que é pedir demais, mas...).

 

Agradeço antecipadamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Geralmente você vai utilizar eventos com Windows Forms. Eventos são disparados na maior parte das vezes por ações do usuário, e você pode definir ações correspondentes a eles. Por exemplo, o evento Click de um botão é executado quando um usuário pressiona (clica) o respectivo botão. A este evento é associada uma rotina e esta rotina é executada quando o evento é disparado.

Como você disse que está utilizando apenas o console, resolvi fazer um exemplo com um Timer, um objeto que serve para executar uma determinada ação em um intervalo de tempo definido. Se você definir que o intervalo do timer é de 1000 milissegundos, a cada 1 segundo passado o Timer ativará o seu evento Elapsed. O exemplo abaixo associa uma rotina chamada tempo_Elapsed ao evento Elapsed do objeto tempo (que é um Timer). Esta associação é realizada através da sobrecarga do operador +=.

 

namespace CSTesteTimer{	class Program	{		static System.Timers.Timer tempo = new System.Timers.Timer();		static void Main(string[] args)		{			tempo.Elapsed += new System.Timers.ElapsedEventHandler(tempo_Elapsed);			tempo.Interval = 1000.0;			tempo.Start();			Console.ReadKey();		}		static void tempo_Elapsed(object sender, System.Timers.ElapsedEventArgs e)		{			Console.WriteLine("passou 1 segundo!");		}	}}

Certo? ;)

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado, Graymalkin.

 

Vou testar seu exemplo. Mas vai mais uma dúvida: você utilizou um evento do objeto Timer do Microsoft .Net Framework. É possível criarmos os nossos próprios eventos? (não sei se faz muito sentido esta pergunta).

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Também dei uma olhada no seu site. O XScript pode ser usado com o VS Express? No caso eu uso o Visual C# Express.

 

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou testar seu exemplo. Mas vai mais uma dúvida: você utilizou um evento do objeto Timer do Microsoft .Net Framework. É possível criarmos os nossos próprios eventos? (não sei se faz muito sentido esta pergunta).

Sim, claro. A palavra-chave event serve justamente para isso.

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Também dei uma olhada no seu site. O XScript pode ser usado com o VS Express? No caso eu uso o Visual C# Express.

O XScript foi criado no VB6, portanto você precisar ter este para poder compilá-lo.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pesquisei bastante, e finalmente descobri qual era a minha dúvida: quando eu perguntei se poderiamos criar nossos próprios eventos, na verdade o que eu queria era criar uma CLASSE QUE RESPONDA A EVENTOS. Por exemplo, implementar em C# uma aplicação console que mude sua execução quando o usuário pressionasse a qualquer momento a tecla M... Acho que isso é bem mais difíssil de fazer.

 

Eu achei um exemplo em http://www.willydev.net, mas não deu para entender muito. O autor utiliza API do Windows, e tudo que ele faz é mudar a funcionalidade de Ctrl + C para a tecla E. Abaixo vai o exemplo:

 

using System;

using System.Threading;

using System.Runtime.InteropServices;

 

namespace EricUtility

{

/// <summary>

/// Class que atrapa eventos de consola (ie CTRL-C) in C#.

/// Llama SetConsoleCtrlHandler() in Win32 API

/// </summary>

public class ConsoleCtrl: IDisposable

{

/// <summary>

/// Se ejecuta el evento

/// </summary>

public enum ConsoleEvent

{

CTRL_C = 0, // Esto es de wincom.h

CTRL_BREAK = 1,

CTRL_CLOSE = 2,

CTRL_LOGOFF = 5,

CTRL_SHUTDOWN = 6

}

 

/// <summary>

///llama la cuestion cunao el evento se ocurra

/// </summary>

public delegate void ControlEventHandler(ConsoleEvent consoleEvent);

 

/// <summary>

///Se dispara el evento

/// </summary>

public event ControlEventHandler ControlEvent;

 

ControlEventHandler eventHandler;

 

/// <summary>

///Nueva instancia

/// </summary>

public ConsoleCtrl()

{

// Coloca esto como private varsino el GC no lo atrapat...

eventHandler = new ControlEventHandler(Handler);

SetConsoleCtrlHandler(eventHandler, true);

}

 

~ConsoleCtrl()

{

Dispose(false);

}

 

public void Dispose()

{

Dispose(true);

}

 

void Dispose(bool disposing)

{

if (disposing)

{

GC.SuppressFinalize(this);

}

if (eventHandler != null)

{

SetConsoleCtrlHandler(eventHandler, false);

eventHandler = null;

}

}

 

private void Handler(ConsoleEvent consoleEvent)

{

if (ControlEvent != null)

ControlEvent(consoleEvent);

}

 

[DllImport("kernel32.dll")]

static extern bool SetConsoleCtrlHandler(ControlEventHandler e, bool add);

}

 

//Encaixei essa parte aqui para testar. Estava fora do namespace EricUtility.

class Test

{

public static void MyHandler(ConsoleCtrl.ConsoleEvent consoleEvent)

{

Console.WriteLine("Event: {0}", consoleEvent);

}

 

public static void Main()

{

ConsoleCtrl cc = new ConsoleCtrl();

cc.ControlEvent += new ConsoleCtrl.ControlEventHandler(MyHandler);

 

Console.WriteLine("Enter 'E' to exit");

 

while (true)

{

string s = Console.ReadLine();

if (s == "E")

break;

}

}

}

}

 

Só usando C#, podemos nós mesmos criarmos Objetos que respondam a eventos? Por exemplo, um método que mude o estado de uma objeto quando a tecla "tal" for pressionada?

 

Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para isso você não precisa "criar um evento"; você só precisa utilizar um que *já existe*, no caso o evento KeyPress, KeyDown ou KeyUp, que são ativados quando uma tecla é pressionada.

Todavia, estes eventos só estão disponíveis para Windows Forms. Para o caso do console, talvez fosse possível fazer isso criando um thread e fazendo com que esse thread fique verificando o tempo todo as teclas pressionadas e, quando for o caso do M, fazer uma coisa qualquer. Isso porque o console só tem um único evento (que é CancelKeyPress, e é acionado quando o usuário pressiona CTRL+C), e não tem um evento para detectar o pressionamento de teclas.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.