프로그램을 하다보면... 조합키가 이벤트를 처리해야 할때가 있다..
Alt키나.. Ctrl키같은 것들..

보통 일반키들은... Key 인자를 받아서 처리하면 된다..
Return --> if(Key == VK_RETURN) ....

Ctrl키를 사용 할 경우에는
if(Shift.Contains(ssCtrl)) ..
else if(Shift.Contains(ssAlt) ) ..  Alt키...

즉.... if(Shift == ssAlt)가 아니다... 이것때문에 괜히 고생...(모르는게 죄다...)

=======================================================================================================
Classes.TShiftState Type

TShiftState indicates the state of the Alt, Ctrl, and Shift keys and the mouse buttons.

Pascal
TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble);
C++
(ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble) TShiftState;
File

Classes

The TShiftState type is used by key-event and mouse-event handlers to determine the state of the Alt, Ctrl, and Shift keys and the state of the mouse buttons when the event occurs. It is a set of flags that indicate the following:

Value
Meaning



ssShift  
The Shift key is held down.  



ssAlt  
The Alt key is held down.  



ssCtrl  
The Ctrl key is held down.  



ssLeft  
The left mouse button is held down.  



ssMiddle  
The middle mouse button is held down.  



ssDouble  
The mouse was double-clicked.  






C++ builder 2007로 넘어오면서 인자를 사용하지 않아서 생기는 경고(Warning)가 자주 발생하게 된다.
(뭐 이전 버전에도 있었지만...)

[BCC32 Warning] formMain.cpp(35): W8057 Parameter 'Sender' is never used

이럴때 이런 메시지를 보고 싶지 않으면.. 다음과 같이 pragma 지시자를 사용하거나..

#pragma warn -8057

메뉴의 Project->Option(Shift+Ctrl+F11)에서
C++ Compliler->Warnings에서

W8057 PArameter is never used


선택을 해지해 주면 된다..

다른 경고 메시지도 이와 같이 선택을 해지하면 보지 않게 된다...
[출처] http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=69
 
안녕하세요.

VirtualTreeView는  소스가 델파이로 되어 있으면,
델파이나 BCB에서 사용가능한 형태의 콤포넌트로 제공되고 있습니다.

소스가 델파이다 보니  BCB에서 사용할때는  정보가 좀 부족한 면이 있습니다.

그래서 이 강좌를 시작한 이유기도 하구요 ^^

저도 처음 이 콤포넌트의 막강한 기능을 접하고는  감동이었지요.
그런데,  inline 에디터의 예제가 델파이로 되어 있어서  구현하려니 참 나감하더군요ㅡ.ㅡ

