S/W 개발/Embarcadero2008.01.03 15:21
[원문] 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 해서  컬럼의 순서를 바꾸어 보세요 ^^
기본기능으로 제공합니다.

'S/W 개발 > Embarcadero' 카테고리의 다른 글

[펌]VirtualTreeView 사용법 - 2  (3) 2008.01.03
[펌]VirtualTreeView 사용법 - 1  (0) 2008.01.03
Edit 창에 숫자만 입력 받기..  (0) 2007.12.26
Cport 설정 방법  (0) 2007.12.06
Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.26 16:04

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

'S/W 개발 > Embarcadero' 카테고리의 다른 글

[펌]VirtualTreeView 사용법 - 1  (0) 2008.01.03
Edit 창에 숫자만 입력 받기..  (0) 2007.12.26
Cport 설정 방법  (0) 2007.12.06
Delphi 2007 키오류 수정방법  (0) 2007.12.06
Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.06 10:46
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으로 빌드된 파일을 찾고 해서,
이래 저래 실행해보지 못했음. 단, 코드 정도는 참고할 정도가 됨.

-볼랜드포럼에서 발췌 -

'S/W 개발 > Embarcadero' 카테고리의 다른 글

Edit 창에 숫자만 입력 받기..  (0) 2007.12.26
Cport 설정 방법  (0) 2007.12.06
Delphi 2007 키오류 수정방법  (0) 2007.12.06
[펌]윈도우 프로그램에서 printf 사용하기  (0) 2007.12.06
Posted by 가희나희아빠 희자매(가희나희)아빠
TAG Cport
S/W 개발/Embarcadero2007.12.06 10:45
1) Uninstall Delphi 2007.

2) Remove the Program Files\CodeGear\RAD Studio\5.0 directory.

For Windows Vista:

3a) Remove the Program Data\CodeGear\RAD Studio\5.0 directory.

3b) Remove the Program Data\{AB3EC276... directory.

3c) Remove the User\All Users\CodeGear\RAD Studio\5.0 directory.

For pre-Vista Windows OS:

3a) Remove the Documents and Setting\All Users\Application Data\CodeGear\RAD Studio\5.0 directory.

3b) Remove the Documents and Setting\All Users\Application Data\{AB3EC276... directory.

4) If you had the Trial or Enterprise version installed and are now installing the Professional version, then run Regedit and remove the key: HKEY_CURRENT_USER\Software\Borland\BDS\5.0

5) Re-install Delphi 2007.

'S/W 개발 > Embarcadero' 카테고리의 다른 글

Cport 설정 방법  (0) 2007.12.06
Delphi 2007 키오류 수정방법  (0) 2007.12.06
[펌]윈도우 프로그램에서 printf 사용하기  (0) 2007.12.06
사용자 메시지 박스 만들기  (0) 2007.12.06
Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.06 10:44
윈도우 프로그램을 짜면서 제일 짜증나는 부분이 printf 를 제대로 쓸수 없다는 것이다.
printf 는 표준 화면으로 출력을 내보내기 때문에...
그래서 Memo 로 출력할때 IntToStr , StrToInt 등을 무진장 써야된다.
하지만 sprintf 를 쓰면 Dos 에서 printf 를 쓰듯이 모든 형식지정자를 다 사용할 수 있으며
간단히 메모장으로 출력을 할 수 있다.


또는


와 같이 해도 된다.

하지만 다른 C program 과의 호환성을 생각해 보면 Ansistring 의 Method
쓰는것은 별로 좋지 않을듯...

볼랜드포럼 향기님 글에서 발췌...
Posted by 가희나희아빠 희자매(가희나희)아빠
TAG printf
S/W 개발/Embarcadero2007.12.06 10:43


메시지 다이얼로그가 매일 같은것만 보기가 싫어서 조금 변경해 보았다..

전역 함수로 놔두고 쓰면 괜찮을듯.

인자 처리만 몇개 더 처리하면 편할듯...

Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.06 10:42
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164064862089986280348253421170679821480865132823066479384460955058231725

double tmpA, tmpB,tmpC;
tmpB = edtX2->Text.ToDouble() - edtX1->Text.ToDouble();
tmpC = edtY2->Text.ToDouble() - edtY1->Text.ToDouble();
tmpA = sqrt(pow(tmpB, 2) + pow(tmpC, 2));

lblA->Caption = "빗변 :" + (String)tmpA;
lblB->Caption = "
밑변 :" + (String)tmpB;
lblC->Caption = "
높이 :" + (String)tmpC;

