// 한번에 하는 방법은 ForceDirectories 함수를 이용하면 된다..

함수 설명은 아래와 같다..  반환값은 실패 성공 뿐이니까.. 실패 성공만 처리하면된다..
굳이 디렉토리가 존재하는지 확인 할 필요도 없다.
있으면 그냥 넘어가고 없으면 생성하게 된다.

ex) ForceDirectories("C:\\IT\\LOG");

Creates a new directory, including the creation of parent directories as needed.

Pascal
function ForceDirectories(const Dir: string): Boolean;
C++
Boolean ForceDirectories(string Dirconst);

FileCtrl

ForceDirectories creates a new directory as specified in Dir, which must be a fully-qualified path name. If the directories given in the path do not yet exist, ForceDirectories attempts to create them. 

ForceDirectories returns true if it successfully creates all necessary directories, false if it could not create a needed directory.

Warning: 
Important:Do not call ForceDirectories with an empty string. Doing so causes ForceDirectories to raise an exception.  
Note: 
The FileCtrl unit (Windows only) also contains a ForceDirectories function. However, the FileCtrl version is deprecated, and the SysUtils version preferred, even if the code does not need to be cross-platform.  

 


사용예) hDLL = LoadLibraryEx("Temp.dll", NULL,LOAD_LIBRARY_AS_DATAFILE);

#define DONT_RESOLVE_DLL_REFERENCES            0x00000001
#define LOAD_IGNORE_CODE_AUTHZ_LEVEL           0x00000010
#define LOAD_LIBRARY_AS_DATAFILE                     0x00000002
#define LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE   0x00000040
#define LOAD_LIBRARY_AS_IMAGE_RESOURCE       0x00000020
#define LOAD_WITH_ALTERED_SEARCH_PATH         0x00000008

참고
•DONT_RESOLVE_DLL_REFERENCES :
   이 옵션은 윈도우 NT에서만 사용할 수 있으며 DllEntryPoint를 부르지 않을 때 사용한다.     DllEntry와 DllExit 코드는 Dll Main을 설명할 때 함께 하기로 하고,  지금은 Dll의 Entry Point에서 명시된 코드를 실행하지 않을 때 이 옵션을 사용한다

•LOAD_LIBRARY_AS_DATAFILE :
    이 옵션은 DLL 파일을 하나의 단순한 데이터 파일로 이해하고 적재하도록 하는데 그 목적이 있다. 실행 코드가 전혀 없는 DLL들은 시스템에서 DLL의 실행을 위한 특별한 준비가 필요하지 않으므로 실행 시간을 절약할 수 있다.

•LOAD_WITH_ALTERED_SEARCH_PATH :
   이 옵션을 사용하면 위에서 언급한 DLL을 탐색하는 경로를 LoadLibraryex(LPTCSTR)에 명시된 대로 바꿀 수 있다

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

디렉토리를 한번에 생성하는 방법  (0) 2008.09.29
LoadLibraryEx  (0) 2008.03.20
가끔씩 하는 RAD Studio 스플래쉬 바꾸기..  (1) 2008.01.11
조합키를 사용법  (0) 2008.01.10
매일 사용하는 RAD STUDIO 화면이 가끔 지겨울때 하는 짓...

리소스 에디터로 조금 수정해서 사용...

약간은 외설(?)스럽다고 할지도 모르겠네...

근데.. 이건 미술품인데..
사용자 삽입 이미지

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

LoadLibraryEx  (0) 2008.03.20
가끔씩 하는 RAD Studio 스플래쉬 바꾸기..  (1) 2008.01.11
조합키를 사용법  (0) 2008.01.10
[팁]W8057이 보기 싫을때..  (0) 2008.01.10
  1. 12월 업데이트부터는 다시 bds.exe 를 건드려야 된다...

    지난번과 또 달라졌다... 흠...

프로그램을 하다보면... 조합키가 이벤트를 처리해야 할때가 있다..
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.  






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

가끔씩 하는 RAD Studio 스플래쉬 바꾸기..  (1) 2008.01.11
조합키를 사용법  (0) 2008.01.10
[팁]W8057이 보기 싫을때..  (0) 2008.01.10
[펌]VirtualTreeView 사용법 - 4  (0) 2008.01.03
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


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

다른 경고 메시지도 이와 같이 선택을 해지하면 보지 않게 된다...

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

조합키를 사용법  (0) 2008.01.10
[팁]W8057이 보기 싫을때..  (0) 2008.01.10
[펌]VirtualTreeView 사용법 - 4  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 3  (0) 2008.01.03
[출처] 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를 누르시거나 마우스로 클릭하고 잠시 기다리면 편집모드로 들어 갑니다. 실행해서 편집해 보세요.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지


오늘 여기까지 합니다 ^^

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

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

[팁]W8057이 보기 싫을때..  (0) 2008.01.10
[펌]VirtualTreeView 사용법 - 4  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 3  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 2  (3) 2008.01.03
[원문] 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 기본으로 설치하셨다면 위 두 패스를 추가하면 됩니다.

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

[펌]VirtualTreeView 사용법 - 4  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 3  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 2  (3) 2008.01.03
[펌]VirtualTreeView 사용법 - 1  (0) 2008.01.03
[출처] 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을 위와 같이 수정하였습니다.

오늘은 여기 까지 입니다.

그럼 수고하세요!

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

[펌]VirtualTreeView 사용법 - 3  (0) 2008.01.03
[펌]VirtualTreeView 사용법 - 2  (3) 2008.01.03
[펌]VirtualTreeView 사용법 - 1  (0) 2008.01.03
Edit 창에 숫자만 입력 받기..  (0) 2007.12.26
  1. 첫번째 라인과 나머지 라인의 이미지를 다르게 할려면..

    위의 Column 값대신 Node->Index 값을 비교하자..

    if(Node->Index == 0)
    ImageIndex = 0;
    else
    ImageIndex = 1;

  2. Image 속성이나 ImageState 속성 둘중 아무것이나 연결을 시켜주면 ImageList가 연결됩니다.

  3. Random 함수를 Seed를 초기화 할때는 randomize(); 를 사용하거나..(보통 생성자쪽에 선언하는것이 좋음.. 어차피 한번만 사용할테니까..)

    아래와 같이 srand 시켜서 사용..

    // 시간 가지고 랜덤함수 초기화..
    srand(StrToInt(Now().FormatString("hhnnss";)));

    아니면

    srand(GetTickCount());

[원문] 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

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

+ Recent posts

티스토리 툴바