Q&A

  • Virtual TreeVew 에서 루핑돌면서 내용읽으려면 어케해요?
Virtual TreeView 라는 컴포넌트를 쓰려고 사용법을 데모소스 보고 이것저것 해보는데요

GetNode 라는 함수를 쓰는데 에러가 나네요...ㅠㅠ

제가 하려는 것은 VirtualTree 에 넣은 것들을 루핑돌면서 읽으려는 것이거든요


//============================================
// - 루핑도는 부분 (에러가 나는 부분입니다.)
// - VTBasic 이라는 데모소스를 홈페이지에서 다운받아서 보고있음
// - 그중에서 3번째 예제인 CheckListBox 처럼 쓰기예제를 참조해서 작성했음
// - 제작사에서 배포한 데모에서도 에러남
// - 루핑돌면서 VT(VirtualTree) 의 내용을 어떻게 읽는지를 알려고 한것이기
//   때문에 그냥 CheckListBox 를 쓰라는 답변은 제발...ㅠㅠ
//   (궁극적으로는 Tree 형태의 DB데이터를 쿼리해서 VT에 표시하고
//    그것을 출력할때는 쿼리내용을 뒤지지 않고 VT에 넣어둔 데이터를 읽어서
//    출력을 하려고 하거든요...;)
//============================================

//=============================================
// 에러메세지는
// 'Node must not be the Hidden root node' 인데요...
// 그냥 가장 원초적인 VT 코드이고 화면에도 다 보이는데
// 뭐가 Hidden 이라는 건지 당췌~~ VT 속성도 그냥 폼위에 올려논 그대로인데...ㅠㅠ
//=============================================

<!--CodeS-->
procedure TForm1.Button1Click(Sender: TObject);
var
   node  : PVirtualNode;
   tmpstr :String;
begin
   tmpstr := '';
   node  := VT.RootNode;
   while Assigned(Node) do
   begin
      tmpstr := tmpstr + VT.Text[Node, 0];

      node := VT.GetNext(Node);   // 이부분이 에러가 나요

   end;

   ShowMessage(tmpstr);

end;
<!--CodeE-->


//============================================================
// 아래는 해당폼의 전체 소스 입니다.
//============================================================

<!--CodeS-->

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, StdCtrls, ExtCtrls, ImgList, Buttons;

type
  TForm1 = class(TForm)
    VT: TVirtualStringTree;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure VTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; TextType: TVSTTextType;
      var CellText: WideString);
    procedure Button1Click(Sender: TObject);
    procedure VTGetNodeDataSize(Sender: TBaseVirtualTree;
      var NodeDataSize: Integer);
  private
    { Private declarations }
    FCaptions   : TStringList;

  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   FCaptions   := TStringList.Create;
   FCaptions.Text := 'VT로 TreeView'         +#13#10+
                                'VT로 CheckListBox'  +#13#10+
                                'VT로 ListView'          +#13#10+
                                'VT로 TreeListView'   +#13#10+
                                'VT에 다른 컴포 표시하기';


   // 전체 루트노드 수를 지정함
   VT.RootNodeCount := FCaptions.Count;

end;

procedure TForm1.VTGetNodeDataSize(Sender: TBaseVirtualTree;
  var NodeDataSize: Integer);
begin
      NodeDataSize := 0;                                          
end;


procedure TForm1.VTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
  Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
begin
   // 각각의 노드에 보여줄 텍스트를 지정한다.
   Celltext := FCaptions[Node.Index];

end;


procedure TForm1.Button1Click(Sender: TObject);
var
   node  : PVirtualNode;
   tmpstr :String;
begin
   tmpstr := '';
   node  := VT.RootNode;
   while Assigned(Node) do
   begin
      tmpstr := tmpstr + VT.Text[Node, 0];
      node := VT.GetNext(Node);

   end;
   ShowMessage(tmpstr);

end;


end.

<!--CodeE-->
2  COMMENTS
  • Profile
    『Mute™』 2005.10.13 19:32
    저도 잘모르지만 아는데로 답변드리겠습니다.

    우선 코드는 아래부분처럼 변경 하시면 됩니다.
    <!--CodeS-->
    procedure TForm1.Button1Click(Sender: TObject);
    var
       node  : PVirtualNode;
       tmpstr :String;
    begin
       tmpstr := '';
       node  := VT.GetFirst;         // <------- VT.RootNode를 코드처럼 수정
       while Assigned(Node) do
       begin
          tmpstr := tmpstr + VT.Text[Node, 0];
          node := VT.GetNext(Node);  
       end;
       ShowMessage(tmpstr);
    end;
    <!--CodeE-->


    RootNode 는 말 그대로 모든것들의 보이지 않는 최상위 Node를 말합니다.

    RootNodeCount를 늘리는것 때문에 약간 혼동이 올 수 있는데요..
    RootNodeCount는 아마 편의상 눈에 보이는 RootNode를 말하는것 같구요
    카운트를 늘리면 실제로는 RootNode(보이지않는 최상위)아래 Childe 로 들어가는거죠

    이해가 되셨는지 모르겠네요... ^^ 즐프하세요.





  • Profile
    델초 2005.10.14 07:36
    .