// 직각
lblAngleA->Caption =  "각도 A : " + (String)((atan2(tmpB, tmpC) + atan2(tmpC, tmpB)) * 180 / PI);

// 밑변에 인접한 각    tmpB tmpA의 각
lblAngleB->Caption =  "각도 B : " + (String)(atan2(tmpB, tmpC) * 180 / PI);

// 높이에 인접한 각    tmpC  tmpA의 인법한 각
lblAngleC->Caption =  "각도 C : " + (String)(atan2(tmpC, tmpB) * 180 / PI);


---------------------------------------------------------------------------------------------

한변과 한 각을 알때 처리..


밑변이 x 이고 한각이 a 이고 다른 한각이 90도일때의

높이 구하는 방법은

? = x * tan(a) ;

간단히 구할수 있음...

Posted by 가희나희아빠 희자매(가희나희)아빠
TAG 각도, 두점
S/W 개발/Embarcadero2007.12.06 10:41
컴포넌트를 작성하거나 남이 만든 컴포넌트를 사용하다보면 아이콘이 맘에 들지 않거나 없는 경우가 많이 있다.

이럴 경우 X박스를 그냥 써도 되나..

존심상 나타나게 하고 싶을때..는

다음과 같은 방법을 사용하면 된다..

만약 소스에 dcr이나 res 파일이 있다면 그 파일을 사용하면 된다..
이 경우 이름이 같으면 된다(뭐.. 이름이 다르다면 소스와 같은 이름으로 만들면 된다..
가끔씩 이름만 같아도 안 되는 경우가 있다..
이럴때는 Resource 에디터를 이용해 리소스를 열어보면 리소스 명이 소스명과 다를 경우가 태반이다..
리소스명을 소스와 같은 파일로 작성해 준다..(어렵지도 않음)

compile과 make 작업을 다시 해주면 짜잔~~ 하고 나타날 것이다.. (가끔은 해당 컴포넌트를 제거하고 재설치 해야 되는 경우도 있다)

소스 상단부에 해당 리소스를 넣거나 파일 추가시 넣어주는 방법도 있으나 위의 작업이 되지 않는다면 어차피 나타나지 않는다..
직접 리소르를 넣어줄경우 가끔씩 이미 패스가 지정되어서 안 된다고 할때는 기존 패스를 삭제하고 리소스를 추가하면 나타날 것이다..

허접한 팁하나를 올림...
Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.06 10:41

전에 만들어 보았던 이벤트 다이얼로그의 VCL 판이다..

MFC에서는 여러 함수를 사용했는데.. BDS에서는 간단하게 구성해 보았다..

스플래쉬 폼이랑 비슷하지만.. 이번것은 메시지를 2개 처리하고 시간을 초단위(1초 = 1)로 처리하고 위치를 지정할 수 있게 바꾸어 보았다.

생성부 함수를 조금 변경해서 작성했다..

타이머를 하나 얹어서 타이머 시간이 되면 사라지는 방식이다.(정밀한 시간 제어가 필요없는 것이어서.. 그냥.. 간단하게 작성했다..)

전과 다른점은 화면 배경을 jpg 화면을 올려서 구분을 지어 주었다..

차후에 변경한다면.. 이벤트에 맞는 그림 처리까지 해서 더 자세한 설명을 해주는것도 하나의 방법일 듯 싶다..
그리고, 빠트린 창을 클릭하면 자동으로 사라지는 것도 추가해야 될듯 싶다..

그리고, 한가지 더.. 영역을 임의로 정해서 투명창을 작성하였다.. 이 방법은 추후 다른 프로그램에서도 사용이 가능할 듯 싶다..

Posted by 가희나희아빠 희자매(가희나희)아빠
S/W 개발/Embarcadero2007.12.06 10:39

예전에 작업하던것을 날려 버렸다.. ㅠㅠ

그래서, 어제 오늘 맘 잡고 다시 시작했다...

어느 정도 작업이 된듯하다.. 매끄럽지 않은 부분도 많지만...

그래도 내 혼자 쓰기에는 아무런 문제가 없는듯.. 뭐.. 이상한 부분은 다시 수정하면 되니까..

우선 1차 수정안을 올려 놓는다...

추후에 변경되면 화일을 변경하면 되니까..

저작권 문제가 있을지 모르니...

암호는 걸어놔야겠군.

수정기간 : 1.5day
Posted by 가희나희아빠 희자매(가희나희)아빠

티스토리 툴바