我定义了一个结构  PTaskInfo = ^TTaskInfo;
  TTaskInfo = record
    TaskID:Integer;
    Description:String[255];    OfWeek:array[0..6] of Boolean;
    DatesList:array[0..23] of String[25];
    DatesListCount:Byte;
  end;然后,把数据(指针)不断添加到TList
  var info:PTaskInfo;
  ...
  New(info);
  ...
  var list:TList;
  ...
  list.Add(info);
  ...
  //到程序结果时才调用类似Dispose(list.Items[n])的语句接着,用TFileStream将TList写入文件  fStream.Write(list.Items[i]^,sizeof(TTaskInfo));但是最后用十六进制编辑器查看文件是,发现保存的数据不对,出现一些莫名奇妙的数据(如窗体的属性).本来不想在record中使用String,但这样用起来方便得多.而且我已经加上String[50]的长度限定,应该没问题了吧???
不知道我在什么地方理解错了,还是我代码那个地方写得有问题,请大家帮帮忙.

解决方案 »

  1.   

    TTaskInfo = packed record
    .....
      

  2.   

    procedure Test;
    var
      I: Integer;
      FList: TList;
      FPtr: PTaskInfo;
    begin
      FList := TList.Create;
      try
        for I := 0 to 9 do
        begin
          New(FPtr);
          ZeroMemory(FPtr, SizeOf(TTaskInfo));
          FList.Add(FPtr);
          FPtr^.Description := 'This is Budded.'
        end;    with TFileStream.Create('c:\budded.bin', fmCreate) do
        try
          for FPtr in FList do
            Write(FPtr^, SizeOf(TTaskInfo));
        finally
          Free;
        end;
      finally
        FList.Free;
      end;
    end;
      

  3.   

    记得加上这句,ZeroMemory(FPtr,   SizeOf(TTaskInfo)); 清空内存块,
      

  4.   

    谢谢,加了ZeroMemory以后,写入文件的数据就正确了.
    然后发现读出来的数据不对,后来找到原因
    var
     tmpTask:PTaskInfo;
    ...
     New(tmpTask);
     ZeroMemory(tmpTask,sizeof(TTaskInfo));
     fStream.Read(tmpTask^,sizeof(TTaskInfo));
     //错误语句:fStream.Read(tmpTask,sizeof(TTaskInfo));
     ...之前etomahawk 说的加上packed关键字,与解决问题没有关系,所以不好意思,就不给分了. 谢谢大家.