|
향기 님이 쓰신 글 :
: 답변주셔서 감사 합니다. 아래와 같이 해도 에러가 나네요..제가 알아봐야 할것이 무엇이 있을까요?
: 가능하기는 할까요? 그럼..
: 즐프하세요...
:
:
: : 임펠리테리입니다.
: :
: : 도스에서 VCL을 써본 적은 없습니다만.. 일단, 콘솔 어플리케이션에는 Application 객체가 없으므로 Owner 인자로 넘길수도 없겠지요? 그냥 NULL을 넘기시면 되겠네요.
: :
: : 그럼 참고하시길...
:
: void __fastcall Timer1Timer(TObject *Sender)
: {
: cout << "inside Timer";
: }
:
: int main(int argc, char* argv[])
: {
: cout << "hello, World";
: getch();
:
: AnsiString astTemp;
: astTemp = "AnsiString";
: cout << astTemp.c_str();
: getch();
:
:
: TTimer *Timer1;
: Timer1 = new TTimer(NULL); -> 이렇게 하시란 말씀인가요?
:
: Timer1->Interval = 100;
: Timer1->OnTimer = Timer1Timer; -> 위와 같이 해도 아래와 같은 에러가 나요...
: [C++ Error] unit_Vcl.cpp(33): E2034 Cannot convert 'void (_fastcall *)(TObject *)' to 'void (_fastcall * (_closure )(TObject *))(TObject *)'
:
: delete Timer1;
: return 0;
:
임펠리테리입니다.
저번에 질문하실때 소스를 자세히 안봤었는데... (죄송) 지금 다시 보니.. ^^
먼저, 에러가 나는 이유에 대해 알려드리죠. VCL에서 쓰는 이벤트는 에러메시지대로 void (_fastcall * (_closure )(TObject *))(TObject *) 타입입니다. 이 타입이 의미하는 것은, 이벤트 핸들러가 TObject를 상속받은 클래스의 멤버여야 한다는 것입니다. (보통은 폼 클래스의 멤버가 되죠?) 그러므로 에러메시지가 나오지 않게 하려면 Timer1Timer() 함수를 선언할 때 어떤 것이든 TObject를 상속받는 클래스의 멤버로 만들어야 합니다.
더 중요한, 제가 저번에 깜빡하고 그냥 넘어간 것.
콘솔 어플리케이션은 메시지를 받지 않으므로 타이머를 생성하고 OnTime 이벤트에 핸들러를 붙여주시더라도 이벤트가 발생하지 않습니다. 타이머의 이벤트라는 것이 타이머 메시지에 의해 발생하는 것이니까요. 다른 모든 메시지나 이벤트에 대해서도 마찬가지입니다.
그럼 참고하시길...
|