C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76486] 윈도우 핸들을 가지는 클래스 제작?
수달 [heaven2] 676 읽음    2023-10-27 09:18
개발 환경 : C++ Builder 10.3(Rio)

MainForm에서 특정 장비을 처리하는 클래스(THydro)를 만들고,
해당 장비 클래스에서 Timer와 자체 Event를 가지려고 합니다.

제작하는 class(THydro)에서 윈도우 핸들을 가지려면, 
VCL의 상속 구조 상 TWinControl부터 Handle이 있길래,
이놈에서 상속을 받아서 class를 제작했는데.. -.-;;
원래 이런 초식이 아닌 모양입니다.

코드로는 대략 아래와 같은데.. 당근 에러 입니다.
에러 메세지는 Parent window가 없다는 것이고.. THydro has no parent window..

THydro Class를 만들고, 자체 Timer에서 THydro 클래스 자체의 핸들에
PostMessage()로 윈도우 메세지를 보내려고 합니다.
SendMessage()로 보내지 않은 것은, 이벤트를 처리하는 시간이 길어질 수 있어서 이렇게 처리합니다.
대략 코드는 아래와 같이 구성했는데..

어떻게 해야하는 지 고수님들의 지도 편달 바랍니다.


enum EN_LOGGER_STEP { enIdle = 0x00,
					  enStart,
					  enFinish };
// --------------------------------------------------
// MainForm Class 
// --------------------------------------------------
class TForm1 : public TForm    // MainForm Class 
{
__published:	// IDE-managed Components
private:	// User declarations
	//... attribute.. 
public:
	THydro *Hydro;	// 장비 Class 생성 
	//...
public:		// User declarations
	__fastcall TForm1(TComponent* Owner);
};

// --------------------------------------------------
// THydro Class 
// --------------------------------------------------
class THydro  : public TWinControl    // 장비 담당 전용 클래스
{
private :
	TTimer *Timer;       // 자체 타이머
public:
	__fastcall THydro(TComponent* Owner);

	void OnMessage(TMessage &Message); // 이벤트 처리 Method.. 
	void TimerEnable();
	void TimerDisable();
	void __fastcall OnTimer(TObject *Sender);	// Timer Event 처리

	BEGIN_MESSAGE_MAP
		MESSAGE_HANDLER(UM_MESSAGE, TMessage, OnMessage)
	END_MESSAGE_MAP(TWinControl)
};

// ... 

// --------------------------------------------------
// THydro 의 Method
// --------------------------------------------------

__fastcall THydro::THydro(TComponent* Owner) // 생성자
	:TWinControl(Owner)
{
	Timer = new TTimer(NULL);
	Timer->OnTimer = OnTimer;
	Timer->Enabled = false;
}

void THydro::OnMessage(TMessage &Message) // 이벤트 처리 Method
{
	bool bResult = false;

	EN_LOGGER_STEP enStep = (EN_LOGGER_STEP)Message.WParam;

	UnicodeString MeasureDate, MeasureTime;

	switch ( enStep ) {
		case enIdle :
			{
                           // do sometihing.. 
			}
			break;
		case enStart :
		case enFinish :
			break;
	}
}

// ------------------------------------------------------------
void THydro::TimerEnable()
{
	Timer->Interval = 1 * 1000; // every 2 second
	Timer->Enabled = true;
}

// ------------------------------------------------------------
void THydro::TimerDisable()
{
	Timer->Enabled = false;
}

// ------------------------------------------------------------
// Timer Event => Timer Event에서 자신의 핸들에 이벤트를 보낸다. 
void __fastcall THydro::OnTimer(TObject *Sender)
{
	static int i = 0;
	::PostMessage(this->Handle, UM_MESSAGE, EN_LOGGER_STEP::enIdle, 0); // 자기자신에게 이벤트를 보낸다. 
}



+ -

관련 글 리스트
76486 윈도우 핸들을 가지는 클래스 제작? 수달 676 2023/10/27
76490     Re:윈도우 핸들을 가지는 클래스 제작? 495 2023/12/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.