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
[54679] 상속받은 컴포넌트에 이벤트 띄우는 방법에대한 질문
부산촌님 [powere] 1681 읽음    2008-09-26 02:32
안녕하십니까?
프로그램을 하다보니 TClientSocket로부터 상속을 받아
이벤트를 하나 띄우고 싶은데
이벤트를 어찌띄우는지 도무지 알수가 없어서
이렇게 작업하던 소스를 올려 봅니다.

DWORD WINAPI TCSocket::ReceiveThread (void * pArg)
이 스레드 함수를 발생시켜 원하는 데이타가 들어오면
OnRecive 이벤트를 발생 시키고 싶은데 도무지 되질 않는군요..

컴화일 하고 패키지 인스톨해서 등록하고
새프로젝트 폼에서 등록시켜 돌려보면 우선 이놈이 Active = true로 줘도 Active =false가 되구요...

원하는 이벤트는 뜨지도 않는군요!!!

많은 고수님의 답변 기다릴께요....

--헤드화일
//---------------------------------------------------------------------------
#ifndef CSocketH
#define CSocketH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <ScktComp.hpp>

#define NMEAVDMVDOHEAD                '!'
#define NMEADEFAULTHEAD                '$'
#define NMEACR                    '\r'
#define NMEALF                    '\n'
#define AIS_DATARECEIVE                             WM_USER + 1

//---------------------------------------------------------------------------
class PACKAGE TCSocket : public TClientSocket
{
private:
    HANDLE hReceiveThread;
public:
    TNotifyEvent mOnReceive;
protected:
    void __fastcall OnReceive(TMessage& msg);
public:
    __fastcall TCSocket(TComponent* Owner);
    //virtual void __fastcall  Dispatch(void *Message);
    static DWORD WINAPI ReceiveThread(void * pArg);

    BEGIN_MESSAGE_MAP
        MESSAGE_HANDLER(AIS_DATARECEIVE, TMessage, OnReceive)
    END_MESSAGE_MAP(TClientSocket)
__published:
    __property TNotifyEvent OnRecv = {read = mOnReceive , write = mOnReceive };
};
//---------------------------------------------------------------------------
#endif

--CPP 화일
//---------------------------------------------------------------------------

#include <basepch.h>

#pragma hdrstop

#include "CSocket.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TCSocket *)
{
    new TCSocket(NULL);
}
//---------------------------------------------------------------------------
__fastcall TCSocket::TCSocket(TComponent* Owner)
    : TClientSocket(Owner)
{
    DWORD dwThreadID = 0;
    hReceiveThread = CreateThread(NULL, 0, ReceiveThread, this, CREATE_SUSPENDED, &dwThreadID);
    if(hReceiveThread != INVALID_HANDLE_VALUE)
        ResumeThread(hReceiveThread);
}
//---------------------------------------------------------------------------

void __fastcall TCSocket::OnReceive(TMessage &Msg)
{
     AnsiString strAISData;
     strAISData.sprintf("%s",(char *)Msg.WParam);
}

DWORD WINAPI TCSocket::ReceiveThread (void * pArg)
{
    TClientSocket *S = (TClientSocket *)pArg;
    char ch;
    AnsiString strAISData;
    AnsiString strSocketData;
    AnsiString strAISReceiveData;
    bool bAISDataEnable;
    while(TRUE)
    {
        if(S->Active){
            int nByte = S->Socket->ReceiveBuf((void * )&ch,1);
            if(nByte == 1){
                if(ch == NMEAVDMVDOHEAD){
                    strSocketData.sprintf("%c",ch);
                    bAISDataEnable = true;
                }
                else if(bAISDataEnable){
                    if(ch == NMEALF){
                        strSocketData += AnsiString(ch);
                        strAISReceiveData = strSocketData;
                        bAISDataEnable = false;
                        TMessage msg;
                        SendMessage(S->Socket->Handle,
                                    AIS_DATARECEIVE,
                                    (WPARAM)strAISReceiveData.c_str(),
                                    (LPARAM)S->Socket->Handle
                                    );
                    }
                }
            }
        }
    }
    return 1L;
}

namespace Csocket
{
    void __fastcall PACKAGE Register()
    {
         TComponentClass classes[1] = {__classid(TCSocket)};
         RegisterComponents("WoosSocket", classes, 0);
    }
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
54679 상속받은 컴포넌트에 이벤트 띄우는 방법에대한 질문 부산촌님 1681 2008/09/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.