procedure TForm1.FormCreate(Sender: TObject);
var
    FatherNode:TTreeNode;
begin
    try
      FatherNode:=TTreeNode.Create(nil); //创建根结点对象
       FatherNode:= Treeview1.Items.Add(nil,'全部类型');
      Addclass(FatherNode); //加入子节点
    finally
      FatherNode.Free;
    end;
添加子节点到treeview中procedure TForm1.AddClass(FatherNode:TTreeNode);
var
    QryTmp:TADOQuery;
    myNode:TTreeNode;
    myLabel:TLabel;
begin
    QryTmp:=TADOQuery.Create(nil); //动态创建一个adoquery控件,执行查询操作
    QryTmp.ConnectionString:=datamodule1.ADOConnection1.ConnectionString;
    QryTmp.Close;
    QryTmp.SQL.Clear;
    QryTmp.SQL.Add('select * from material_type');
    QryTmp.Open;
    while not QryTmp.Eof do //如果查询根节点标记的数据库中有数据
    begin
        myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('type_name').AsString);
         myLabel:=TLabel.Create(nil);
        myLabel.Visible:=false;
        myLabel.Caption:=QryTmp.fieldbyname('type_id').AsString;
        myNode.Data:=myLabel;
        QryTmp.Next;
    end;
    
    QryTmp.Free;
    myLabel.Free;
end;
以上代码提示 变量myLable和FatherNode might not have been initialized..
什么问题呢??

解决方案 »

  1.   


    procedure TForm1.FormCreate(Sender: TObject);
    var
        FatherNode:TTreeNode;
    begin
        try
          FatherNode:=TTreeNode.Create(nil); //创建根结点对象
           FatherNode:= Treeview1.Items.Add(nil,'全部类型');
          Addclass(FatherNode); //加入子节点
        finally
          FatherNode.Free;
        end;你改成:
    procedure TForm1.FormCreate(Sender: TObject);
    var
        FatherNode:TTreeNode;
    begin
        try
           FatherNode:= Treeview1.Items.Add(nil,'全部类型');
          Addclass(FatherNode); //加入子节点
        finally
        end;procedure TForm1.AddClass(FatherNode:TTreeNode);
    var
        QryTmp:TADOQuery;
        myNode:TTreeNode;
        myLabel:TLabel;
    begin
        QryTmp:=TADOQuery.Create(nil); //动态创建一个adoquery控件,执行查询操作
        QryTmp.ConnectionString:=datamodule1.ADOConnection1.ConnectionString;
        QryTmp.Close;
        QryTmp.SQL.Clear;
        QryTmp.SQL.Add('select * from material_type');
        QryTmp.Open;
        while not QryTmp.Eof do //如果查询根节点标记的数据库中有数据
        begin
            myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('type_name').AsString);
             myLabel:=TLabel.Create(nil);
            myLabel.Visible:=false;
            myLabel.Caption:=QryTmp.fieldbyname('type_id').AsString;
            myNode.Data:=myLabel;
            QryTmp.Next;
        end;
        
        QryTmp.Free;
        myLabel.Free;
    end;
    你改成
    procedure TForm1.AddClass(FatherNode:TTreeNode);
    var
        QryTmp:TADOQuery;
        myNode:TTreeNode;
        myLabel:TLabel;
    begin
        QryTmp:=TADOQuery.Create(nil); //动态创建一个adoquery控件,执行查询操作
        QryTmp.ConnectionString:=datamodule1.ADOConnection1.ConnectionString;
        QryTmp.Close;
        QryTmp.SQL.Clear;
        QryTmp.SQL.Add('select * from material_type');
        QryTmp.Open;
        while not QryTmp.Eof do //如果查询根节点标记的数据库中有数据
        begin
            myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('type_name').AsString);
            myLabel:=TLabel.Create(nil);
            myLabel.Visible:=false;
            myLabel.Caption:=QryTmp.fieldbyname('type_id').AsString;
            myNode.Data:=myLabel;
            QryTmp.Next;
        end;
        
        QryTmp.Free;
        //myLabel.Free;
    end;你用在树节点的Data,你都不要释放他们,否则后面用的时候会出错的,你应该在删除树节点的在释放Data,删除树节点会触发事件:OnDeletion。
      

  2.   

    FatherNode:= Treeview1.Items.Add(nil,'全部类型');MyLabel的话因为Create放在while里面去了,你把它放在while前面就好