이벤트 생성 3번째 입니다. 이번 예제는 이벤트 함수의 파라메타로 이벤트 발생시 데이타 정보를 전달하는 방법에 대해 설명을 합니다. 예제는 part-1 에서 사용했던 MyText 클래스를 변형하여 사용하였습니다.
우선 아래와 같이 이벤트 발생시 데이타를 추가하여 파라메터로 넘겨줄 클래스를 하나 생성 합니다. 기본 클래스인 EventArgs를 상속 받아서 만드는데 EventArgs는 아무것도 넘겨줄게 없을때 사용하는 클래스 입니다.
public class MyTextEventArgs : EventArgs
{
public string Text { get; } // 파라메터로 넘겨 줄 데이타
public MyTextEventArgs(string text) // 생성자에서 변경된 Text 정보를 넘겨받는다.
{
this.Text = text;
}
}
델리케이트 선언에서 함수 파라메터로 위에서 만든 클래스를 사용합니다. 그리고 이벤트 함수 실행부분에서 변경된 Text 정보를 생성자의 파라메터로 넘겨 줍니다.
public class MyText
{
public delegate void EventHandler(object sender, MyTextEventArgs e); // 이벤트 핸들러의 형식을 delegate로 등록한다.
private string text = "";
public string Text
{
set
{
text = value;
if(OnTextChangedHandler != null)
{
OnTextChangedHandler(this, new MyTextEventArgs(text)); // 이벤트 함수 실행시 변경된 Text 정보를 전달합니다.
}
}
}
public event EventHandler? OnTextChangedHandler = null ;
}
사용방법은 아래와 같습니다.
public partial class Form1 : Form
{
MyText myText = new MyText();
public Form1()
{
InitializeComponent();
myText.OnTextChangedHandler += text_Changed;
}
private void text_Changed(object sender, MyTextEventArgs e)
{
textBox1.Text = e.Text; // 파라메터를 통해 넘어온 변경 데이타를 이용합니다.
}
private void button1_Click(object sender, EventArgs e)
{
myText.Text = "Hello World.";
}
}
아두이노 MPU에 내장되어 있는 EEP Rom 메모리에 데이타를 읽고 쓸수 있는 함수입니다.
정수형 데이타를 저장하거나 읽을 수 있도록 만들었습니다.
하드웨어의 간단한 파라메터 값이나 보드의 어드레스 정보등을 저장하는 용도로 사용할 수 있습니다.
#include <EEPROM.h>
#define FIRST_ADDRESS 0
#define SECOND_ADDRESS 2
int EEPROM_Read(int Address)
{
int result = 0 ;
int temp ;
result = EEPROM.read(Address+1) ;
result <<= 8 ;
temp = EEPROM.read(Address) ;
result = result | temp ;
return result ;
}
void EEPROM_Write(int Address, int Value)
{
char temp ;
temp = 0x00ff & Value ;
EEPROM.update(Address, temp) ;
Value >>= 8 ;
temp = 0x00ff & Value ;
EEPROM.update(Address+1, temp) ;
}
위의 함수들은 정수형 데이타를 저장하거나 읽어내는 용도이기 때문에 어드레스 설정을 할 경우 주의가 필요합니다.
EEPROM의 번지는 바이트 단위이기 때문에 정수형 데이타는 2개의 번지를 점유하게 됨으로 그레 맞추어 번지를 설정 하여야 합니다.
타이머에 시간(초단위)을 설정하고 시작을 누르면 해당시간이 지나면 이벤트를 발생시키는 예제 입니다. 타이머 클래스 내부에 Thread 를 이용하여 시간의 흐름을 감지하도록 코딩되어 있습니다.
public class MyTimer
{
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler? OnTimeoutHandler = null;
public int time {set; get;} // Unit is sec
public MyTimer(int time)
{
this.time = time;
}
public void start()
{
Thread myThread = new Thread(run);
myThread.Start(); // Thread 동작
}
private void run() // 타이머 동작 함수
{
var timeout = time;
while(true)
{
Thread.Sleep(1000);
if (--timeout <= 0) break;
}
if(OnTimeoutHandler is not null) OnTimeoutHandler(this, new EventArgs());
// 타이머 동작 완료가 되면 이벤트 함수를 호출합니다.
}
}
사용방법은 아래와 같습니다.
public partial class Form1 : Form
{
MyTimer myTimer = new MyTimer(10); // 10초 타이머 객체 생성
public Form1()
{
InitializeComponent();
myTimer.OnTimeoutHandler += timeout_event; // 이벤트 실행 함수 등록
}
private void timeout_event(object sender, EventArgs e)
{
MessageBox.Show("Timeout Message.."); // 타이머 종료시 메시지 출력
}
private void button1_Click(object sender, EventArgs e)
{
myTimer.start(); // 타이머 시작
}
}
객체 내에서 발생하는 어떤 사건에 대해 이벤트를 발생시키는 코드를 만들기 위해 인터넷을 검색해 봤는데 하나같이 뭔가 2% 부족한 부분이 있는것 같아서 이참에 간단한 예제를 하나 만들어 보았습니다.
part-1에서는 MyText 라는 객체를 생성하고 객체의 Text 가 변경되면 이벤트가 발생하는 형식으로 예제를 구성했습니다.
아래는 MyText 라는 클래스입니다.
public class MyText
{
public delegate void EventHandler(object sender, EventArgs e); // 이벤트 발생을 위한 함수 형식의 델리게이트 선언
private string text = "";
public string Text
{
get { return text; }
set
{
text = value;
if(OnTextChangedHandler != null)
{
OnTextChangedHandler(this, new EventArgs()); // Text 가 변경될 경우 이벤트 함수 실행
}
}
}
public event EventHandler? OnTextChangedHandler = null; // 이벤트 함수 핸들러 선언
}
이제 위의 클래스를 이용해서 실제 이벤트를 발생시키는 코드를 만들어 봅니다.
폼에 버튼 하나와 TextBox 하나를 올려 놓고 테스트를 해 보았습니다.
public partial class Form1 : Form
{
MyText myText = new MyText(); // MyText 의 객체를 생성한다.
public Form1()
{
InitializeComponent();
myText.OnTextChangedHandler += text_Changed; // 객체내의 Text가 변경되었을 때 수행할 이벤트 함수를 등록한다.
}
private void text_Changed(object sender, EventArgs e) // 이벤트 함수 구현 부분
{
textBox1.Text = myText.Text; // MyText 객체의 Text를 TextBox 에 쓴다.
}
private void button1_Click(object sender, EventArgs e)
{
myText.Text = "test"; // 버튼을 클릭하면 MyText 객체의 Text를 변경한다.
}
}
일본 Contec 사의 GPIB 통신 카드인 GP-IB(PCI)F 를 사용하기 위한 Class 입니다. C++ 로 제작되어서 제공되는 DLL 라이브러리를 사용합니다. Contec 사에서는 C#을 위한 별도의 라이브러리는 제공을 안하고 DLL을 사용한 예제 코드만 제공합니다.