我试着写了一段,好使的。
var a , b: integer;
begin
  a := 10;
  ListView1.Columns.Add;
  ListView1.Columns[0].Caption := 'aa';
  ListView1.Columns.Add;
  ListView1.Columns[1].Caption := 'bb';
  ListView1.Items.Add;
  ListView1.Items[0].Caption := 'dfdfdf';
  ListView1.Items[0].SubItems.Append('sdfsdfs');
  ListView1.Items[0].Data := @a;
  b := integer(ListView1.Items[0].Data^);
  showmessage(inttostr(b))
end;
我想会不会这样,你循环增加的item,就应该给每个item.data赋相应的值。
看看用for循环如何?每次循环给a赋值;
ListView1.Items[i].Data := @a;//这样;

解决方案 »

  1.   

    楼上的方法不正确,因为变量的生存期只在函数或过程中,正确的使用:var
       pData: PInteger;
    begin
       New(pData);
       ListView1.Items[i].Data := pData;
    end;在 ListView 的 OnDeletion 事件中别忘了释放它:
    procedure ListView1Deletion(Sender: TObject; Item: TListItem);
    var
       pData: PInteger;
    begin
       if Assigned(Item.Data) then
       begin
          pData := Item.Data;
          Item.Data := Nil;
          Dispose(pData);
       end;
    end;
      

  2.   

    单击Listview,将A 学号  B姓名 C年龄 D爱号  都加上,但将 A 学号 一栏的width变为0,数据还是照填写不误
    Item.SubItems.Add(Adodataset1.FieldByName('爱号').Value);
    假设填写的为3,则以后取ListView1.Items[3].Data 便行。
      

  3.   

    请问 kyee(浪子阿鹏) 按照你所说,我如何将学号赋值与pdata呢?
      

  4.   

    var
       pData: PInteger;// ... ...//从表中取数后
    with  ListView1 do
    begin
       Item:=Items.Add;
       Item.Caption:=Adodataset1.FieldByName('姓名').Value;
       Item.SubItems.Add(Adodataset1.FieldByName('年龄').Value);
       Item.SubItems.Add(Adodataset1.FieldByName('爱号').Value);   New(pData);
       pData^ := Adodataset1.FieldByName('学号').Value
       Item.Data := pData;
    end;当单击时取出的学号不对
    procedure TForm1.ListView1Change(Sender: TObject; Item: TListItem;
      Change: TItemChange);
    var
       pData: PInteger;
    begin
       pData := Item.Data;
       Application.MessageBox(Pchar(inttostr(pData^)),'',mb_ok);
    end;这样改即可,别忘了在 OnDeletion 事件中加释放数据的过程。