TreeView구성하는중에 구현하기 힘들어서 조언듣고자합니다.
하고자하는것은 DB상에... 아래와 같이 등록되어있습니다. 이것을 TreeView로표현...
Level MenuName
1 코드관리
2 제품관리
3 업무조회
11 기준코드
111 업무분류
112 업태분류
12 표준코드
13 사용자코드
21 식품
22 의류
23 자동차
231 경차
232 소형차
31 재고현황조회
32 반품목록
---------------------------------
아래와 같이 DB를 로드하여 트리를 만들고자하는것입니다.
몇번에 걸쳐서 해봤는데....소스만 조잡해지고 완벽한 알고리즘이 안되더라구여!
어떻게 하면 될까여! 좋은 방법이 있을까여? 지도편달 부탁드립니다. ^^;
즐건 하루 보네세요!
-----------------------------------
+코드관리
+ 기준코드
- 업무분류
- 업태분류
- 표준코드
- 사용자코드
+제품관리
- 식품
- 의류
+ 자동차
- 경차
- 소형차
+업무조회
- 제고현황조회
- 반품목록
도움이 되면 좋겠네요...
procedure TForm.sbTreeClick(Sender: TObject);
var SqlText, s, sName: String; i, j: integer;
A, B: array[0..2] of string;
xTreeNode : array[0..2] of TTreeNode;
procedure TrimTreeView(TreeView: TTreeView);
var i, j: integer;
begin
with TreeView do
for i := 3 downto 0 do
begin
for j := Items.Count - 1 downto 0 do
with Items[j] do
if (Level = i) and (Text = '')
and (Count = 0) then Delete;
end;
end;
begin
with Query1 do
begin
close;
Sql.Text := 'SELECT DISTINCT Level, MenuName' + cr
+ ' FROM TABLENAME ORDER BY Level';
open;
TreeView.Items.Clear;
first;
for i := 0 to 2 do
begin
A[i] := '--dxt1';
xTreeNode[i] := nil;
end;
while not Eof do
begin
s := fieldbyname('Level').asstring;
sName := fieldbyname('MenuName').asstring
B[0] := Copy(s, 1, 1);
B[1] := Copy(s, 2, 1);
B[2] := Copy(s, 3, 1);
for i := 0 to 2 do
if (A[i] <> B[i]) then
begin
A[i] := B[i];
for j := i + 1 to 2 do A[j] := '--dxt1';
if i = 0 then
xTreeNode[i] := TreeView.Items.Add(nil, sName)
else xTreeNode[i] := TreeView.Items.AddChild(xTreeNode[i-1], sName);
end;
next;
end;
close;
TrimTreeView(TreeView);
TreeView.Selected := TreeView.TopItem;
end;
end;