我想把原来写的程序中的函数都改成封装在dll中,但是调用总是出问题,
如:加载数据库中的记录,我用的是Treeview,接点Data记录数据库记录,
但是问题是如果不用Tree.Item.Clear;树无法刷新,如果用的话,
那么第二次调用的时候总是出问题,原程序刷新多少次都没有问题,请各位高人给点意见。我把我做的东西上传,各位帮忙看看
如:加载数据库中的记录,我用的是Treeview,接点Data记录数据库记录,
但是问题是如果不用Tree.Item.Clear;树无法刷新,如果用的话,
那么第二次调用的时候总是出问题,原程序刷新多少次都没有问题,请各位高人给点意见。我把我做的东西上传,各位帮忙看看
dll文件的数据库连接没处理好``就容易出问题的`
Var
Query:TADOQuery;
P:MyData;
Node:TTreeNode;
begin
with TADOQuery.Create(Nil) do
begin
Try
Connection :=cnt;
case Akind of
0:Sql.Text:= 'Select * from Item where parentID= ' ' '+trim(ParentID)+ ' ' ' and Kind= '+inttostr(Kind)+ ' ';
1:Sql.Text:= 'Select * from PItem where parentID= ' ' '+trim(ParentID)+ ' ' ' and Kind= '+inttostr(Kind)+ ' ';
end;
Open; if RecordCount >0 then
begin
First;
while not Eof do
begin
Node:=Tree.Items.AddChild(root,trim(FieldByName( 'Item ').AsString)+ '( '+trim(FieldByName( 'ItemID ').AsString)+ ') '); New(P);
P.Kind:=FieldByName( 'Kind ').AsInteger;
P.ParentID:=trim(FieldByName( 'ParentID ').AsString);
P.ItemID:=trim(FieldByName( 'ItemID ').AsString);
P.Item:=trim(FieldByName( 'Item ').AsString);
P.Notes:=trim(FieldByName( 'Notes ').AsString); Node.Data:=P; GetSubIItem(Tree,Node,P.ItemID,P.Kind,AKind,cnt);//递归查找下级子结点记录 Next;
end;
end; Finally
Free;
End;
end;
end;
procedure CrtITree(Tree:TTreeView;cnt:TADOConnection);stdcall;
var
i:integer;
root,Node0,Node1,Node2:TTreeNode;
P:MyData;
begin
Tree.Items.BeginUpdate;
root:=Tree.Items.AddChild(nil, '材料核算项目 ');
Node0:=Tree.Items.AddChild(root, '0.工程项目类 ');
Node1:=Tree.Items.AddChild(root, '1.机械类 ');
Node2:=Tree.Items.AddChild(root, '2.其它 '); New(p);
p.ParentID:= ' ';
p.ItemID:= ' ';
p.Item:= ' ';
p.Notes:= ' ';
p.Kind:=-1; root.Data:=p;
Node0.Data:=p;
Node1.Data:=p;
Node2.Data:=p;
for i:=0 to 2 do
begin
Case i of
0:GetSubIItem(Tree,Node0, ' ',i,0,cnt);
1:GetSubIItem(Tree,Node1, ' ',i,0,cnt);
2:GetSubIItem(Tree,Node2, ' ',i,0,cnt);
end;
end; Tree.Items.EndUpdate;
end; 程序调用
Tree.Items.clear;
CrtITree(Tree,cnt);这样的话程序就会出错
MyData=^TMyData;//材料核算项目数据记录
TMyData=Record
Kind:Integer;
ParentID:String;
ItemID:String;
Item:String;
Notes:String;
end;procedure GetSubItem(Tree:TTreeView;root:TTreeNode;ParentID:String;Kind,AKind:integer;cnt:TADOConnection);stdcall;
Var
Query:TADOQuery;
P:MyData;
Node:TTreeNode;
begin
with TADOQuery.Create(Nil) do
begin
Try
Connection :=cnt;
case Akind of
0:Sql.Text:='Select * from Item where parentID='''+trim(ParentID)+''' and Kind='+inttostr(Kind)+'';
1:Sql.Text:='Select * from PItem where parentID='''+trim(ParentID)+''' and Kind='+inttostr(Kind)+'';
end;
Open; if RecordCount>0 then
begin
First;
while not Eof do
begin
Node:=Tree.Items.AddChild(root,trim(FieldByName('Item').AsString)+'('+trim(FieldByName('ItemID').AsString)+')'); New(P);//分配内存
P.Kind:=FieldByName('Kind').AsInteger;
P.ParentID:=trim(FieldByName('ParentID').AsString);
P.ItemID:=trim(FieldByName('ItemID').AsString);
P.Item:=trim(FieldByName('Item').AsString);
P.Notes:=trim(FieldByName('Notes').AsString); Node.Data:=P; // 记录结点信息
GetSubItem(Tree,Node,P.ItemID,P.Kind,AKind,cnt);//递归查找下级子结点记录 Next;
end;
end; Finally
Free;
End;
end;
end;//加载材料核算项目
procedure CrtITree(Tree:TTreeView;cnt:TADOConnection);stdcall;
var
i:integer;
root,Node0,Node1,Node2:TTreeNode;
P:MyData;
begin
Tree.Items.BeginUpdate;
root:=Tree.Items.AddChild(nil,'材料核算项目');
Node0:=Tree.Items.AddChild(root,'0.工程项目类');
Node1:=Tree.Items.AddChild(root,'1.机械类');
Node2:=Tree.Items.AddChild(root,'2.其它'); New(p);
p.ParentID:='';
p.ItemID:='';
p.Item:='';
p.Notes:='';
p.Kind:=-1; root.Data:=p;
Node0.Data:=p;
Node1.Data:=p;
Node2.Data:=p;
for i:=0 to 2 do
begin
Case i of
0:GetSubItem(Tree,Node0,'',i,0,cnt);
1:GetSubItem(Tree,Node1,'',i,0,cnt);
2:GetSubItem(Tree,Node2,'',i,0,cnt);
end;
end; Tree.Items.EndUpdate;
end;//加载工程成本核算项目
procedure CrtCTree(Tree:TTreeView;cnt:TADOConnection);stdcall;
var
i:integer;
root,Node0,Node1,Node2,Node3,Node4,Node5,Node6,Node7:TTreeNode;
P:MyData;
begin
Tree.Items.BeginUpdate;
root:=Tree.Items.AddChild(nil,'工程成本核算项目'); Node0:=Tree.Items.AddChild(root,'0.路基类');
Node1:=Tree.Items.AddChild(root,'1.路面类');
Node2:=Tree.Items.AddChild(root,'2.桥梁类');
Node3:=Tree.Items.AddChild(root,'3.排水类');
Node4:=Tree.Items.AddChild(root,'4.防护类');
Node5:=Tree.Items.AddChild(root,'5.涵洞、通道类');
Node6:=Tree.Items.AddChild(root,'6.隧道类');
Node7:=Tree.Items.AddChild(root,'7.杂事类'); New(p);
p.ParentID:='';
p.ItemID:='';
p.Item:='';
p.Notes:='';
p.Kind:=-1;
root.Data:=p;
Node0.Data:=p;
Node1.Data:=p;
Node2.Data:=p;
Node3.Data:=p;
Node4.Data:=p;
Node5.Data:=p;
Node6.Data:=p;
Node7.Data:=p; for i:=0 to 7 do
begin
Case i of
0:GetSubItem(Tree,Node0,'',i,1,cnt);
1:GetSubItem(Tree,Node1,'',i,1,cnt);
2:GetSubItem(Tree,Node2,'',i,1,cnt);
3:GetSubItem(Tree,Node3,'',i,1,cnt);
4:GetSubItem(Tree,Node4,'',i,1,cnt);
5:GetSubItem(Tree,Node5,'',i,1,cnt);
6:GetSubItem(Tree,Node6,'',i,1,cnt);
7:GetSubItem(Tree,Node7,'',i,1,cnt);
end;
end; Tree.Items.EndUpdate;
end; exports
ExctSQL,OpenSQL,MessageText,CntDataBase,AddListCnt,AddComboCnt,
GetSubItem,CrtITree,CrtCTree,ClrGrid;
ActiveX;
CoInitialize(Nil);
在你的代码首和尾加上这个代码
CoUninitialize;DLL初始化对象试试。。
treeview的data在clear的时候,最好释放new(p)的内存
在treeview的OnDeletion 事件里面加入
Dispose(Node.Data);
你试验下吧。你帖的代码没法看。
1、建立一个dll,加载你的treeview数据,这个数据最好不好不要和数据库相连,最好自己写个函数写入一些测试数据
2、建立一个form程序,读取dll,看是否还存在同样的问题。如果存在,再找原因,不存在,则是其他的问题。
像你这样问问题的。动不动发一大段与问题无关的代码或者一个别人根本就无法调试的源码,别人是很难帮上你忙的。
你说呢?
采用你的建议,重新建立一个程序,并调用一个新的dll,
里面只有一个最简单的过程
procedure CTree(Tree:TTreeview);stdcall;
var
i:integer;
root:TTreeNode;
begin
root:=Tree.Items.AddChild(nil,'根结点');
for i:=0 to 10 do
Tree.Items.AddChild(root,inttostr(i));
end;主程序调用:
procedure CTree(Tree:TTreeview);stdcall;external 'a.dll';点击事件:
begin
Tree.Items.Clear;
CTree(Tree);
end;提示错误:Invalid pointer operation去掉Tree.Items.Clear;
当时点击多少次都不会提示:
但是,关闭程序后,提示的错误一致:Invalid pointer operation
毕业两年以上
两年以上 delphi 工作经验
熟悉 sql server
sql 编写能力突出者优先联系方式:
深圳中普达科技有限公司
0755 86170837
请将简历发至 [email protected]