我在ListView的SelectItem事件中,来显示Item.Data的数据。在插入数据时使用的是^Integer,连续点击不同的行,在点击第三次时就出现“Invalid pointer operation”。
大家帮我看看是什么问题。代码如下:
procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
  Item: TListItem; Selected: Boolean);
var
    PrimaryKey : ^Integer;
begin
    if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;    try
        New(PrimaryKey);
        PrimaryKey := Item.Data;
        LblMemberID.Caption := IntToStr(PrimaryKey^);
    finally
        Dispose(PrimaryKey);
    end;
end;  

解决方案 »

  1.   

    PrimaryKey := Item.Data;  这里不对!
    只是把指针给它!
    procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
      Item: TListItem; Selected: Boolean);
    var
        PrimaryKey : ^Integer;
    begin
        if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;
        New(PrimaryKey);
        PrimaryKey := Item.Data;
        LblMemberID.Caption := IntToStr(PrimaryKey^);
    end;
      

  2.   

    procedure TSysMemberSet.MemberDataSelectItem(Sender: TObject;
      Item: TListItem; Selected: Boolean);
    var
        PrimaryKey : ^Integer;
    begin
        if (not Selected) or (Item.Data = nil) or (Item.Index < 0) then Exit;
        LblMemberID.Caption := IntToStr(Item.Data^);
    end;
      

  3.   

    try
            New(PrimaryKey);             //这里为它申请了一片空间
            PrimaryKey := Item.Data;   //这个时候又把PrimaryKey指向Item.Data        LblMemberID.Caption := IntToStr(PrimaryKey^);
        finally
            Dispose(PrimaryKey);    //实际上施放的是Item.Data上的内存,原来的空间发生内存泄漏    end;PrimaryKey := Item.Data这里也可以改成PrimaryKey^ := Item.Data^
    不过最简单的方法还是我上面写的那样,直接读Item.Data^的值