FreePascal Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
FreePacal 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

FreePascal Q&A
[122] Re:Re:[재질문][답변] Tree 콘트롤에서 Checked Box
MarunGuy [marunguy] 4943 읽음    2013-06-18 14:05
답변 감사합니다.

언급한 내용은  VirtualTreeView 에 관한 것입니다.
VirtualTreeView 의 VirtualNode 에는 CheckType 이 있지만
TShellTreeView, TTreeView 의 TTreeNode 에는 CheckType 같은 항목이 없습니다.

TShellTreeView 에 CheckBox 만 있으면 되는데 ...

TShellTreeView 소스를 참조해서 VirtualTreeView 를 이용한 커스텀 콘트롤을 만들어야 되는건지?
라자루스, 파스칼 모두 익숙하지 않은 상태라 어렵네요..

김도완 님이 쓰신 글 :
: MarunGuy 님이 쓰신 글 :
: :
윈도우즈에서 지원되는 Tree Control 자체가 원래 Checked Box 기능을 갖고 있지만
: : VCL, LCL 같은 컴포넌트에서 그걸 지원하도록 만들어 있지 않을 뿐임.
: : 
: :     LONG style = ::GetWindowLong(WindowHandle, GWL_STYLE);
: :     ::SetWindowLong(WindowHandle, GWL_STYLE, style |  TVS_CHECKBOXES );
: : 
: : 위와 같은식으로 TreeView 콘트롤에 TVS_CHECKBOXES  스타일만 추가하면 됨.

: :
: : 라자루스(CodeTyphon 4.3) 에서 TShellTreeView, TTreeView 콘트롤 두개에서 테스트했는데 CheckBox 가 안 생깁니다.
: : 디버거로 GetWindowLongPtrW, SetWindowLongPtrW 함수의 리턴값을 조사해봐도 정상인데 말이죠.
: :
: : TShellTreeView, TTreeView 콘트롤의 Class Name 이 모두 Window 로 되어있는데 정상인지 모르겠습니다.
: : LCL 의 TShellTreeView, TTreeView 콘트롤이 Win32 TreeView 콘트롤을 사용하지 않고 자체적으로 구현된게 아닌가 싶습니다.
: :
: :
: : procedure TForm1.FormCreate(Sender: TObject);
: : var style: Windows.LONG_PTR;
: :   styleret: Windows.LONG_PTR;
: : begin
: :   style := 0;
: :   styleret := 0;
: :   style := Windows.GetWindowLongPtrW(Self.ShellTreeView1.Handle, Windows.GWL_STYLE);
: :   Windows.SetLastError(Windows.ERROR_SUCCESS);
: :   // TVS_CHECKBOXES = 256.
: :   styleret := Windows.SetWindowLongPtrW(Self.ShellTreeView1.Handle, Windows.GWL_STYLE, style or 256 );
: : 
: :   style := 0;
: :   styleret := 0;
: :   style := Windows.GetWindowLongPtrW(Self.TreeView1.Handle, Windows.GWL_STYLE);
: :   Windows.SetLastError(Windows.ERROR_SUCCESS);
: :   // TVS_CHECKBOXES = 256.
: :   styleret := Windows.SetWindowLongPtrW(Self.TreeView1.Handle, Windows.GWL_STYLE, style or 256 );
: : end;  

: :
:
: 다른 방법으로 node를 건드리는게 있습니다.
:
:
: procedure TForm1.VSTInitNode(Sender: TBaseVirtualTree; ParentNode,
:   Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
: Var
:   Level: Integer;
: begin
:   Level := VST.GetNodeLevel(Node);
:   if Level = 0 then
:     Node.CheckType:=ctCheckBox;
:  
:   if Level = 2 then
:     Node.CheckType:=ctRadioButton;
:  
:   if Level = 1 then
:   begin
:     Node.CheckType:=ctTriStateCheckBox;
:     Node.CheckState := csCheckedNormal;
:   end;
:  
:   if Level = 3 then
:     Node.CheckType:=ctButton;
: end;
: 

:
: http://wiki.freepascal.org/VirtualTreeview_Example_for_Lazarus
:
: 참고하셔요~
:

+ -

관련 글 리스트
119 [재질문][답변] Tree 콘트롤에서 Checked Box MarunGuy 2829 2013/06/11
121     Re:[재질문][답변] Tree 콘트롤에서 Checked Box 김도완 2893 2013/06/17
122         Re:Re:[재질문][답변] Tree 콘트롤에서 Checked Box MarunGuy 4943 2013/06/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.