以下是一个TREEVIEW是示例用法。是运行正常的,但它的原代码我看不明白。
它利用一个ACCESS件:TEST.mdb中表TB1,它结构是:AUTOID(自动编号)   CNAME (文本)   FATHERID(数字)它下载的地址我不记得了,如果有网友想要,就留信息给我,我E一份给你以下是它的全部代码,*号之间的是我的问题。请大家多多教导unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, ComCtrls;type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
    procedure AddClass(AId:integer;FatherNode:TTreeNode);//添加分类过程
*****************
AID:INTEGER是我可以知道AID是数值类型了,这一点我明白,但不明白TTREENODE是什么类型,是什么来的?是任意取的名字,还是系统定的?FATHERNODE取值有什么要求呢?
******************************    procedure AddDataToDB(CurrNode,FatherNode:TTreeNode);//添加实际数据到数据库
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.AddClass(AId: integer;FatherNode:TTreeNode);
var
    QryTmp:TADOQuery;
    myNode:TTreeNode;
    myLabel:TLabel;
begin
    QryTmp:=TADOQuery.Create(self);
    QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
    QryTmp.SQL.Add('select * from tb1');
    QryTmp.SQL.Add('where FatherId='+inttostr(AId));
*************************************
上面的两个SQL语句为什么不加在一起呢?
        比如变成:
         QryTmp.SQL.Add('select * from tb1 where FatherId=INTTOSTR(AID)'); 
它分开两个第二个SQL语句会不会把第一个删除了? 
*******************************    
QryTmp.Open;
    while not QryTmp.Eof do
    begin
        myNode:=Treeview1.Items.AddChild(FatherNode,QryTmp.fieldbyname('CName').AsString);        //创建标签,caption存放各分支的AutoId表识
**********为什么要保存AUTOID表识呢?有什么意义?***************
        myLabel:=TLabel.Create(self);
        myLabel.Visible:=false;
        myLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
        myNode.Data:=myLabel;
*******这个名是什么意思,DATA是什么来的。为什么不用CAPTION属性***        AddClass(QryTmp.fieldbyname('AutoId').AsInteger,myNode); //递归调用过程
**************
一个过程又可以调用自已的吗?过程都没有产生就可以调用吗?这方面的知道在哪时可以清楚知道?对我来说真的很难懂
************
        QryTmp.Next;
    end;
    QryTmp.Free;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
    AddClass(0,nil);
******
nil是什么来是,表示为空吗?空了以后就怎样,有什么后果?怎解可以这样表示的?
*************
end;procedure TForm1.Button1Click(Sender: TObject);
var
    strName:string;
    myNode:TTreeNode;
begin
    strName:=inputbox('新增','请输入分类名称:  ','');
    strName:=trim(strName);
    if strName='' then
        exit;
    myNode:=treeview1.Items.Add(treeview1.Selected,strName);
**********
上面的一句做了什么?add明明是增为TREEVIEW1增加条目的方法来的,怎可以增加它选择的呢?可以选择的就表是已经存在了,再增加不是重复了吗?
***********
    if assigned(treeview1.Selected) then
        AddDataToDB(myNode,treeview1.Selected.Parent)
    else
        AddDataToDB(myNode,nil);
    myNode.selected:=true;
end;procedure TForm1.Button2Click(Sender: TObject);
var
    strName:string;
    myNode:TTreeNode;
begin
    strName:=inputbox('新增','请输入分类名称:  ','');
    strName:=trim(strName);
    if strName='' then
        exit;
    myNode:=treeview1.Items.AddChild(treeview1.Selected,strName);
    AddDataToDB(myNode,treeview1.Selected);
    myNode.selected:=true;
end;procedure TForm1.AddDataToDB(CurrNode,FatherNode: TTreeNode);
var
    myLabel:TLabel;
    QryTmp:TADOQuery;
    AId:integer;
