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