Programming - cpueblo.com

[강좌] 볼랜드 C++빌더 프로그래밍


글쓴이 : 유광희 날짜 : 2002-05-13 (월) 21:23 조회 : 16730
퍼온 글입니다. #2683 최상남 (kangnung) [강좌] 볼랜드 C++빌더 프로그래밍 #1 1998-07-15 19:26 45 line 안녕하세요. 소프트동에 가입한지는 오래 되었지만 다른분들이 만들어 놓은 강좌만 받아 보다가 제가 직접 강좌를 한다는 것이 조금.....그렇네요. 강좌의 특징들 중에 M$ Visual C++강좌는 많더군요. 그런데 볼랜드강좌는 거의 없어요. Builder를 말하는 것입니다. 그래서 제가 빌더 강좌를 해 볼까 합니다. 맨날 도스용 프로그램만 하다가 윈도우 프로그램을 하니까 많은 어려움을 가지게 되었습니다. 저도 처음 접한것이 M$의 Visual C++이었는데.... 정말 어렵더군요. 개발 환경은 많이 발전하고 프로그램하기는 쉬워 졌지만 그 프로그래밍 툴을 배우는데 많은 시간이 들고 개념 익히는데도 많은 시간이 들더군요. Visual C++를 배울때 무척 고생했습니다. 여러가지 툴을 접해 보다가 그래도 자료가 많은 Visual C++를 택했는데 여간 복잡한게 아니어서.... 그래서 이것저것 기웃거려 보다가 볼랜드 빌더를 접했는데...... 우와... 무지 쉽더군요. 근데요.. 초보자는 객체지향이라는 개념 없이는 어려울 겁니다. C++툴을 사용할려면 상속, 추상, 오버로딩, 오버라이딩, 객체, 클래스.... 이러한 것들에 대한 개념이 확실히 잡혀 있어야 합니다. 실제로 비주얼툴이 확실히 편하고 에러도 적고 하옇튼 좋은것은 사실이지만 위의 개념이들이 없으면 너무 어렵습니다. 초보자들이 접근하기 어려워 하는 부분도 이러한 부분들 때문입니다. 이글 보시는 분들 중에도 위의 개념들이 없다고 생각되는 분들은 우선 아래 강좌들에 있는 객체지향 개념에 대해서 먼저 터득을 하신후 저의 강좌를 보시는 것이 나을겁니 다. C++에 대한 개념을 공부하신후에 도스용 툴을 가지고 직접 배운것을 연습에 보세요. 꼭 필요한 겁니다. 그냥 책만 보고 하는것은 전혀 실력이 늘지 않습니다. 직접 배운것을 키보드로 두들겨 보시라는 겁니다. 이러한 개념들이 습득이 되면 나중에 비주얼 씨++를 접했을때 이게 이런거구나...하 는것이 머리에 팍팍들어올 겁니다. 서론은 여기에서 마치구요. 제가 강좌를 할 자료를 자료실에 올려 놓겠습니다. 직접 제가 만든 조그마한 자료들을 가지고 거기에 맞게 강좌를 하겠습니다. 다음 부터 1회 강좌가 시작 됩니다. 많이 기대 하셔도....^^;; 그럼 White. #2684 최상남 (kangnung) [강좌] 볼랜드 C++빌더 프로그래밍 #2 1998-07-16 18:05 59 line White 최상천입니다. 아이디는 동생소유구요. 오늘 첫번째 강좌군요. 강좌의 요지는 LAN으로 연결된 2개의 컴퓨터에서 프로그램을 띄워서 서로 채팅을 할수 있게 하는 겁니다. 여기서 조금만 응용하시면 서버만들어 놓고 클라이언트로 접속을 해서 많은 사람들과 채팅도 할 수 있을 겁니다. 그게 더 쉬울지도 모르겠네요. 우선 빌더를 실행시키세요. 당연한 말이지만.... 그럼 기본적인 폼이 하나 생성될겁니다. 그럼 우선 기본적인 형태를 갖추어야 겠지요? 에디트 박스 3개 버튼 3개 Client Socket 1개 Server Socket 1개 메모장 1개 Label 3개가 필요합니다. 제가 자료실에 올려놓은 소스가 있거든요 그거 보시고 그대로 위치시키 세요. 참 타이머는 그냥 한번 올려놓은거니까 없어도 됩니다. 참 Status Bar도 한개 위치시키시구요. Label이름을 바꾸실려거든 프로퍼티중에 Caption을 바꾸시면 됩니다. 라벨 Caption을 HOST, NICK NAME, Message로 바꾸시구요. 버튼이름도 바꾸세요. 버튼도 Caption으로 바꾸시면 됩니다. 참고로 M$ Visual C++에서는 Form View로 하시고 그 위에다가 뭐 이것 저것들을 위치시키고 해야 하거든요. 그거에 비해 빌더는 편해도 한참 편한 겁니다. 프로그램을 실행 시키시면 처음에 태스크 바에 들어가거 든요. 화면에 뜨지 않고 태스크바에 있다가 다른 사람이 자기 컴에 접 속을 하게 되면 자동적으로 뿅하고 화면에 나타납니다. 아니면 자기가 직접 다른 컴에 접속을 해도 좋구요. 제가 아직 NICK NAME의 사용은 만들어 놓지 않았거든요. 귀찮아서..^^;; 발전시켜 보고 싶으신 분들은 닉네임이 나타나게 프로그램 해 보세요. 자 우선 프로그램이 실행이 되면 태스크 바에 들어가야 되잖아요. HOW TO...어케 할까.... Form1의 프로퍼티에서 WindowState를 wsMinimized 해 놓으면 됩니다. 허허허허.... 너무 쉬웠나? 그리고 폼은 크기 조절을 할수 없게 만들어 놓았습니다. 이건 어케하냐?..... 프로퍼티에서 BorderStyle을 bsSingle로 해 놓으시면 됩니다. 그리고 우측 위에보면 _, X, ㅁ 세가지 조그마한 버튼이 있는데 이것중에 ㅁ버튼은 없애야 겠지요? 크기 조절을 못하니까.... 프로퍼티에서 BorderIcons에서 biMaximize를 false로 해 놓으시면 됩니다. 그리고 메세지가 오면 모든 프로그램 위에 위치 해야 되니까.... 프로퍼티 중에 FormStyle을 fsStayOnTop으로 바꾸시면 됩니다. 이제 폼에 대한 것을 다 됐구요. 이상태로도 F9를 눌러서 실해을 해보면.. 에러없이 잘 실행이 됩니다. 제일 중요한건 소켓이구요. 나머지도 조금만 손보면 됩니다. 폼이 어느정도 완성이 됐구요. 이제 이벤트 핸들러만 만들어 주시면 우리의 프로그램은 아주 잘 돌아갈 겁니다. 이번 강좌는 여기서 마치구요. 알맹이가 빠졌군요. 처음 하는거라서.... 다음 강좌는 알맹이를 중점적으로 하겠습니다. 소스는 자료실에서 받아가세요. 다음강좌에서 뵙겠습니다. White 최상천.... #2686 최상남 (kangnung) [강좌] 볼랜드 C++빌더 프로그래밍 #3 1998-07-19 16:50 138 line 안녕하세요. White 최상천입니다. 으음...조용성님 감사 하구요. 주말을 통해서 집에 갔다가 오느라구...강좌를 못했군요. 죄송하구요. 참 자료는 여기 소프트동 자료실에 등록한지가 3일이 넘었는데 관리하시는 분이...^^;; 빨리 올려 주셨으면 하네요. 3번째 강좌 시작하죠. 음..프로그램동작을 잠깐 살펴볼까 합니다. A컴퓨터와 B컴퓨터에 제 프로그램을 띄워 놓으신 후에 HOST라고 쓰인곳에 A컴퓨터에서는 B컴퓨터의 IP번호를 입력하고 Connect버튼을 누르면 두대의 컴에서 2명의 사용자와 서로 얘기 할 수 있습니다. 그럼 일반적으로 클라이 언트와 서버의 개념이 들어가게 되는데 여기서는 어느것이 클라이 언트고 어느것이 서버가 될까요? A,B둘다 클라이 언트와 서버가 될수 있습니다. 즉 프로그램에 2개의 기능이 들어가야 한다는 말이 되지요? A에서 접속할 수도 있고 B에서 접속 할 수도 있어야 한다는 말입 니다. 그래서 저번회에 말씀드렸듯이 Client Socket과 Server Socket을 함께 위치시키셔야 합니다. 본격적인 이벤트 핸들러를 작성해 봅시다. 우선 클라이 언트 기능부터 시작해 볼까요? 아참.. 메모장과 에디트 박스는 다 공백으로 만들어 놓으세요. 메모장은 프로퍼티 탭에서 Lines메뉴에서 지우면 되구요. 에디트는 Text항목을 지우면 글자가 없어 집니다. 깨끗하게 정리가 되었지요? 그럼 Connect라는 버튼을 누르면 HOST란에 적힌 IP주소로 접속을 시도해야 합니다. Connect버튼을 누르고 옆에 Event탭을 누르시면 OnClick이라는 항 목이 있을 겁니다. 그 항목을 더블클릭하시면 소스에디터에서 void __fastcall TForm1::ConnectButtonClick(TObject *Sender) { ...커서가 여기에서 깜박깜박 } 위와 같은 상황이 될겁니다. 전 버튼 이름을 ConnectButton이라고 했습니다. 만약 버튼 이름을 Btn이라고 했으면 함수 이름이 BtnClick이 되겠지요? 아래에 수행해야 할 코드를 적어 놓았습니다. 한 라인씩 설명을 드리죠. if((HostName->Text=="")) // IP를 적는 HostName에 Text항목이 아무것도 적혀있지 않으면 // if문 안에 있는 메세지를 보여주고 리턴합니다. // HostName이라고 저는 에디트 박스에 이름을 붙였습니다. // 다르게 하고 싶으시면 맘대로 하셔도 됩니다. // 아무것도 적혀있지 않은데 접속을 시도 할수 없잖아요? // 따라서 간단한 구문이지만 에러처리를 해 주어야 합니다. // 실제로 상업용 프로그램을 만들때에는 가장 신경 써 주어야 하 // 는 부분이 바로 이 에러 처리 부분입니다. 버그 없는 프로그램 // 을 만들려면 에러처리를 잘 해주어야 합니다. // 전 간단하게 만들어 주었습니다. 다른분들은 좀더 덧붙여도 좋 // 구요. { ShowMessage("You must indicate hostnaem OR nickname"); return; } StatusBar1->SimpleText="Attempting to connect to host..."; // 넷스케이프 웹브라우저를 보면 접속을 시도 할때 맨아래 옆으로 // 길쭉한 바에 Connecting Host....이라고 나오죠? 그 기능을 하는 // 겁니다. SimpleText는 프로퍼티 탭에 보면 있습니다. // 혹시 찾거나 하는 기능들이 있으면 가차없이 F1을 눌러 보세요. // 자세한 설명과 샘플코드가 나옵니다. // 실제로 간단한 프로그램의 경우 도움말 만으로도 만들수 있습니다. ConnectButton->Enabled=false; // 지금 접속하고 있는 중이니까 또다시 Connect버튼을 누르면 안되겠 // 지요? 그래서 버튼을 누를수 없게 만들어 주는 겁니다. // Enabled도 프로퍼티 탭에 보면 있습니다. CloseButton->Enabled=false; // CloseButton도 아직 접속된것은 아니니까 누를수 없게 만들어 주고요. ClientSocket1->Address=HostName->Text; // 클라이언트 소켓에 주소를 집어넣어 주는 부분입니다. 주소없이 연결 // 할 수는 없으니까요. Address항목도 프로퍼티에 있구요. HostName이라는 // 에디트 박스에 Text 즉 IP주소를 소켓의 주소에 집어 넣으라는 말입 // 니다. Timer1->Enabled=true; // 타이머인데요. 쓰지않는 거니까.. 신경쓰지 말고... ClientSocket1->Open(); // 자 이제 접속을 해야죠. Open이라는 함수를 호출 함으로써 지정된 IP // 주소로 접속을 시도 합니다. // 포트는 어케 하냐구요? 포트 번호는 프로퍼티 탭에서 직접 넣어 주시면 // 됩니다. 위에 IP주소도 직접 넣어주셔도 되는데 그렇게 되면 맨날 // 그 주소로 접속을 하니까 주소는 사용자가 넣어주고 포트 번호는 // 고정 시켜 놓으면 편하죠. 저는 11000을 포트번호로 지정했습니다. // 만약 넣어주고 싶다면 ClientSocket1->Port = ...이렇게 하시면 됩니다 오늘을 클라이 언트에 대해서 했구요. 다음은 서버에 대해서 강좌를 하겠습니다. 이상하게 오랜시간 키보드를 두들긴것 같은데 막상 커서를 옮겨가면서 보니까 내용이 무척 적군요. 그래도 저는 팔 아픈데.....^^;; 참 ->를 쓰느데 의미를 설명드릴께요. ClientSocket1->Open()의 의미는 ClientSocket1클래스의 맴버함수 Open을 호출 한다 는 의미 입니다. 근데 (.)이 아니고 (->)인 이유는 헤더 파일을 보면 TClientSocket *ClientSocket1; 라고 되어있습니다. 즉 포인터로 선언이 되어있으니 까 ->를 써야죠. 당연히.... 그리고 ClientSocket을 마우스로 폼에 위치시키면 자동적 으로 TClientSocket *ClientSocket1;이와 같이 코딩을 컴퓨터가 해 줍니다. 따라서 사용자는 CPP화일에 핸들러만 만들어 놓으면 되는 겁니다. 내가 쓰고 싶은 함수가 있는데 모르겠다 싶으면 도움말을 눌러서 Method를 눌러보세 요 그 클래스에 속한 멤버 함수들이 주르륵 나옵니다. 맘대로 골라 쓰세요. ^^;; 필요한 함수가 없으면 상속을 받아서 함수를 만들어 쓰구요. 그리고 참고로 초보자를 위해서 핸들러 라는 것을 잠깐 설명 드릴까 합니다. 윈도우에서는 이 핸들이라는 것이 무척 중요합니다. 모든것에 이 핸들이 존재합니다. 폼이 하나 위치하면 폼에대한 핸들이 존재하구요. 핸들이라는 것은 비유를 한다면 자동자 핸들에 비유를 할 수 있겠습니다. 자동차를 움직일려면 사람이 자동차 핸들을 손으로 조종해 주어야 합니다. 자동자를 하나의 윈도우라고 본다면 핸들은 윈도우를 움직이는 조종장치라고 볼수 있습니다. 따라서 프로그램에는 모든것에 핸들이 존재합니다. 위에서 버튼을 눌렀을때 동작을 정의 해야 하잖아요? 따라서 그러한 동작을 정의 하는 일을 핸들러를 정의 한다고 말합니다. 아래 분에 대한 질문은요.... 우선 시간 초과에 대해 어케 해야 되나..... 클라이 언트 소겠은 TimeOut이라는 프로퍼티가 없습니다. 따라서 타임에 관계된 것은 사용자가 만들어 주어야 합니다. 다른 소켓은 TimeOut이라는 프로퍼티가 있거든요. 거기에 시간을 정해 놓으면 그 시간까지 접속이 안되면 이벤트가 발생하게 됩니다. 따라서 거기에 대한 이벤트 핸들러를 만들면 됩니다. TNMFTP같은 소켓은 TimeOut란에 2000이라고 해 놓으면 2초를 가리키게 됩니다. 시간에 접속을 하지 못하면 접속에 실패했다는 이벤트가 발생하게 되지요? 대답이 되었는지 모르겠네요. 다음 강좌에 만나죠. White 최상천이었습니다. #2688 최상남 (kangnung) [강좌] 볼랜드 C++빌더 프로그래밍 #4 1998-07-22 16:04 111 line 안녕하세요 White 최상천입니다. 오늘은 서버 강좌를 하겠습니다. 프로그램이 태스크바에 떠 있으면 다른 곳에서 자기 컴퓨터에 접속을 시도하고자 할때 접속이 되면 화면에 프로그램이 뜨면서 접속이 되어야 할 것입니다. 이 부분에 대해서 설명을 드리겠습니다. 우선 소스를 보고 설명을 드리죠. 서버 소켓의 인스펙터에서 이벤트 탭을 보면 OnAccept라는 항목이 있습니다. 이 부분은 클라이 언트에서 접속을 했을때 발생하는 메세지를 정의하는 항목입니 다. void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, TCustomWinSocket *Socket) { String Str; Addmission = 1; ClientSocket1->Active = false; // 다른 컴에서 접속을 했으니까 내가 또다른 컴퓨터로 접속을 하면 // 안되겠지요? 따라서 클라이언트소켓을 동작을 하지 못하게 만들어 // 놓구요. Str = "Connection Established From "+Socket->RemoteHost; RHostName = Socket->RemoteHost; // 이렇게 하면 다른 컴의 이름을 얻을수 있습니다. RcvMessage->Lines->Clear(); // RcvMessage는 다른 컴에서 보내오는 메세지를 내가 볼수 있게 메모장에 // 출력을 하는 부분입니다. 저는 메모의 이름을 RcvMessage라고 했습니다. // 다른 컴에서 접속을 하게 되면 우선 메모장에 있던 지저분한 부분을 // 깨끗하게 만들어 주어야 보기에 좋겠지요? RcvMessage->Lines->Add(Str); // 그다음에 다른컴에서 온 메세지를 출력을 하게 됩니다. ConnectButton->Enabled = false; // 내가 다른 컴에 접속을 하지 못하게 Connect버튼을 Disable하게 만듭니다. CloseButton->Enabled = true; // Close버튼은 동작을 하게 만들어야 지요... 내가 대화하기 싫으면 끊을수 // 있게 말입니다. WindowState = wsNormal; Show(); // 태스크바에 있던 윈도우를 화면에 나타나게 하는 부분입니다. ActiveC&#111;&#110;trol = SndMessage; } 이해가 잘 되실것을 믿습니다. 그렇게 어려운 부분이 없습니다. 서버 소켓의 프로퍼티에서 Port항목은 11000으로 해 주어야 합니다. 클라이언트와 Port번호를 맞추어 주어야 하겠지요? 그다음 ServerType은 stNonBlocking으로 해 주어야 합니다. 이건 Default로 되어있으니까 건들 필요가 없구요. 그다음은 클라이언트 측에서 접속을 끊었을때 핸들러를 만들어 보겠습니다. 이벤트탭에 보면 OnClientDisconnect라는 메세지가 발생을 합니다. 거길 눌러보면 다음과 같은 함수가 만들어 지고 커서가 깜박거립니다. 물론 안의 내용은 자기가 만들어 주어야 하겠지요. void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { String Rcv; Addmission = 0; // 접속이 끊겼음을 나타내는 변수입니다. // 헤더 파일에 정의해 놨습니다. RcvMessage->Lines->Clear(); // 받은 메세지를 깨끗하게 청소를 하는 부분이구요. Rcv = "Connection Close by Others"; RcvMessage->Lines->Add(Rcv); // Connection Close by Others라는 메세지를 출력하는 부분입니다. ClientSocket1->Active = false; // 클라이 언트는 죽여(?)놓구요. ServerSocket1->Active = true; // 접속이 끊겨져 있으니까 클라이언트가 접속을 할때를 대비해서 서버는 // 항상 Active상태로 둡니다. CloseButton->Enabled = false; // 접속이 끊긴 상태니까 Close버튼은 동작하지 않게 만들어 놓구요. ConnectButton->Enabled = true; // 내가 다른 사람들에게 접속할 수 있게 Connect버튼은 동작을 하게 해야죠? RHostName = ""; } 다음은 클라이 언트에서 보낸 메세지를 받는 부분입니다. 클라이 언트가 접속을 했을때는 OnAccept라는 메세지가 발생하구요 접속된 클라이언트에서 메세지를 보내왔을때는 OnClientRead라는 메세지가 발생합니 다. 아래 부분은 클라이 언트에서 보낸 메세지를 처리하는 부분입니다. void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { String Rcv; Rcv = "<"+Socket->RemoteHost+"> "+Socket->ReceiveText(); RcvMessage->Lines->Add(Rcv); // 받은 메세지를 화면에 출력하는 부분입니다. // 예를 들어서 상대편 컴퓨터가 RED이고 "안녕하세요"라는 메세지를 보냈다면 // <RED> 안녕하세요 라고 메모장에 출력이 됩니다. } 간단하죠? 오늘강좌는 여기서 마치구요. 다음강좌는 나머지 부분의 자질구레한 부분들을 처리하는 부분을 하겠습니다. Core부분은 다 마쳤습니다. 다음 강좌에 만나죠. White 최상천이었습니다. #2689 최상남 (kangnung) [강좌] 볼랜드 C++빌더 프로그래밍 #5 1998-07-24 09:34 133 line 안녕하세요 White 최상천입니다. 강좌가 좀 늦어졌죠? 개인적으로 바쁜일이 좀 있어서리.... 요즘 취업땜시 골치좀 썩고 있거든요. 누가 취업 알선해 주실분 없나요? 흑흑.... 음....이만하구 강좌 시작하죠. 오늘은 나머지 부분에 대해서 설명하겠습니다. __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Addmission = 0; CloseButton->Enabled = false; } 윗 부분은 생성자 이구요. Close버튼을 사용 못하게 해 놓습니다. 다음은 Close 버튼을 눌렀을때 실행해야할 부분입니다. 당연히 접속을 끊는 것이 주 임무일 것입니다. CloesButton의 이벤트탭에 OnClick부분을 두번 두르면 다음과 같은 이름의 함수가 자동적으로 만들어 집니다. 내용은 물론 여러분들이 집어 넣구요. void __fastcall TForm1::CloseButtonClick(TObject *Sender) { String Str; Addmission = 0; Str = "Connection Closed"; StatusBar1->SimpleText = Str; // 아래 상태바에 Connection Closed라는 메세지를 출력합니다. RcvMessage->Lines->Clear(); // 대화를 하던 상자(메모장)는 깨끗하게 하구요. if(ServerSocket1->Active == false) ServerSocket1->Active = true; // 서버 소켓이 false면 true로 만들어 줍니다. 왜냐구요? // 연결이 끊겼으니까 다른 사람으로 부터 접속요구가 오면 // 연결을 하게 대기시켜 놓아야 되니까요. if(ClientSocket1->Active) ClientSocket1->Active = false; // 클라이언트 소켓이 ture면 false로 만들어 줍니다. // 클라이언트 소켓은 항상 Connect버튼을 누른 이후에만 Active // 됩니다. 나머지는 항상false죠. ConnectButton->Enabled = true; // Connect버튼을 동작하게 만들어 놓구요. CloseButton->Enabled = false; // Close버튼은 동작을 못하게 만들어 놓습니다. WindowState = wsMinimized; Hide(); // 접속이 끊겼으니까 프로그램을 태스크바에 내려 놓는 부분입니다. } 이해가 안되는 부분은 없을 겁니다. 다음은 폼이 형성될때 실행되는 부분입니다. Form1의 이벤트 탭에서 OnCreate부분을 누르면 자동으로 함수가 만들어 집니다. void __fastcall TForm1::FormCreate(TObject *Sender) { ServerSocket1->Open(); // 서버는 항상 대기 상태로 두구요. ClientSocket1->Active = false; // 클라이 언트는 죽여(?) 놓아야 겠지요? Button1->Enabled = false; // 이건 아무의미 없는 코드입니다. 신경쓰지 마세요.^^;; } 다음은 접속이 된 상태에서 상대편에 하고 싶은 말을 적은다음 엔터키를 누르면 여러분의 메세지가 상대편으로 가야겠지요? 메세지 보내는 것과 엔터키 처리 부분입니다. SndMessage라는 에디트 박스에서 이벤트탭을 보시면 OnKeyDown이라는 항목이 있을 겁니다. 그 항목의 의미는 그 에디트 박스에서 키가 눌려 졌을때 이런 함수를 실행 하라는 의미입니다. void __fastcall TForm1::SndMessageKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if((Key == VK_RETURN) && (Addmission == 1)) // 눌려진 키가 리턴이고 현재 접속이 되어있으면 // if문을 실행합니다. 접속도 되어있지 않은데 메세지를 보낼수는 // 없잖아요? 그리고 엔터키가 아닌데도 메세지를 보낼수도 없구요. { if(ServerSocket1->Active) // 내 컴에다른컴이 접속중일때는 여길 실행하구요. { ServerSocket1->Socket->Connections[0]->SendText(SndMessage->Text); // 다른컴이 접속했을때 서버소켓에서는 접속을 받아들이는데 위 처럼 // Connections[0]에 먼저 상대편의 컴퓨터가 접속이 되구요 만약 // 또 다른 컴이 접속을 하면 Connections[1]에 접속이 됩니다. // 비주얼씨에서는 소켓을 일일이 다 만들어 주어야 해요. 그에비해 // 빌더는 알아서 접속을 시켜 주는 군요. // 문자를 보내는 함수는 SendText이구요. SndMessage->Clear(); // 보내고 난 후에는 자기가 쓴 메세지를 지워야 겠지요? RcvMessage->Lines->Add(SndMessage->Text); // 그 다음 자신의 화면에도 자기가 어떤 글을 썼는지 봐야 하니까.... return; } if(ClientSocket1->Active == true) // 다른컴에 내 컴이 접속을 했을때는 여길 실행합니다. { ClientSocket1->Socket->SendText(SndMessage->Text); // 서버와 틀리게 클라이 언트는 여러개의 소켓이 접속을 하는 것이 아 니라 // 클라이 언트 자기 혼자 노니까 그냥 Socket->SendText해 주면 됩니다 . SndMessage->Clear(); RcvMessage->Lines->Add(SndMessage->Text); return; } } } 다음은 폼이 사라질때 즉 프로그램이 종료 될때 발생하는 부분입니다. 소켓을 닫는 일 밖에는 하지 않습니다. void __fastcall TForm1::FormDestroy(TObject *Sender) { ServerSocket1->Close(); ClientSocket1->Close(); } 마지막으로 타이머 부분이 하나 더 있는데요. 신경쓰지 마세요. 그냥 심심해서 올려놓은것 뿐이니까요....히히^^;; 강좌가 끝났네요. 내용이 별루 없어서 제가 보기에도 창피하네요. 내 딴에는 한다고 했는데..... 강좌가 여기서 끝나는 것이 아나라 다음에는 다른 주제로 계속 빌더 강좌를 하겠습니다. 제가 조그맣게 짠걸 가지고 많이 응용 할수 있습니다. 조금만 생각을 하시면 파일을 주고 받을수도 있구요. 서버 만들어 놓으시고 클라이언트 여러개 띄우셔 가지고 채팅도 할수 있구요.....뭐 여러가지 등등... 다른 기능들을 넣어 보세요. 실력이 부쩍부쩍 느는 지름길입니다. 여러분들이 이런기능을 넣으면서 어떻게 구현해야 하고 어디에 그런 기능이 있는 지 아는 것이 실력이 느는 가장 빠른 지름길입니다. 그리고 도움말을 많이 활용하세요. 그럼 다음 강좌에 뵙죠. White 최상천이었습니다.