그러던중. VirtualTreeView 홈페이지 ( http://www.soft-gems.net/ ) 에 갔더니

BCB로 만들어진 inline 에이터 예제와 소스 샘플이 있더군요.

http://www.soft-gems.net/VirtualTreeview/
이 위치의
" IVTEditLink demo for BCB 5 "
이 예제를 받아 보시면 됩니다.

그런데, 이 예제를 받아 보면  실행은 되는데,  제대로 다 만들어 놓은 것은 아니더군요.
버그도 좀 있구요.

아무튼 이것을 바탕으로  수정및 업데이트 된  inline 에디터에 대해서 다루어 보겠습니다.


1.  inline 에디터 유닛

EditorUnit.cpp 와  EditorUnit.h 란  인라인 에디터 소스는  위에서 설명한  소스를 가져다가 제가 업데이트한 것입니다.
업데이트의 주 내용은 
   
    * 범용적으로 사용가능하도록 소스의 의존성 제거
    * 다수의 버그 수정

등 입니다.

이 소스도 최종본이라고 하기는 뭐하구요.  각 필요에 따라서 수정을 더 해 나아갸 합니다.
저도 제 필요에 따라서 조금씩 업데이트 하기 때문에,  아지 모든 기능이 동작하는 것은 아닙니다 ^^

EditorUnit 의 소스는 첨부파일을 보시구요.

EditorUnit.h  파일에 보시면,


이런 형 정의가 있는데요. TPropertyTyp 은 inline 에디터에서 사용할 에디팅 형식 입니다. ptNone --> 에이터를 사용하지 않음. ptEdit --> TEdit 형태의 에디터를 제공. ptCombo --> 콤포박스 형태의 에디터 제공 ptDate --> 날짜 선택 (TDateTimePicker) 에디터 제공 TPropertyData 은 VTV에서 한 셀(Cell) 에 해당하는 데이타의 형입니다. Node 나 Row 의 데이타가 아닙니다. 주의 하세요. 이 정도만 아시고, EditorUnit.cpp 와 EditorUnit.h 를 inline 에디터를 사용할 프로젝트에 추가 하시면 됩니다. 2. 데이타 구조 선언 이번 예제는 3번째 강좌에서 보여 드렸던 phonebook 예제에서 생일 컬럼을 하나더 추가한 형태로 만들어 보겠습니다. 이름, 전화번호, 성별, 생일 을 가지고 있는 것으로 만들어 보겠습니다. #include "EditorUnit.h" 데이타 구조를 선언하시 곳에 위와 같이 include를 추가해 주시구요. typedef struct tagPhonebook { TPropertyData Colunms[4]; // 0 - 이름, 1 - 전화번호, 2- 성별 , 3 - 생일 } structPhonebook; 데이타 선언은 위와 같이 합니다. Column이 4개 라서 4개짜리 배열로 만들었습니다. 3. VTV 의 기본 Events 구현 기본 Events는 이전에도 계속 말씀 드렸지만, OnGetNodeDataSize OnGetText 이구요. 이미지를 출력할 것이라면 OnGetImageIndex 까지 구현해 주시면 됩니다. 이번예제는 이미지는 없습니다 ^^ OnGetNodeDataSize 는 변경되는 것이 없지요 OnGetText는 배열을 사용하면서 소스가 더 간단해졌습니다^^ 4. VTV의 속성 변경 VTV가 처음 폼에 올려 놓으면 Column 0 만을 선택할 수 있습니다. 그러므로, Column 0을 제외한 다른 Column을 편집하기 위해서는 선택 모드를 변경해 주어야 합니다. TreeOptions -> SelectionOptions -> toExtendedFocus : true 이 값을 true로 해 주어야 각 컬럼별로 선택할 수가 있습니다. 5. inline 에디터 관련 Events 구현 inline 에디터를 구현하기 위해서는 최소 2개의 Event를 구현해 주서야 하는데요. OnCreateEditor : 각 셀에서 에디팅이 시작할 때 에디터를 생성해주는 시간을 제공합니다. OnEditing : 각 셀의 에디팅을 허용할 것인지 말것인지 결정합니다. OnCreateEditor 이벤트를 구현할때, 에디터의 형식이 ptCombo 일때와 아닐경우가 다른데요. ptCombo는 콤보박스 형태의 에디팅이 되기 때문에, 콤보박스에 보여질 데이타를 전달해 주어야 합니다. 그래서, __fastcall TPropertyEditLink(TVirtualStringTree* Tree, TVirtualNode* Node, int Column, TPropertyData* Data, TStringList *combolist); 생성자를 위의 것으로 사용하고, 콤보박스에 보여질 항목을 TStringList로 만들어서 전달해 주어야 합니다. 그외의 경우는 아래의 생성자를 이용하면 됩니다. __fastcall TPropertyEditLink(TVirtualStringTree* Tree, TVirtualNode* Node, int Column, TPropertyData* Data); 아래에 OnCreateEditor 이벤트를 구현한 예제가 있는데요. Column 2 에서만 ptCombo로 생성한 예제 입니다. OnCreateEditor 이벤트를 구현해 줍니다. 이 이벤트에 들어 오면, 노드의 데이타를 가져와서 각 컬럼에 해당하는 값 (pPhonebook->Colunms[Column])으로 TPropertyEditLink 클래스를 생성해 주구요. (이 클래스가 EditorUnit.cpp 에 있는 것입니다) PropertyLink->QueryInterface(__uuidof(IVTEditLink), (void**)EditLink); 를 이용해서, EditLink 파라미터를 채워주면 됩니다. OnEditing 이벤트에서 에이터를 허용할 셀을 알려 주는데요. pPhonebook->Colunms[Column].PropertyTyp 이 ptNone 가 아닌 경우만 Allowed 를 true로 넣어 주는 것입니다. 자 이제 모든 필요 이벤트는 다 만들었구요. 7. 데이타 넣기 데이타를 넣는 버튼을 하나 만들어서 그 버튼이 눌렸을때, 데이타를 넣어 주면 됩니다. 위 예에서 보시면, Columns 0 ~ 2 까지는 ptEdit 란 형태로 넣었구요. Column 3 만 ptDate를 넣었습니다. 실행해 보신 후에 각 셀은 편집은 F2를 누르시거나 마우스로 클릭하고 잠시 기다리면 편집모드로 들어 갑니다. 실행해서 편집해 보세요.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지


오늘 여기까지 합니다 ^^

아무쪼록  이글이 도움이 되길 바랍니다.

[원문] http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=63

 안녕하세요.

VirtualTreeView 의 좋은 기능 중에 하나가  부모와 자식 관계를 관리할 수 있도록 기능을 제공한다는 것입니다.

첨부한 첫번째 그럼처럼  버튼을 누를때 마다   루트노드나  자식노드를 추가하는 예제를 만들어 보겠습니다.


1. 폼에 필요 컴포넌트 가져다 놓기

이번 예제는 첨부한 첫번째 그림과 같은 프로그램을 만들것인데요.
사용자 삽입 이미지


여기에서 필요한 콤포넌트는 TVirturalStringTree 1개 TImageList 1개 TButton 2개 정도를 폼에 올려 놓습니다. 그외에 위치 정렬을 위해서 Panel 같은 콤포넌트를 추가로 올릴 수도 있겠지요. 2. ImageList 에 이미지 로드 ImageList에 적당한 이미지 아무것이 2개를 추가 합니다. 1개는 루트노드를 위한 이미지이고, 다른 것은 자식노드를 위한 이미지 입니다. 3. TVirturalStringTree 의 속성 수정 TVirturalStringTree 의 속성에서 Images 에 ImageList1 를 지정합니다. Header -> Columns 에 새로운 컬럼 1개를 추가합니다. 이것을 화면에는 보이지 않지만, Column 1개를 사용한다는 의미에서 추가합니다. 그런데, 기본으로 추가되는 Columns의 Width 가 TVirturalStringTree 의 Width와 다르기 때문에 그냥 실행하면 너무 작게 나옵니다. 이런 경우 Columns의 Width 값이 TVirturalStringTree 의 Width에 맞추어서 자동으로 조절되도록 하는 속성이 있는데요. Header -> AutoSizeIndex : 0 <-- Column 0를 기준으로 삼음 을 넣어 줍니다. 그러면 Column 0의 Width를 VTV의 전체 크기에 맞추어서 조절합니다. 4. 데이타 구조 선언 이번 예제는 Column 이 1개만 있는 VTV른 만들 것이므로, 노드 데이타 구조체는 아래와 같이 만들었습니다. 5. 기본 메소드 구현 OnGetNodeDataSize 이벤트를 아래와 같이 구현해 줍니다. OnGetText 이벤트를 구현해 줍니다. OnGetImageIndex 이벤트를 구현해 줍니다. 6. 노드 추가 이제 노드를 추가하는 버튼을 추가해서 버튼의 이벤트에 구현해 줍니다. 6.1. 루트노드 추가 우선 루트노드를 추가하는 버튼을 하나 만들고, 이 버튼의 이벤트에 아래와 같이 구현해 줍니다. 여기서 주의 깊게 보실 곳은 Node = VirtualStringTree1->AddChild(NULL); 이 부분입니다. AddChild 에서 파라미터가 NULL로 전달되는 경우, 부모가 없는 루트노드로 노드를 생성합니다. 그 아래의 노드 데이타를 넣어주는 것은 이전과 동일하죠 ^^ ImageIndex를 루트노드는 0 번을 사용하였습니다. 6.2. 자식노드 추가 자식노드를 추가하는 것은 AddChild 에서 파라미터로 부모노드의 포인터를 넣어 주면 됩니다. 그래서 예제에서는 현재 포커스가 가 있는 노드를 부모로 해서 생성하는 예제를 만들었습니다. 소스가 루트노드 생성과 거의 똑같지요. AddChild의 파라미터가 있는 것과 노드의 데이타를 다른값을 넣어 주는 것만 다르구요. 첨부한 파일에 전체 프로젝트를 넣어 두었습니다. 한번 실행해 보시면 어렵지 않을 것입니다. PS. VirtualTreeView를 설치 하고 처음 예제를 만들다 보면, 컴파일 에러가 나오거나 헤더파일을 못 찾는 경우가 있는데요. 이것은 project 설정에서 include와 lib 패스가 잘못 설정되어 있어서 그렇습니다. BCB 메뉴중에 Project -> Options 에 들어 가시면 Directories/Conditionals 란 탭이 있는데요. 이곳에서 Include Path 와 Library Path 에 VritrualTreeView와 테마메니져의 Path를 추가해 주시면됩니다. C:\Program Files\Soft Gems\Virtual Treeview\Source C:\Program Files\Soft Gems\Theme Manager\Source 기본으로 설치하셨다면 위 두 패스를 추가하면 됩니다.
[출처] http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=62

 1. 속성 수정


위 그림 처럼, VirtualTreeView는 처음 가져다 놓으면, 
Column 0 -> TreeView 같은 형태이고,
Column 1 이후 -> ListView 같은 형태입니다.

그러므로,

첨부한 그림 같은 것이 아니라  List같은 형태를 원하시면,
Object Inspector 에서 원하는 속성을 수정하여야 합니다.

사용자 삽입 이미지

[List 같은 형태로 바꿀때]

* 한라인 전체 선택 :  TreeOptions -> SelectionOptions -> toFullRowSelect  : true
* Column 0 의  Child와 Parent 사이의 연결관계 표시하는 점선 없애기 :
              TreeOptions -> PaintOptions -> toShowTreeLines  : false
* Column 0 의 앞쪽 여백을 없애기 :   Indent : 0
              Indent는  Child와 부모사이의 들여쓰기 할때의 간격입니다.

이렇게 3가지 속성을 변경하면,
VTV가  List 형태처럼 보이게 됩니다.

이전강좌에서 위 3가지 속성을 수정한 실행 파일을 첨부하였습니다.

2. 이미지 출력하기

BCB에서 메뉴등에 이미지 출력하기 위해서는  ImageList를 사용하잔아요.
VTV도 마찬가지로 이미지 출력을 위해서는 ImageList를 사용하게 됩니다.

[Win32] 팔렛트에서 TImageList 콤포넌트를 폼에 올려 놓습니다.
폼에 올려 놓은 것은 TImageList를 더블클릭해서  첨부화일에 있는 bmp 파일을 등록해 줍니다.
각 이미지의 크기는 24x24 입니다.  TImageList의 Widht 와 Height를 24로 변경해 주신후에
불러와야 합니다.

TVirtualStringTree의 속성에서 Images 속성에 방금전에 올리 ImageList의 이름을 설정합니다.

그럼 이제 이미지를 출력할 준비가 된것이구요.

VTV에 어떤 이미지를  출력할 것인지 알려 주는 메소드를 만들어 주서야 합니다.

Events 중에  OnGetImageIndex 란 메소드가 있는데요.
이것을 구현해 주면 됩니다.

위 예제는 무조건 ImageList의 index가 1번이 이미지를 출력하라는 것입니다. ImageList는 0부터 시작하므로 1은 두번째 이미지가 나오게 됩니다. 그런데 위 코드를 넣고 실행해 보시면 모든 Column에 동일한 이미지가 나오는 것을 보실 수 있습니다. 두번째 첨부한 그림이 그것입니다. 그럼 Column 0 에만 이미지가 나오고, 다른 컬럼에는 안 나오게 하려면 어떻게 할까요? 그것은 Column 파라미터를 이용하면 됩니다. 이렇게 바꾸었습니다. 그러면 Column 0 에만 이미지가 출력 됩니다. 실제 상황에서는 보통 이미지가 모두 동일하게 출력하지는 않지요. 각 라인의 정보에 따라서 이미지를 다르게 출력하는 것이 보통이지요. 그래서, 처음에 만들었던 구조체에 어떤 이미지를 출력할지를 결정하는 변수를 하나 추가 합니다. 이렇게 변경합니다. 즉, 입력한 노드의 데이타에서 ImageIndex를 가져와서 설정하는 방식입니다. 그럼 입력하는 곳에서는 ImageIndex를 지정해 주어야 겠지요. Button1Click을 위와 같이 수정하였습니다.

오늘은 여기 까지 입니다.

그럼 수고하세요!

[원문] http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=61
 안녕하세요.

3번째 시간입니다.
지난번 글보시고,  VirtualTreeView 의 도움말중  Step by Step 이란 장을 미리 보시분들은
글의 순서가 똑갔네 ^^ 하고 생각하시는 분들오 있을듯하네요.

제가 참조한 것도 그것이라  비슷할 것입니다.

이번시간에는

폼에  VirtualTreeView 를 올려 놓고,  컬럼 3개를 추가해서
각 컬럼에  데이타를 넣어주는 것을 해 보겠습니다.

VirtualTreeView 를 사용할 때에는 먼저  내가 무슨 데이타를 가지고 화면에 어떻게 보여줄 것인지 먼저
고민 하셔야 합니다.

제가 3개의 컬럼을 가진 VirtualTreeView 를  리스트 형태로 보이는 것으로 하겠습니다.

1. 데이타할 구조체를 만들자

VirtualTreeView 는 지난번에도 말씀 드렸지만,   데이타 저장 공간을   VTV (VirtualTreeView )가 할당해주고,
우리는 이것을 사용하고,
사용이 끝나면  VTV 가 해제를 해 주는 구조라고 하였습니다.

그러므로, 제일 먼저할 일은 내가 필요한 데이타의 구조체를 만들 어 주는 것입니다.

Class로 하면 안되냐구요?
위에서도 이야기 했지만  우리가 new를 하지 않습니다. Class 로 만들고 new없이 사용할 때 어떤 문제가 생길까요?

저도 모르지요 ^^  원하시는 분은 해 보세요.  단 모든 책임은 본인이.... ^^


위처럼 구조체를 선언했습니다.

Column0  ->  이름
Column1  ->  전화번호
Column2  ->  성별

이렇게 출력하려고 합니다. 

지난번 강좌에서 말씀 드렸지만,  Node 데이타는  할 줄(Row)에  대한 데이타 모두를 담을 수 있도록 만들어야 합니다.
각 셀별로 따로 관리 하는 것이 아닙니다.


2.  컬럼을 추가 하자

보통 컬럼이 하나라면 이 작업을 꼭 해주어야 할 필요는 없지만,   컬럼을 추가해 주어야 할 수 있는 기능들이 있기 때문에  컬럼을 추가하는 것을 권장합니다.

폼위에  TVirtualStringTree 콤포넌트를 하나 올려 놓으시구요.

Obejct Inspector 에서  Properties 를 보시면,

Header -> Columns

항목이있습니다.  여기에서  오른쪽의  [...] 이라는 버튼을 누르면  컬럼을 추가 하는 윈도우가 나옵니다.

윈도우가 나오면, 왼쪽 상단의  추가하는 버튼을 누러서    Column을 추가하여
순서대로 Text 속성에 
       이름 , 전화번호,  성별
을 넣어 줍니다.

첨부한 그림의 첫번째 것입니다.
사용자 삽입 이미지

그런다음에 윈도우을 닫습니다.

어!    VirtualTreeView 는 똑같네요.  컬럼 추가한거 어디 갔지?
VirtualTreeView 는 header보이는 것도 속성에서 조절하기 때문에  속성을 바꾸어 줄때까지는 안 보입니다.

Header -> Options -> hoVisible

값을 true로 바꾸시면,  헤더가 보이게 됩니다.

3.  내가 사용할 데이타의 크기를 VirtualTreeView  에 알려 주자.

다시한번 말씀 드리지만,   데이타의 할당/해제 VTV가 한다고 하였잖아요.
그럼,  VTV가 할당하여야할 데이타의 크기를 알아야 하잖아요.

그래서 꼭 해주서야 하는 것이   이 작업입니다.

데이타의 크기를 할려주는 방법은  2가지가 있는데요.
노드의 크기가  고정인 경우와    가변인 경우가 다릅니다.

고정인 경우는  Properties 에 보시면,   NodeDataSize 란 것이 있습니다.
여기에 크기를 넣어 주시면 됩니다.

그런데 사실 데이타 크기를 손으로 계산에서 여기 써 넣을 일은 없겠지요 ^^

     VirtualStringTree1.NodeDataSize = sizeof(structPhonebook);


이런식으로 넣어 주시면 됩니다.   트리가 사용되기 전에... 

또다른 방법은   Events 중에   OnGetNodeDataSize 를 구현해 주는 것입니다.
이것에 가변크기일때 사용하는 방법이지만,  고정 일때 사용해도 상관없겠지요.


위 두 코드는 동일한 동작을 합니다만  전 주로 두번째 코드로 만듭니다 ^^

4.  데이타를 VTV 의 셀에 출력하자

다음으로 하셔야 할 것이  자신이 추가한 데이타가  VTV의 각 셀(혹은 Column) 에 출력되도록 하여야 합니다.
이것은  OnGetText  란 이벤트를 구현해 주면 됩니다.


위와 같이  메소스들 구현하면 되는데요.

Node 란 파라미터는  출력할 Node의 포인터가 옵니다.
이것은 NULL 아닌지 확인 먼저 하시구요.

NULL 이 아니면,   GetNodeData(Node);  메소드를 사용하면, 해당 노드에 할당되어 있는 데이타의 포인터를
돌려 줍니다.   이것을 우리가 사용할 구조체 포인터로 넣어 주시면 됩니다.

Column  파라미터는 출력할 컬럼의 번호을 알려 줍니다.
즉 Column 번호가 0 이면 이름을 , 1이면 전화번호, 2이면 성별을 출력하도록 하였습니다.

여기 까지가 최소한 구현해 주어야 할 메쏘드 들이구요. 
이제야 사용할 준비가 된 것입니다.

이제는 실제 데이타를 넣어주면 됩니다.

5.  데이타를 넣자 ^^

데이타를 넣는 방법은  다시 한번 이야기 하지만  VirtualTreeView   한테 데이타 넣을 공간을 할당해줘
하고 요청한 후에  공간이 할당되면 그곳에 데이타를 넣어 주면 됩니다.

해제는 언제 하나구요.  VirtualTreeView   가 알아서 해 주므로 신경 안 쓰셔도 됩니다.

데이타를 넣는 방법은

PVirtualNode AddChild(PVirtualNode Parent, void *UserData = NULL);

이 함수를 이용해서 넣어 줍니다.

즉, AddChild 를 호출하면 ,   노드하나 만들어줘 하고 VTV에 요청하는 것입니다.
이것이 돌려 주는 것이  PVirtualNode 란  Node의 포인터 이구요.

이 Node 포인터를 GetNodeData 에 넘겨주면 실제 저장할 곳의 포인터를 돌려 줍니다.

예제에서는  버튼을 하나 만들구요.  버튼을 누를 때마다  노드를 추가하는 것으로 하였습니다.


위 소스 보시면, 아시겠지요 ^^

AddChild 로  노드 추가 하고,
그 노드에서 데이타 저장위치 가져오고,
그 저장위치에 실제 데이타 넣어 주구요.

* 오늘 강좌는 여기 까지 입니다.

첨부한 파일에  소스와 실행파일 모두가 있구요.

이거 실행 하신 후에  헤더를 Drag&Drop 해서  컬럼의 순서를 바꾸어 보세요 ^^
기본기능으로 제공합니다.

OnKeyPress 이벤트를 아래와 같이 처리할 것..
숫자, Enter(RETURN), Del,  Tab, Back Space 등은 허용하며 다른 키 입력은 0 을 리턴함..

CPort 설치 방법

Test 환경: Windows2000, C++ Builder 6.0

1.먼저 CPort 3.0 (cport-3.0.zip)을 다운로드 받는다.
   http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=component&no=366


2. 압축을 풀면 다음과 같은 파일이 생긴다.
    source.zip
    examples.zip
    help.zip
    locale.zip
  
3. 위의 4개 압축 파일을 차례대로 압축을 푼다.
   (ex)D:\DLTS_C\Component\CPort 3.0 이 디렉토리 하부에 풀었음.

4. C++ Builder를 기동하고 Source의 디렉토리의 bpk 파일을 연다
   본 PC에서는
  
   D:\DLTS_C\Component\CPort 3.0\sources\source\DsgnCPortCB6.bpk
   D:\DLTS_C\Component\CPort 3.0\sources\source\CPortLibCB6.bpk
  
   * 여러 개의 bpk 파일 나오는데.. 6.0에 해당하는 것은 이놈들인 것 같고..
   문제없다면 DsgnCPortCB6.bpk로 문제없는데.. 간혹 인스톨시 뭐라고 에러 나오는데..
   이 두개 파일을 번갈아 열어서 컴파일/인소톨하면 해결 됩니다. -.- 왜 그런 지는 저두 -.-;;

5. Compile하고 install 한다. install까지 정상적이라면 컴포넌트 갤러리 창에 새로운
   탭이 하나 더 생기고 몇 개의 아이콘이 보일 것이다. 그리고,

   C:\Program Files\Borland\CBuilder6\Projects\Bpl
   C:\Program Files\Borland\CBuilder6\Projects\Lib

   디렉토리에 CPort관련 bli, lib 파일들이 생성된다.

6. 다음 파일을 수정한다. 수정하지 않으면 컴파일 시, 링크 시 낭패를 보게 된다.

   D:\DLTS_C\Component\CPort 3.0\sources\source\CPort.hpp
   D:\DLTS_C\Component\CPort 3.0\sources\source\CPortCtl.hpp

   파일을 수정한다. 수정없이 사용하면
   동일한 함수가 두번 정의됐다는 메세지와 함께 에러가 발생한다.

   [CPort.hpp]
          // 1. 파일 맨 윗부분에 다음을 추가한다.

       // Borland C++ Builder
       // Copyright (c) 1995, 2002 by Borland Software Corporation
       // All rights reserved

       // (DO NOT EDIT: machine generated header) 'CPort.pas' rev: 6.00

       #undef SetPort       // <= 이부분 추가 : 안하면 ComPort->SetPort("COM1");
                //                  이런 문장에서 Link 에러 발생


       // 2. 다음 2개의 함수를 주석 처리한다. (680라인 정도에 있음)
       /* Exception.CreateRes */ inline __fastcall EComPort(int Ident)/* overload */ : Sysutils::Exception(Ident) { }
       /* Exception.CreateResHelp */ inline __fastcall EComPort(int Ident, int AHelpContext)/* overload */ : Sysutils::Exception(Ident, AHelpContext) { }


   [CPortCtl.hpp]
           // 아래의 부분을 주석으로 처리 (240라인 정도에 있음)
       //typedef TBitmap TLedBitmap;
       //;

7. 두 개의 파일을 수정하였으면 Source 디렉토리에 있는 모든 *.hpp 파일을
   C:\Program Files\Borland\CBuilder6\Include\Vcl 로 복사

   이렇게 하면 일단 설치가 완료됨.


8. 이 후 프로젝트에서 Cport를 이용하려 할 때 다음과 같이 한다.
    8.1 Project -> Option 에서 Directories/Conditionals 탭을 연다.
    8.2 Library Path에
        D:\DLTS_C\Component\CPort 3.0\sources\source\ 디렉토리를 추가하여 준다.

    이거 안 해주면 또 xxxx.DFM 파일이 없네...뭐 어쩌내 하면서 링커 에러 또 나옴.

    8.3 Library Path에 추가시키면 그냥 사용하면 됨.

9. 참고로 볼란드 포럼에 CPort에 관한 많은 Q/A가 있으므로 이 것을 토대로 코딩하면
   될 것 같음.
  
* 참고
상기의 7,8,9번은 컴파일/링크 시 헤더 파일과 리소스 파일의 디렉토리를 어떤 식으로든 컴파일러에
알려 주기만 하면 됩니다.
  즉, install하고 난 후 header 파일 고치고(xxxx.hpp), 관련된 모든 파일을 자신이 개발하는
소스 디렉토리에 몽땅 카피하고, include 와 lib 디렉토리에 현재 디렉토리를 정해주면 문제없이
됩니다.
  즉, xxxx.hpp 파일, xxxx.dfm 파일, xxxx.res 파일(CPortImg.res)을 현재 개발 소스가 있는
디렉토리에 모두 복사하고, Project -> Option 에서 Directories/Conditionals 탭에서 include와
lib 디렉토리를 현재 디렉토리를 추가(default로 현재 디렉토리가 있음)하면 됩니다. 이 방법이
위의 7,8번의 과정을 거치지 않아서 좀더 간편한 방법 같습니다.
  아니면 모든 연관된 파일을 Program Files\Borland 쪽으로 가져다 놓는 것인데.. Builder 다시 깔고
뭐 이리 저리 왔다갔다 하는 과정에서 보니-제경우 좀 불편한 면이 있어서요..
  아뭏튼 구미에 맞게 사용하시길...

**
참고로 Cport-3.0.zip에 있는 CBuilder용 example은 5.0으로 되어 있으며 6.0에서
컴파일 시 이런 저런 에러가 발생하였으며 Lib 파일도 5.0으로 빌드된 파일을 찾고 해서,
이래 저래 실행해보지 못했음. 단, 코드 정도는 참고할 정도가 됨.

-볼랜드포럼에서 발췌 -

+ Recent posts