implementation
var
。。
ListMaterial:Tlist;//申明TLIST程序段1:
procedure TForm1.DoKeyPress(StrGrid:TStringGrid;key:integer);
//将记录添加到LIST中
var
Material:^MaterialRec;
begin
     if key=13 then
      begin
         New(Material);
          Material^.MaterialDemandDay:=SGPur_BillDeMand.Cells[6,row];
//           showmessage(SGPur_BillDeMand.Cells[6,row]);
          ListMaterial.Add(Material);   //将材料子项填入到某个需求单中
          dispose(Material); ??????????注意行?????????
          AddStrGridRow(StrGrid,Row);      end;
end;
程序段2:
procedure TForm1.Button1Click(Sender: TObject);
//将LIST中的记录显示出来
var c:integer;
   y:Word;
   kk:String;
   Material1:^MaterialRec;
begin
//showmessage('ff');
     showmessage(inttostr(ListMaterial.Count));
     Y:=10;
    // showmessage(inttostr(listmaterial.count)
     for c:=0 to ListMaterial.Count-1 do
     begin
         begin
                New(Material1);
                Material1:= ListMaterial.Items[c];
                //kk:=Inttostr(Material^.MaterialQuanlity) ;
                //showmessage(kk);
                // Showmessage(inttostr(Material^.MaterialQuanlity ));
                //Canvas.TextOut(10, Y, Material^.MaterialDemandDay);
                showmessage(Material1^.MaterialDemandDay) ;
                Y := Y + 30;
                dispose(Material1);
         end;
     end;
end;问题:当我去掉注意行程序运行正常,当我不去掉,在激发程序段2时程序报错,感觉好像是TLIST的问题。??有没有高手帮帮忙阿????因为指针是必须释放的阿!

解决方案 »

  1.   

    1)注意行不能注释,List只负责保管,不负责创建和拷贝
    2)段2不要new和dispose Material1,new了没用,dispose反而把List中的内容释放了,导致第二次执行肯定要出错。
    3)程序释放的时候,记得dispose List中的内容。
      

  2.   

    ListMaterial.Add(Material);  在此加入的是Object Pointer
    即ListMaterial引用了Material;可在ListMaterial列表不用之后Dispose(ListMaterial.Items.[]).
      

  3.   

    ListMaterial有没有创建和释放?
      

  4.   

    LIST只负责保管是什么意思呢?
      

  5.   

    就是相当于保险箱啊,放什么,取出来的就是什么。List又不是阿凡提,种一粒金子,能收十粒金子。
      

  6.   

    谢谢CHECTRY,但是,我在里边ADD了很多(MATERIAL)了啊,不止一粒金子啊!?
      

  7.   

    Add多少,它就存多少,不会多也不会少。
      

  8.   

    dispose(Material);
    小陈呀。。Dispose不是随便用的.
    我跟你说,你应该在show完之后释放。
    给你写一个DoClearList;procedure DoClearList;
    var
      i: Integer;
    begin
      for i := 0 to ListName.Count - 1 do
      begin
        Dispose(MaterialRec(ListName.Item[i]));
        ListName[i] := nil;
      end;
      ListName.Pack;
    end;注意。ListName要注意创建和释放噢晚上请吃饭。。