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-->
우선 코드는 아래부분처럼 변경 하시면 됩니다.
<!--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 로 들어가는거죠
이해가 되셨는지 모르겠네요... ^^ 즐프하세요.