定义了一个全局变量
type
  pNodeData = ^TNodeData;
  TNodeData = Record
    sDatabaseFilePath: string;
    nIndex: integer;
  end;
在窗体激活的时候从表中将数据加载到一个TREEVIEW中,并记录一个信息在TREEVIEW的每个结点的DATA中。
procedure Tfm_Main.FormActivate(Sender: TObject);
var
  NewNode1, NewNode2: TTreeNode;
  sqlString, DatabaseName: String;
  i: integer;
  p: pNodeData;
  s: ^string;
begin
  with TreeView1 do
  begin
    Items.clear;
    Items.AddFirst(nil,ServerName);
    Items[0].ImageIndex := 16;
    with dm_Main.qry_DabataseList do
    begin
      SQL.Clear;
      SQL.Add('select name, filename from databases order by name');
      Open;
      First;
      while not Eof do
      begin
        New(p);
        p^.sDatabaseFilePath := trim(Fields[1].AsString);
        p^.nIndex := 1;
        NewNode1 := Items.AddChildObjectFirst(Items[0], trim(Fields[0].AsString), p);
        NewNode2 := Items.AddChild(NewNode1, 'User');         with dm_Main.qry_TableList do
         begin
           sqlString := 'select name from object order by name';
           SQL.Clear;
           SQL.Add(sqlString);
           Open;
           First;
           while not Eof do
           begin
             Items.AddChild(NewNode2, trim(Fields[0].AsString));
             Next;
           end;
         end;
         Next;
    end;
  end;
  Dispose(P);
end;end;
当点击根节点的时候报错:Access violation at address .......
当点击二级节点的时候有的节点会报错,有的节点又正常:报错信息为:Invalidpointerr operation.procedure Tfm_Main.TreeView1Click(Sender: TObject);
var
  p: pNodeData;
begin
  if p <> nil then
  begin
    new(p);
    p := Treeview1.Selected.Data;
    StatusBar1.Panels[3].Text := p^.sDatabaseFilePath;
  end;
  Dispose(P);
end;是何原因?