我想把原来写的程序中的函数都改成封装在dll中,但是调用总是出问题,
如:加载数据库中的记录,我用的是Treeview,接点Data记录数据库记录,
但是问题是如果不用Tree.Item.Clear;树无法刷新,如果用的话,
那么第二次调用的时候总是出问题,原程序刷新多少次都没有问题,请各位高人给点意见。我把我做的东西上传,各位帮忙看看

解决方案 »

  1.   

    另外其它程序的话如果刷新多次,如Anygrid.clear等,也会出现类似的问题
      

  2.   

    你的树刷新是根据数据库刷的??```
    dll文件的数据库连接没处理好``就容易出问题的`
      

  3.   

    procedure   GetSubIItem(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;                           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);这样的话程序就会出错
      

  4.   

    Type
     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;
      

  5.   

    Uses
      ActiveX; 
     CoInitialize(Nil);
      在你的代码首和尾加上这个代码
      CoUninitialize;DLL初始化对象试试。。
      

  6.   

    你的问题我没有怎么详细的看,不知道是不是内存问题引起的
    treeview的data在clear的时候,最好释放new(p)的内存
    在treeview的OnDeletion 事件里面加入  
    Dispose(Node.Data);
    你试验下吧。你帖的代码没法看。
      

  7.   

    那是复制的时候但引号变成了' 
      

  8.   

    楼主,建议你把你的问题范围最小化,即:
    1、建立一个dll,加载你的treeview数据,这个数据最好不好不要和数据库相连,最好自己写个函数写入一些测试数据
    2、建立一个form程序,读取dll,看是否还存在同样的问题。如果存在,再找原因,不存在,则是其他的问题。
    像你这样问问题的。动不动发一大段与问题无关的代码或者一个别人根本就无法调试的源码,别人是很难帮上你忙的。
    你说呢?
      

  9.   

    flashtong :
    采用你的建议,重新建立一个程序,并调用一个新的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
      

  10.   

    招聘 delphi 程序员(人数:2)
     毕业两年以上
     两年以上 delphi 工作经验
     熟悉 sql server 
     sql 编写能力突出者优先联系方式:
     深圳中普达科技有限公司
     0755 86170837
     请将简历发至 [email protected]