如何使用TREEVIEW实现? (50分)

  • 主题发起人 主题发起人 goodbegin
  • 开始时间 开始时间
G

goodbegin

Unregistered / Unconfirmed
GUEST, unregistred user!
例如ADOQUERY的有记录集
01 车辆
0101 小汽车
0102 大卡车
02 电脑
0201 台式机
020101 品牌机
如何将记录集的内容写入TREEVIEW?
 
记录集?
如果将保存在TXT文件中的树调入,
可使用loadfromfile的方法。
 
hehe... 我也想找简单的方法, 我的方法是作一个结构, 自己装载进去的。
 
tree.items.beginuodate;
node01:=tree.items.add(N0)...
node0101:=tree.items.add(node01...
tree.items.enduodate;

 
就把数据库的内容一项一项的加入就可以了
1.获得数据
2.向树中添加数据
以上两种的方法在论坛上都可以搜得到
 
你是想按级别层层排列吧?
 
对,我想形成树形结构,01和02是第一层,0101为第二层,010101为第三层。
 
这是我写的代码,算法有点笨,不过赶时间就还可以啦[:D]
假设有一记录地区的数据库Area,
字段AreaID记录01,0101,0102……之类的代码,
字段Area记录地区的名称
定义一结构体:
代码:
type
  TAreaID = record
    ID: String[20];
    Len: Integer;
  end;
  PAreaID = ^TAreaID;
TreeView的Data指针就指向这个结构
代码:
    with TQuery.Create(Self) do
    begin
        DatabaseName := 'BDETable';
        SQL.Add('select * from Area');
        SQL.Add('where LEN(AreaID) = :AreaLen');
        SQL.Add('order by AreaID');
        ParamByName('AreaLen').AsInteger := 2;
        Open();
        while not(Eof) do
        begin
            tmpNode := ZoneTree.Items.Add(nil, FieldByName('Area').AsString);
            new(AreaData);
            AreaData.ID := FieldByName('AreaID').AsString;
            AreaData.Len := 2;
            tmpNode.Data := AreaData;
            Next();
        end;
        Close();
        for i := 2 to 5 do
        begin
            ParamByName('AreaLen').AsInteger := i * 2;
            Open();
            while not(Eof) do
            begin
                tmpNode := nil;
                for j := ZoneTree.Items.Count - 1 downto 0 do
                begin
                    AreaData := ZoneTree.Items[j].Data;
                    if Copy(FieldByName('AreaID').AsString, 1, AreaData.Len) = AreaData.ID then
                    begin
                        tmpNode := ZoneTree.Items[j];
                        Break;
                    end;
                end;
                tmpNode := ZoneTree.Items.AddChild(tmpNode, FieldByName('Area').AsString);
                new(AreaData);
                AreaData.ID := FieldByName('AreaID').AsString;
                AreaData.Len := i * 2;
                tmpNode.Data := AreaData;
                Next();
            end;
            Close();
        end;
        Free();
    end;
 
假设这是一个商品表的话,可以从商品编号上开始
思路可以是这样的,
选择判断商品编号的长度,如果长度为2的话,则为一级目录
长度为4的话,则为二经目录
否则的话,则为三级目录
这是我用PB写的一段代码,思路是一样的
ware_code=len(warecode)
if ware_code=2 then
//商品编码为两位长度,则为类别码,层次为根层次
ltvi_item.label = warename
ltvi_item.data = warecode
ltvi_item.Pictureindex = 1
ltvi_item.selectedpictureindex = 1
ltvi_item.children = true
ll_newitem = tv_dw.insertitemlast(0,ltvi_item)

fetch c1 into :warecode,:warename;
elseif ware_code=4 then
//商品编码为四位长度,则为类别+品牌码,层次为第一层次
ltvi_item.label = warename
ltvi_item.data = warecode
ltvi_item.Pictureindex = 2
ltvi_item.selectedpictureindex = 2
ltvi_item.children = true
ll_tvi = tv_dw.insertitemlast(ll_newitem,ltvi_item)
fetch c1 into :warecode,:warename;
else
ltvi_item.label = warename
ltvi_item.data = warecode
ltvi_item.Pictureindex = 3
ltvi_item.selectedpictureindex = 3
ltvi_item.children = true
ll_tv2 = tv_dw.insertitemlast(ll_tvi,ltvi_item)
fetch c1 into :warecode,:warename;
end if
 
后退
顶部