我在一dll中动态创建了一个TTreeView控件及一个TTreeNode控件,编译通过,但在使用时提示TTreeNode没有父类,请问各位该如何解决,具体编码如下:
function GetPredParse(Sentence1, ResSearch1: PChar): PChar;
var
  firststr, nextstr: string;
  att: Integer;
  str, temstr: string;
  tn: TTreeNode;
  tree: TTreeView;
  Sentence, ResSearch: string;
begin
  Result := PChar('');
  Sentence := StrPas(Sentence1);
  ResSearch := StrPas(ResSearch1);
  tree:=TTreeview.CreateParented(Application.Handle);
  tree := TTreeView.Create(Form1);
  
  str := GetPredicate(Sentence, ResSearch);
  if str <> '' then
    initializefun(str)
  else
    initializefun('ssss');
  
  tn := tree.Items.AddChild(tn, '谓语前');
  //具体就是这一句出错,试了几种方法都不行。

解决方案 »

  1.   

    有一句写错了,上面tree := TTreeView.Create(Form1);这句是已经注销掉的
    应该是:
    function  GetPredParse(Sentence1,  ResSearch1:  PChar):  PChar;  
    var  
       firststr,  nextstr:  string;  
       att:  Integer;  
       str,  temstr:  string;  
       tn:  TTreeNode;  
       tree:  TTreeView;  
       Sentence,  ResSearch:  string;  
    begin  
       Result  :=  PChar('');  
       Sentence  :=  StrPas(Sentence1);  
       ResSearch  :=  StrPas(ResSearch1);  
       tree:=TTreeview.CreateParented(Application.Handle);  
       //tree  :=  TTreeView.Create(Form1);  
         
       str  :=  GetPredicate(Sentence,  ResSearch);  
       if  str  <>  ''  then  
           initializefun(str)  
       else  
           initializefun('ssss');  
         
       tn  :=  tree.Items.AddChild(tn,  '谓语前');  
       //具体就是这一句出错,试了几种方法都不行。
      

  2.   

    tn := tree.Items.AddChild(tn, '谓语前');这句不对,改成
    tn := tree.Items.AddChild(Nil, '谓语前');第一参数是你需要加到哪个节点上,你自己加到自己的节点上怎么行??
      

  3.   

    一开始就是用的nil,通不过才该为tn的.
      

  4.   

    你是想做什么,把node加到tree里面吗?
    那你用addchild怎么加都不会成功的.
      

  5.   

    是的,我想动态的建一棵树,昨天在一般的工程文件中已经调试通过了,使用时也没有问题,但在dll中不知怎么就不行,编译没问题,在运行时总提示控件缺少双亲。怎么试都不行。
      

  6.   

    一下是我在别的程序中的生产树型列表的程序,你参考一下(fox),这个是从数据库里读资料然后分层次加到Tree里。但TreeView是系统的控件。其主要功能是按年月日和病例好共四个层次来显示病例信息。根键是医院名称。// 刷新树型列表
    function RefreshTree():Boolean;
    var
      nNode:TTreeNode;
      BootNode,YearNode,MonthNode,DayNode:TTreeNode;
      strPatientId:String;
      strYear,strMonth,strDay : string;
      i : Integer;
    begin
      with FInfoChild do
      begin
      PatientQuery.Active := False;
      PatientQuery.SQL.Clear;
      PatientQuery.SQL.Add('select * from patientinfo order by PatientId');
      PatientQuery.Active := True;
        PatientQuery.First;
        Sktreeview1.items.Clear;
        //增加根键
        if Sktreeview1.items.Count < 1 then
           BootNode := skTreeView1.Items.Add(nil,'××××医院伽玛刀中心')   //添加根键
        else
          BootNode := Sktreeview1.items.GetFirstNode;
        //遍历子节点
        for i := 0 to PatientQuery.Recordcount do
        begin
          strPatientId := PatientQuery.fieldbyname('PatientId').AsString;
          strYear := copy(strPatientId,1,4);
          strMonth := copy(strPatientId,5,2);
          strDay := copy(strPatientId,7,2);
          nNode :=  FindStr(BootNode,strYear + '年');
          if nNode = nil then
             YearNode := skTreeView1.Items.AddChild(BootNode,StrYear + '年')
          else
             YearNode := nNode;
          nNode := FindStr(YearNode,strMonth + '月');
          if nNode = nil then
             MonthNode := skTreeView1.Items.AddChild(YearNode,StrMonth + '月')
          else
             MonthNode := nNode;
          nNode := FindStr(MonthNode,strDay + '日');
          if nNode = nil then
          begin
            DayNode := skTreeView1.Items.AddChild(MonthNode,StrDay + '日');
            sktreeview1.Items.AddChild(DayNode,StrPatientId)
          end
          else
          begin
            DayNode := nNode;
            nNode := FindStr(DayNode,strPatientId);
            if nNode = nil then
            begin
              sktreeview1.Items.AddChild(DayNode,StrPatientId);
            end
          end;
          PatientQuery.Next();
        end;
        SkTreeview1.FullExpand;
      end;
    end;
      

  7.   

    这个是我测试的你看看,但没有在Dll中。(fox)
    procedure TForm1.Button1Click(Sender: TObject);
    var
      firststr, nextstr: string;
      att: Integer;
      str, temstr: string;
      tn: TTreeNode;
      tree: TTreeView;
      Sentence, ResSearch: string;
    begin
      tree := TTreeview.CreateParented(Application.Handle);
      tree.Parent := Form1;  //关键。 
      tn := tree.Items.AddChild(nil, '谓语前');
      tree.Show;
    end;
      

  8.   

    那你现在的dll是怎么设计的!dll输出什么?
      

  9.   

    看看下面的代码: DLL输出是 treeform
    procedure treeform;
    var frm: TForm;
        tv: TTreeView;   //  TWinControl;
        tn: TTreeNode;
    begin
       frm := TForm.Create(Application);
       try
         frm.Caption :='fdgdfgdf';
         frm.Show;
         tv:=TTreeview.Create(tv);
         with tv do
         begin
           ParentWindow:=frm.Handle;
           Left :=0; Top:=0;
           Height :=100; Width:=200;
           tn := items.add(nil, 'RootTreeNode1');
           Items.AddChild(tn,'ddd');
           Items.AddChild(nil,'ddd');
         end;
      except
        frm.Free;
      end;
    end;
    exports
     treeform;
    begin
    end.
      

  10.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      firststr, nextstr: string;
      att: Integer;
      str, temstr: string;
      tn: TTreeNode;
      tree: TTreeView;
      Sentence, ResSearch: string;
    begin
      tree := TTreeview.CreateParented(Application.Handle);
      tree.Parent := Form1;  //关键。 
      tn := tree.Items.AddChild(nil, '谓语前');
      tree.Show;
    end;
      

  11.   

    to delphi人生:
      我在dll中加入了一个form1,将tree.parent=form1;错误依旧;
    to 点点:
      通过了,但为什么我在动态库中加入一个窗体就不可以?