|
최은철 님이 쓰신 글 :
: 안녕하세요..
: 이곳에서 많은 도움을 받고있는 사람입니다.
: 몇가지 질문이 있습니다.
: 제 개인적으로 C++Builder의 인터넷 컴포넌트를 아주 싫어하는 사람중 한 사람입니다.
: 하지만, Winshoes나 기타 성능이 좋은 컴포넌트는 컴포넌트에 대한 도움말이나 함수 설명이
: 매우 미약합니다. 그래서, 사용하기가 여간 힘들지 않습니다.
:
: -_-; 질문1: 혹시 WinShoes에 대한 통쾌한 설명글이 없을까요?
:
: C++Builder에서 기본 제공하는 TClientSocket이라는 컴포넌트가 있는데..
: 이 컴포넌트를 폼위에 생성해놓으면 TClientSocket의 OnRead 이벤트를 받을 수 있습니다.
: 하지만, 제가 할려는건 TClientSocket를 동적으로 생성하려고 합니다.
: 그래서.. 아래와 같은 소스를 만들었습니다. 맞는지 모르겠지만..
: 보시면 알겠지만.. 함수의 시작부분에서 TClientSocket을 생성후 함수의 후반에서
: TClientSocket을 삭제합니다.
: 그러면..
:
: -_-; 질문2: 아래의 소스에서 TClientSocket의 OnRead 이벤트를 받으려면 어떻하면 되는지..
: 제가 동적으로 생성했기 때문에 OnRead이벤트를 어떻게 생성하는지 모르겠습니다.
:
: 그냥 아래와 같이 ClientSocket1Read 함수를 만들면 되는건가요 ?
: 만들면 에러가 나는데..?
: void __fastcall TMainForm::ClientSocket1Read(TObject *Sender,
: TCustomWinSocket *Socket)
: {
:
: }
:
:
: 설명을 잘했는지 모르겠군요.
: 답변 주시면 정말 감사하겠습니다.
: ---------------------------------------------------------------------
: bool 시작부분() {
: TClientSocket* pOkMailServerClientSocket;
:
: pOkMailServerClientSocket = new TClientSocket(Application);
:
: try {
: pOkMailServerClientSocket->Address = "90.0.0.1";
: pOkMailServerClientSocket->Port = 1700;
: pOkMailServerClientSocket->ClientType = ctBlocking;
: pOkMailServerClientSocket->Open();
: }
:
: catch(...) {
: delete pOkMailServerClientSocket;
: return false;
: }
:
: try {
:
: while( pOkMailServerClientSocket->Socket->Connected ) {
: .
: .
: .
: .
: .
: }
:
: }
:
: catch(...) {
: pOkMailServerClientSocket->Close();
: delete pOkMailServerClientSocket;
: return false;
: }
:
: pOkMailServerClientSocket->Close();
:
: delete pOkMailServerClientSocket;
: return true;
: }
: --------------------------------------------------------------------
임펠리테리입니다.
WinShoes는 정말 잘 만든 컴퍼넌트 라이브러리죠. 하지만 제가 보기엔, 적어도 소켓만으로는 볼랜드의 VCL에 내장된 소켓들이 더 뛰어나다고 생각합니다. WinShoes가 높이 평가받는 이유는 빌더나 델파이에 포함된 소켓 외의 인터넷 컴퍼넌트들인 넷마스터 컴퍼넌트들 때문입니다. 그 조잡성이나 부족한 도큐먼트를 보면 저절로 짜증이 나죠. 물론 WinShoes가 정말 잘만들어진 패키지라는 데 대하서는 전혀 이견이 없습니다.
그래도, 어쩔 수없이 WinShoes는 서드파티인데다 공짜로 배포하는 컴퍼넌트인 탓에 아무래도 볼랜드에서 직접 만든 컴퍼넌트만큼 도큐먼트가 잘 되어있을 수는 없습니다. 만약 정말 막혀서 어찌해볼 수가 없는 지경이라면, 볼랜드의 뉴스그룹을 뒤져보시길 바랍니다. WinShoes의 제작팀들이 직접 친절히 답변을 해주고 있으니까요. 물론 어느정도의 영어는 읽으실 수 있어야겠구요.
그리고, 두번째 질문.
동적으로 생성한 컴퍼넌트에 이벤트핸들러를 달아주기 위해서는 그냥 일반 프로퍼티를 세팅하는 것과 같은 방법을 쓰면 됩니다.
컴퍼넌트이름->이벤트이름 = 이벤트핸들러이름;
예를 들어, 위에서 질문하신 것과 같이 동적으로 생성한 클라이언트 소켓 컴퍼넌트의 OnRead 이벤트에 ClientSocket1Read 핸들러를 달아주려면,
...
pOkMailServerClientSocket->Address = "90.0.0.1";
pOkMailServerClientSocket->Port = 1700;
pOkMailServerClientSocket->ClientType = ctBlocking;
pOkMailServerClientSocket->OnRead = ClientSocket1Read; // 새로 추가할 라인
pOkMailServerClientSocket->Open();
...
이렇게 해주면 됩니다. 물론 이 핸들러 ClientSocket1Read는 미리 선언해두어야겠죠?
한가지 보너스 충고입니다.
동적으로 컴퍼넌트를 생성할 때, 만약 생성자의 인자인 Owner로서 NULL 아닌 값(위에서는 Application)을 넘겨줬다면 절대로 이 컴퍼넌트를 delete 하지 마세요. 위에서는 그렇게 하셨네요.
동적으로 컴퍼넌트를 생성하는 데 관련된 이전의 답변들에서도 수없이 강조했습니다만, Owner로 NULL이 아닌 값을 넘겨줬다면, 그 Owner 컴퍼넌트가 파괴될 때 스스로 동적생성된 컴퍼넌트를 함께 죽이려고 합니다. (동반자살을 시도한다는 말이죠.)
그런데 만약 delete로 동적생성한 컴퍼넌트를 죽이는 코드가 함께 있다면, 결과적으로 그 컴퍼넌트는 두번 죽게되는(잔인하죠?) 결과가 되므로 두번째로 암살을 기도할때는, 무시무시한 억세스 바이얼레이션 에러가 뜹니다.
그렇다고, 동적으로 생성한 컴퍼넌트가 더이상 필요가 없는데 Owner가 파괴해줄 때까지 계속 기다리는 것은 바보짓이기도하구요. 그래서 최선의 방법은 동적으로 생성하는 컴퍼넌트의 Owner로는 NULL을 넘겨주는 것입니다. 그리고 나중에 필요없어질때 delete 하구요.
그럼 참고하시길...
|