我用数据库表做了个商品分类的树型结构。
表结构如下 id name parentId level
每个treenode 的data属性放了id
结构如下:
type
      PMyInt = ^TMyInt;
      TMyInt = record
      CurrentID: string;
end;
更改 name按钮的click事件如下:
procedure TInfo_frm.TreeViewEdited(Sender: TObject; Node: TTreeNode;
  var S: String);
var
CurrentID,sqlStr:String;
begin   CurrentID:=PMyInt(Node.Data)^.CurrentID;
//---------------更新结点信息----------------
   with DataModule2 do
   begin
      sqlStr:='update 类别 set Name='+#39+S+#39+' where id='+#39+CurrentID+#39;
      Query.SQL.Clear;
      Query.SQL.Add(sqlStr);
      Query.ExecSQL;
   end;
end;
删除类型的按钮事件如下:
procedure TInfo_frm.DelTypeClick(Sender: TObject);
var
ID,sqlStr:String;
begin
  if MessageDlg('删除类型将删除该类商品信息! 确认删除?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
     begin
        ID:=PMyInt(TreeView.selected.Data)^.CurrentID;
        With DataModule2 do
        begin
           sqlStr:='delete from 类别 where ID='+#39+ID+#39;
           Query.SQL.Clear;
           Query.SQL.Add(sqlStr);
           Query.ExecSQL;
        end;
        Treeview.Items.Delete(Treeview.Selected);
     end;
end;
当我新建结点后点击更改名称或删除结点时执行到下边
CurrentID:=PMyInt(Node.Data)^.CurrentID;

ID:=PMyInt(TreeView.selected.Data)^.CurrentID;
出现错误:access violation at address 0052CEAB in module 'Project1.exe' Read of 
address 00000000
  
还有就是关掉程序第二次启动就行了
新建后马上删除就出现问题  
这是什么问题

解决方案 »

  1.   

    procedure TInfo_frm.NewTypeClick(Sender: TObject);
    var
    sqlStr,CurrentID:String;
    tmpNode:TTreeNode;begin
      with DataModule2 do
      begin
         sqlStr:='insert into 类别(name,ParentID,Level) Values('+#39+'新类型'+#39
                  +','+#39+'0'+#39+','+#39+'0'+#39+')';
         //Edit1.Text:=sqlStr;
         Query.SQL.Clear;
         Query.SQL.Add(sqlStr);
         Query.ExecSQL;
       {ComType.Insert;
       ComType.FieldByName('Name').AsString:='新类型';
       ComType.FieldByName('ParentID').AsInteger:=0;
       ComType.FieldByName('Level').AsInteger:=0;
       ComType.Post; }
    //   Edit1.Text:=Query.fieldByName('ID').AsString;//----------取得插入结点的ID--------------
          sqlStr:='select max(id) as ID from 类别';
          Query.SQL.Clear;
          Query.sql.Add(sqlStr);
          Query.Open;
          CurrentID:=Query.fieldByName('ID').AsString;
    //--------当前id赋予结点中--------------------
          new(DataPtr[Nodes]);
          DataPtr[Nodes]^.CurrentID:=CurrentID;
          Nodes:=Nodes+1;
    //------------加入treeView中显示-----------------------------
          tmpNode:=Treeview.Items.AddObject(nil,'新类型',DataPtr[Nodes]);
          tmpNode.ImageIndex:=0;
          tmpNode.SelectedIndex:=1;
          TreeView.Refresh;
      end;
    end;以上是新建结点的程序