你想要多少分呀??
树显示我已经做好了!可选取树型中的内容怎样得到它的Test1_id,因为edit.txt中的内容需要以Test1_id为条件进行检索。我想的是需要有一个变量保存Test1_id的内容。PB的TV控件中有一个data变量用来保存数据,可以解决这个问题。不知delphi有没有这种变量。如果没有应该怎样解决呀。很急呀!!!

解决方案 »

  1.   

    有!
    利用data的例子The following code defines a record type of TMyRec and a record pointer type of PMyRec.type
    PMyRec = ^TMyRec;
    TMyRec = record
      FName: string;
      LName: string;
    end;Assuming these types are used, the following code adds a node to TreeView1 as the last sibling of a specified node. A TMyRec record is associated with the added item. The FName and LName fields are obtained from edit boxes Edit1 and Edit2. The Index parameter is obtained from edit box Edit3. The item is added only if the Index is a valid value.procedure TForm1.Button1Click(Sender: TObject);var
      MyRecPtr: PMyRec;
      TreeViewIndex: LongInt;
    begin
      New(MyRecPtr);
      MyRecPtr^.FName := Edit1.Text;
      MyRecPtr^.LName := Edit2.Text;
      TreeViewIndex := StrToInt(Edit3.Text);
      with TreeView1 do
      begin
        if Items.Count = 0 then
          Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
        else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then      Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
      end;
    end;After an item containing a TMyRec record has been added, the following code retrieves the FName and LName values associated with the item and displays the values in a label.procedure TForm1.Button2Click(Sender: TObject);begin
      Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
                      PMyRec(TreeView1.Selected.Data)^.LName;
    end;
      

  2.   

    代码如下:
    implementation
      uses unit1;
    {$R *.dfm}type
      PMyRecord = ^MyRecord;
      MyRecord  = record
             department_id:string;
             department_name:string;
    end;var
      p:PMyRecord;procedure TForm4.TvCreate();
    var
      k,j:Integer;
      TNode,TNode_Root:TTreeNode;
    Begin
      new(p);
      ADOTable1.Active:=False;
      ADOTable1.Active:=True;
      ADOQuery2.Active:=False;
      ADOTable1.Open;
      TreeView1.Items.Clear;
      TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
      For k:=1 To ADOTable1.RecordCount Do
        Begin
          p.department_id:=ADOTable1.FieldByName('department_id').AsString;
          p.department_name:=ADOTable1.FieldByName('department_name').AsString;
          TNode:=Treeview1.Items.AddChildObject(TNode_Root,p.department_name,p);
          ADOTable1.Next;
        End;
       ADOQuery2.Active:=False;
    End;作出来的达不到我需要效果呀!点击选取的值是最后一个的department_id呀!而我需要点那个出来那个的department_id值。
      

  3.   

    给你提供一个思路吧!
    就是你先把Test1(表1)的所有的Test1_age这个字段的值加到treeview中去
    然后执行语句选出Test2(表2)的所有的纪录 这个时候开始通过判断表2的现在的数据的Test1_id这个字段的值可以获得在表1的Test1_age 这个字段的值的
    然后就开始在表1for i:=0 to treeview1.items.count 寻找这个字段的位置的
    定义一个ttreeview类的变量node
    if treeview1.Items.Item[i].Text=(你开始的时候获得在表1的Test1_age )得值的话
    就node=treeview1.Items.Item[i]
    然后再  treeview1.Items.AddChild(node,你的表2的Test2_name这个字段得值)
    就可以实现你的功能了
    删除的时候就直接  treeview1.Selected.Delete就可以了
    但是你要更新你的treeview1的就可以了呵呵 我没有什么好的办法 不知道你看明白了没有的
      

  4.   

    是不是这个意思:
    procedure TForm4.TvCreate();
    var
      k,j:Integer;
      TNode,TNode_Root:TTreeNode;
    Begin
      ADOTable1.Active:=True;
      ADOTable1.Open;
      TreeView1.Items.Clear;
      TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
      ADOTable1.First;
      For k:=1 To ADOTable1.RecordCount Do
        Begin
           TNode:=TreeView1.Items.AddChild(TNode_Root,ADOTable1.FieldValues['department_name']);
          ADOQuery2.SQL.Clear;
          ADOQuery2.SQL.Add('Select * From worker');
          ADOQuery2.SQL.Add('Where work_department=:aStr ORDER BY work_name;');
          ADOQuery2.Parameters.ParamByName('aStr').Value:=Trim(ADOTable1.FieldValues['department_id']);
          ADOQuery2.Active:=True;
          ADOQuery2.Open;
          For j:=1 To ADOQuery2.RecordCount Do
            Begin
            TreeView1.Items.AddChild(TNode,ADOQuery2.FieldValues['work_name']);
            ADOQuery2.Next;
            End;
          }
          ADOTable1.Next;
        End;
       ADOQuery2.Active:=False;
    End;
    如果是的话有两点问题:
    一:效率太低。要作到点选后再出来下一级,这样的话下一级检索时需要一个上一级的参数。这参数怎么传递.我想的是以Test1_id为参数来获取Test2中的数据.
    二:点击TV树后EDIT中要显示数据,而数据检索时也需要条件。如果取Test2_name的话,就存在一个问题,Test2_name中的内容是可修改的,所以行不通,只能取Test2_id.现在的问题是我怎样在加入TV树时也加入Test1_id,Test2_id,并且在点击Test1_age,Test2_name时获得相应的Test1_id,Test2_id的值,并以此为条件来检索数据。
      

  5.   

    仅供参考:
    procedure TForm1.FormShow(Sender: TObject);
    var
      TreeNodeProvince,TreeNodeCity : TTreeNode;
      NodeDataRecPtr : PNodeDataRec;
      RegAdmiCode,Temp : String;
    begin
      TreeView1.Items.Clear;
      //TreeNodeProvince := nil;
      //TreeNodeCity := nil;
      with Query1 do
      begin
        Close;
        SQL.Clear;
        SQL.Text := 'select * from Admipartition order by ADMIPARTITIONNO asc';
        try
          Open;
        except
          Close;
          Exit;
        end;
        //----^    if not (bof and eof) then
        begin
          First;
          while Not eof do
          begin
            Temp := fieldbyname('AdmipartitionNo').AsString;        if Copy(fieldbyname('AdmipartitionNo').AsString,3,4) = '0000' then
            begin
              New(NodeDataRecPtr);
              NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
              NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
              TreeNodeProvince := TreeView1.Items.AddObject(nil,FieldByName('ADMIPARTITIONNAME').AsString +
                            '' + FieldByName('ADMIPARTITIONNO').AsString,NodeDataRecPtr);         // TreeNodeProvince := TreeView1.Items.Add(nil,FieldByName('ADMIPARTITIONNAME').AsString
                  //          );
            end
            else
              if Copy(FieldByName('ADMIPARTITIONNO').AsString,5,2) = '00' then
              begin
                New(NodeDataRecPtr);
                NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
                NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNO').AsString;
                TreeNodeCity := TreeView1.Items.AddChildObject(TreeNodeProvince,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr);
              end
              else
              begin
                New(NodeDataRecPtr);
                NodeDataRecPtr^.AdmiName := FieldByName('ADMIPARTITIONNAME').AsString;
                NodeDataRecPtr^.AdmiCode := FieldByName('ADMIPARTITIONNo').AsString;
                TreeView1.Items.AddChildObject(TreeNodeCity,FieldByName('ADMIPARTITIONNAME').AsString,NodeDataRecPtr);          end;
            Next;
          end;
        end;
      end;
      TreeView1.SetFocus;
      TreeView1Click(Self);
    end;
      

  6.   

    你知道你自己的问题吗???你就声明了一个指针,让它反复指向不同的地方,当然它只能保存最后一次指向的地方了。
    》》》》》回复人: hzxrh(好猫咪) ( ) 信誉:100  2003-12-20 18:00:00  得分:0 
     
     
      代码如下:
    implementation
      uses unit1;
    {$R *.dfm}type
      PMyRecord = ^MyRecord;
      MyRecord  = record
             department_id:string;
             department_name:string;
    end;var
      p:PMyRecord;procedure TForm4.TvCreate();
    var
      k,j:Integer;
      TNode,TNode_Root:TTreeNode;
    Begin
      new(p);
      ADOTable1.Active:=False;
      ADOTable1.Active:=True;
      ADOQuery2.Active:=False;
      ADOTable1.Open;
      TreeView1.Items.Clear;
      TNode_Root:=TreeView1.Items.Add(nil,'部门管理');
      For k:=1 To ADOTable1.RecordCount Do
        Begin
          p.department_id:=ADOTable1.FieldByName('department_id').AsString;
          p.department_name:=ADOTable1.FieldByName('department_name').AsString;
          TNode:=Treeview1.Items.AddChildObject(TNode_Root,p.department_name,p);
          ADOTable1.Next;
        End;
       ADOQuery2.Active:=False;
    End;》》》》作出来的达不到我需要效果呀!点击选取的值是最后一个的department_id呀!而我需要点那个出来那个的department_id值。
      
    把New(P)移动到循环体内就可以了,不过需要注意的是,指针释放必须手动进行,建议用指针数组。