CHANG888:谢谢你的源码!真的很实用. 我正好要建一个产品类型管理的树结构,只是我把的你源码下载后ACCESS的ADO正常运行. 可我用INTERBASE数据库无ODBC,无法用ADO建立连接,现选用BDE的QUERY控件及DATABASE控件管理数据表,我把你的源码修改后,正常编译,按"读取"出现".. class EDBengineerror with message 'general sql error unexpected end of command'process stop,... 帮我看看改后的源码,哪里出错啦,谢谢!
var new_tree: Tnew_tree; str,tempstr,tempname:string;
implementation
{$R *.dfm} Function Tnew_tree.AddNode(TreeView:TTreeview;Node:TTreeNode;ADOQ:TQuery):TTreeNode; var Node1:TTreeNode; s:PString; begin Node1:=TreeView.Items.AddChild(Node,ADOQ.FieldByName('name').Text+'('+ ADOQ.FieldByName('id').Text+')'); New(s); s^:=ADOQ.FieldByName('id').Text; Node1.Data:=s; Result:=Node1; end;
Function Tnew_tree.SearchNode(TreeView:TTreeView;Txts:String):TTreeNode; var i:integer; s:PString; begin Result:=nil; For i:=0 To TreeView.Items.Count-1 Do begin s:=TreeView.Items[i].Data; If s^=Txts Then begin Result:=TreeView.Items[i]; Exit; end; end; end;
Procedure Tnew_tree.ShowTree(TreeView:TTreeView;ADOQ:TQuery); var i,Rec_Num:integer; Node1,Node2:TTreeNode; begin TreeView.Items.Clear; TreeView.Items.BeginUpdate; Node1:=TreeView.Items.GetFirstNode; Exec_SQL(ADOQ,'Select * From product_type Order By pid,id',True); If ADOQ.RecordCount>0 Then Begin Rec_Num:= ADOQ.RecordCount; For i:=0 To Rec_Num-1 Do begin If ADOQ.FieldByName('pid').Text='0' Then Node2:=AddNode(TreeView,Node1,ADOQ) Else begin Node2:=SearchNode(TreeView,ADOQ.FieldByName('pid').Text); If Node2<>nil Then AddNode(TreeView,Node2,ADOQ); end; ADOQ.Next; end; End; TreeView.Items.EndUpdate; end;
procedure Tnew_tree.BtnClearClick(Sender: TObject); begin Init(); Clear_Edt; end;
procedure Tnew_tree.EdtIdExit(Sender: TObject); Function Rec:Boolean; Var ADOQ:TQuery; begin ADOQ:=TQuery.Create(self); With ADOQ Do begin DATABASENAME:=GFTConnection1.databasename; SQL.Text:='select * from product_type where id='''+EdtId.Text+''''; Open; Result:=RecordCount>0; Free; end;
end; begin If (Rec) Then begin Application.MessageBox('记录已存在请重新输入?', '提示', MB_OK); EdtId.SelectAll; end; end;
procedure Tnew_tree.EdtNameExit(Sender: TObject); begin If (Trim(EdtName.Text)='')And(Trim(Edtid.Text)<>'') then begin Application.MessageBox('名称不能为空白!','警告',48); EdtName.SetFocus; end; end;
procedure Tnew_tree.BtnAddClick(Sender: TObject); begin BtnEnabled(False); str:='增加'; end;
procedure Tnew_tree.BtnEditClick(Sender: TObject); var Sql_Txt:String; begin BtnEnabled(False); str:='修改'; Sql_Txt:='select * from product_type where id='''+tempstr+''''; Exec_SQL(ADOQ_Tree,Sql_Txt,True); Edtid.Text:=ADOQ_Tree.FieldValues['id']; EdtName.Text:=ADOQ_Tree.FieldValues['name']; EdtFid.Text:=ADOQ_Tree.FieldValues['pid']; end;
procedure Tnew_tree.BtnSaveClick(Sender: TObject); var Sql_Txt:string; begin If EdtFid.Text='' then EdtFid.Text:='0'; If str='增加' Then Try Sql_Txt:='insert into product_type values('''+Edtid.Text +''','''+Edtname.Text+''','''+EdtFid.Text+''')'; Exec_SQL(ADOQ_Tree,Sql_Txt,False); Except Application.MessageBox('记录增加失败!!!','提示信息',0); end; If str='修改' Then Try Sql_Txt:='update product_type set id='''+Edtid.Text +''',name='''+Edtname.Text+''',pid='''+EdtFid.Text +''' Where id='''+tempstr+''''; Exec_SQL(ADOQ_Tree,Sql_Txt,False); Except Application.MessageBox('记录修改失败!!!','提示信息',0); end; Button3Click(nil); end;
procedure Tnew_tree.TreeView1Change(Sender: TObject; Node: TTreeNode); var Pid:PString; Sql_Txt:String; begin Pid:=Node.Data; Sql_Txt:= 'select * from product_type where id='''+Pid^+''''; Exec_SQL(ADOQ_Tree,Sql_Txt,True); tempstr:=ADOQ_Tree.FieldByName('id').Text; tempname:=ADOQ_Tree.FieldByName('name').Text; end;
procedure Tnew_tree.BtnDeleteClick(Sender: TObject); var Sql_Txt:String; begin If MessageDlg('你确认删除该记录吗?',mtWarning,[mbYES,mbNO],0)=mrYES then try Sql_Txt:= 'delete from product_type where id='''+tempstr+''''; Exec_SQL(ADOQ_Tree,Sql_Txt,False); Init(); Except Application.MessageBox('删除失败!!!','提示',0); end; end;
procedure Tnew_tree.TreeView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var TargetNode,SourceNode:TTreeNode; begin TargetNode:=TreeView1.GetNodeAt(X,Y); If (Source=Sender) and (TargetNode<>nil) then begin Accept:=True; SourceNode:=TreeView1.Selected; while (TargetNode.Parent<>nil) and (TargetNode <> SourceNode) do TargetNode:=TargetNode.Parent; if (TargetNode = SourceNode) then Accept:=False; end else Accept:=False; end;
procedure Tnew_tree.TreeView1DragDrop(Sender, Source: TObject; X, Y: Integer); var targetnode,sourcenode:TTreenode; Pstr:Pstring; Sql_Txt:String; begin TargetNode:=TreeView1.GetNodeAt(x,y); SourceNode:=TreeView1.Selected; Pstr:=TargetNode.Data; Sql_Txt:= 'update product_type set pid='''+Pstr^+''' where id='''+tempstr+''''; Exec_SQL(ADOQ_Tree,Sql_Txt,False); TreeView1.Items.BeginUpdate; try CopyNodeUnder(TreeView1,SourceNode,TargetNode); TreeView1.Selected:=TargetNode; finally TreeView1.Items.EndUpdate; end; end;
procedure Tnew_tree.CopyNodeUnder(TreeView:TTreeView;SourceNode,TargetNode:TtreeNode); var Node:TTreeNode; i:integer; begin Node:=TreeView.Items.AddChildFirst(TargetNode,''); Node.Assign(SourceNode); for i:=SourceNode.Count-1 downto 0 do begin CopyNodeUnder(Treeview,SourceNode.Item[i],Node); end; TreeView.Items.Delete(SourceNode); end;
procedure Tnew_tree.Init; begin ShowTree(TreeView1,ADOQ_Tree); end;
procedure Tnew_tree.Button3Click(Sender: TObject); begin Init(); Clear_Edt; end;
procedure Tnew_tree.BtnExitClick(Sender: TObject); begin Close; end;
procedure Tnew_tree.Clear_Edt; begin EdtId.Text:=''; EdtName.Text:=''; EdtFid.Text:=''; str:=''; tempstr:=''; BtnEnabled(); end;
Function Tnew_tree.Exec_SQL(Que:TQuery;Text:String;Flag:Boolean=True):Boolean; Begin With Que Do begin Close; Sql.Clear; Sql.Add(Text); If Flag Then Open Else ExecSQL; end; End; end.