begin
    if not assigned(FatherNode) then
        AId:=0
    else if not assigned(FatherNode.Data) then
        AId:=0
    else
        AId:=strtoint(TLabel(FatherNode.Data).caption);
    QryTmp:=TADOQuery.Create(self);
    QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
    QryTmp.SQL.Add('select * from tb1');
    QryTmp.SQL.Add('where FatherId='+inttostr(AId));
    QryTmp.Open;
    QryTmp.Append;
    QryTmp['FatherId']:=AId;
    QryTmp['CName']:=CurrNode.Text;
    QryTmp.Post;    //创建记录currNode的AutoId表识标
    myLabel:=TLabel.Create(self);
    myLabel.Visible:=False;
    MyLabel.Caption:=QryTmp.fieldbyname('AutoId').AsString;
    CurrNode.Data:=myLabel;
    
    QryTmp.Free;
end;procedure TForm1.Button3Click(Sender: TObject);
var
    QryTmp:TADOQuery;
begin
    if not assigned(treeview1.Selected) then
        exit;
    if application.MessageBox('是否删除分类及下级分类?','提示',mb_yesno+mb_iconquestion)=idno then
        exit;
    //删除下级别分类
    QryTmp:=TADOQuery.Create(self);
    QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
    QryTmp.SQL.Add('delete * from tb1');
    QryTmp.SQL.Add('where FatherId='+TLabel(Treeview1.Selected.data).Caption);
    QryTmp.ExecSQL;
    QryTmp.SQL.Clear;
    QryTmp.SQL.Add('delete * from tb1');
    QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
    QryTmp.ExecSQL;
    Treeview1.Selected.Delete;
end;procedure TForm1.Button4Click(Sender: TObject);
var
    QryTmp:TADOQuery;
    strName:string;
begin
    if not assigned(treeview1.Selected) then
        exit;
    strName:=inputbox('更改','请输入新的名称: ','');
    strName:=trim(strName);
    if strName='' then
        exit;
    //删除下级别分类
    QryTmp:=TADOQuery.Create(self);
    QryTmp.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+extractfilepath(application.ExeName)+'test.mdb;Persist Security Info=False';
    QryTmp.SQL.Add('update tb1 set CName='+''''+strName+'''');
    QryTmp.SQL.Add('where AutoId='+TLabel(Treeview1.Selected.data).Caption);
    QryTmp.ExecSQL;
    Treeview1.Selected.Text:=strName;
end;end.
//autoid cname fatherid

解决方案 »

  1.   

    兄弟你这个问题可够长的了.
    ONE: TREENODE是一个类.见帮助:
    TTreeNode describes an individual node in a tree view control.UnitComCtrlsDescriptionEach node in a tree view control consists of a label and an optional bitmapped image. Each item can be the parent of a list of subitems. By clicking an item, the user can expand or collapse the associated list of subitems. TWO:ADD不会把上一个SQL语句删除的,类似于:STR1+STR2THREE: myNode.Data:=myLabel; 是把TREENODE的数据指针赋给了MYLABELFOUR:过程当然可以调用,上面已经有实现过程代码了.FIVE:增加一个子结点,参数使用SELECTED,就是在所选下面加个子结点.建议你看看帮助.
      

  2.   

    对类,对象的认识
    及sql语句与delphi语句的区别
      

  3.   

    能不能给VIEWTREE的方法,属性,过程来看看
      

  4.   

    *****************
    AID:INTEGER是我可以知道AID是数值类型了,这一点我明白,但不明白TTREENODE是什么类型,是什么来的?是任意取的名字,还是系统定的?FATHERNODE取值有什么要求呢?
    ******************************
    TTREENODE是TTreeView中的节点的类型啊.FATHERNODE是形参名称,随便取都可以。
    *************************************
    上面的两个SQL语句为什么不加在一起呢?
            比如变成:
             QryTmp.SQL.Add('select * from tb1 where FatherId=INTTOSTR(AID)'); 
    它分开两个第二个SQL语句会不会把第一个删除了? 
    *******************************    
    分不分开都是一样的,如果太长了的情况下,分开便于看清楚。一个过程又可以调用自已的吗?过程都没有产生就可以调用吗?这方面的知道在哪时可以清楚知道?对我来说真的很难懂
    ************
    一个过程调用自己是指“递归调用”.其它的自己看吧,
    太长了。