程序有问题给出源代码注意data属性本身是没有空间的指针,所以如果你没有new p的话可能所有node都指向同一数据

解决方案 »

  1.   

    是不是得根据node的数目(n)分配n个空间指针呢?谢谢,请帮我分析一下,如果能多给分,我将....function TForm1.LoadCode(crTbl:TDBDataSet):Integer;
    var NowID,sName,ShowTxt:String;
    i,Level:Integer;
    MyNode:array[0..6]of TTreeNode;
    datap:^string;
    begin
    Level:=0;
    With crTbl do  
    begin
    new(datap);
    try
    if not Active then Open;
    First;
    tvwCode.Items.Clear;
    MyNode[Level]:=tvwCode.Items.Add
    (tvwCode.TopItem,SFirstNodeTxt);
    MyNode[Level].ImageIndex:=0;
    MyNode[Level].SelectedIndex:=0;
    While Not Eof do
    begin
    NowID:=Trim(FieldByName('maxtbh').AsString);
    ShowTxt:=NowID+' '+FieldByName('mahtbh').AsString;
    Level:=GetLevel(SCodeFormat,NowID);
    datap^:=nowid;
    if Level>0 then//确保代码符合标准
    begin
      tvwCode.Items.BeginUpdate;
       MyNode[Level]:=tvwCode.Items.AddChildObject
    (MyNode[Level-1],ShowTxt,datap );
       MyNode[Level].ImageIndex:=1;
       MyNode[Level].SelectedIndex:=2;
       tvwCode.Items.EndUpdate;
    end;
    Next;
    end;
    finally
    Close;
    end;
    end;
      

  2.   

    天,代码懒的看了。
    procedure TForm1.LoadCode(DataSet: TQuery);
    var  
      S: string;
    begin
      with DataSet do
      begin
        Close; SQL.Clear;
        SQL.Text := 'select Field1 from TableName';
        Open; First;
        while not Eof do
        begin
          S := FieldByName('Field1').AsString; 
          //加在根结点。
          TreeView1.Items.AddObject(nil, S, Pointer(S)); 
          Next;
        end;
      end;
    end;然后通过类型转换来访问它的Data属性。
    var
      Node: TTreeNode;
    begin
      Node := TreeView1.Selected;
      //如果没有,会raise
      if Assigned(Node.Data) then
        ShowMessage(String(Pointer(Node.Data^));
    end;
      

  3.   

    To copy_paste(木石三)
    好象不行,还是请看原程吧,老兄
    我要得是每个node.data携带一个数据,需要的时候我能取到他,利用他进行别的查询条件。
    类似《良友》
      

  4.   

    我用结构做了,没有问题,结构是我所长,其它的,呵呵,
    下面的我调试过了。type
      TMyNode = packed record
        sString: string;
      end;
      PMyNode = ^TMyNode;procedure TForm1.FormCreate(Sender: TObject);
    var
      S1,S: string;
      P: PMyNode;
      Node: TTreeNode;
    begin
      TreeView1.Items.Clear;
      with Table1 do
      begin
        First;
        while not Eof do
        begin
          S1 := FieldByName('Name').AsString;
          new(P);
          P.sString := FieldByName('AREA').AsString;
          Node := TreeView1.Items.Add(nil, S1);
          Node.Data := P;
          Next;
        end;
      end;
    end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
      if Assigned(Node.data) then
        Self.Caption := TMyNode(Node.Data^).sString;
    end;