我现在自已定义了一个文件格式,但是不知道怎么保存,一直出错
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;type
  FType  = record
    x : integer;
    y : integer;
  end;
  T1 = record
    c : TColor;
    pt : TList;
  end;
  pLine = ^FType;
  pT1 = ^T1;
  
  TForm1 = class(TForm)
    Button1: TButton;
    d1: TColorDialog;
    Panel1: TPanel;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Panel1Click(Sender: TObject);
  private
    { Private declarations } 
    FList: TList;
    CList: TList;    FStartPoint: TPoint;
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  xWrite,yWrite : integer;
  oCount:integer;implementation{$R *.dfm}procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  p : pLine;
begin
  if ssLeft in shift then
  begin
    Form1.Canvas.Pen.Width := 1;
    Form1.Canvas.Pen.Color := d1.Color;
    Form1.Canvas.Pen.Mode := pmcopy;
    Form1.Canvas.moveto(xWrite,yWrite);
    Form1.Canvas.lineto(x,y);
    New(p);
    p.x :=  x;
    p.y   :=  y;
    FList.Add(p);
    Dispose(p);
  end;
  xWrite := x;
  yWrite := y;
end;procedure TForm1.FormCreate(Sender: TObject);
var
  lFileStream: TFileStream;
  i,j : Integer;
  lLineRec : pLine;
  c:pT1;
begin
  panel1.Color := d1.Color;
  oCount := 0;
  FList := TList.Create;
  CList := TList.Create;
  
  if FileExists('d:\Default.dat') then
  begin
    lFileStream := TFileStream.Create('d:\Default.dat', fmOpenRead);
    for i := 0 to (lFileStream.Size div SizeOf(T1)) -1 do
    begin
      new(c);
      lFileStream.Read(c^,SizeOf(T1));
      CList.Add(c);
      Dispose(c);
    end;
    lFileStream.Free;
    Invalidate;
  end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
  i,j: Integer;
  c : pT1;
  lFileStream: TFileStream;
begin
  lFileStream := TFileStream.Create('d:\Default.dat', fmCreate);  pT1(CList[oCount - 1]).pt := FList;
  for i := 0 to CList.Count - 1 do
  begin    c := pT1(CList[i]);
    lFileStream.Write(c^,SizeOf(T1));
  end;
  lFileStream.Free;
  //FList.Free;
end;procedure TForm1.FormPaint(Sender: TObject);
var
  i,j: Integer;
  tmpList:TList;
begin
  //Canvas.Pen.Color := clRed;
  Canvas.Pen.Width := 1;
  tmpList := TList.Create;
  for i := 0 to CList.Count - 1 do
  begin
    tmpList.Clear;
    Canvas.Pen.Color := pT1(CList[i]).c;
    tmpList := pT1(CList[i]).pt;
    for j := 1 to tmpList.Count - 1 do
    begin
      Canvas.MoveTo(PLine(tmpList[i-1]).X, PLine(tmpList[i-1]).Y);
      Canvas.LineTo(PLine(tmpList[i]).X, PLine(tmpList[i]).Y);
    end;
  end;
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  FList.Free;
end;procedure TForm1.Panel1Click(Sender: TObject);
var
  p : pT1;
begin
  if d1.Execute then
  begin
    new(p);
    p.c := d1.Color;
    p.pt := TList.Create;
    if oCount > 0 then
    begin
      pT1(CList[oCount - 1]).pt := FList;
      
    end;
    CList.Add(p);
    oCount := oCount + 1;
    Dispose(p);
    panel1.Color := d1.Color;
  end;
end;end.
两个记录类型,T1中的pt是存指向FType中的指针

解决方案 »

  1.   

    没细看程序,不过可以肯定,指针及delphi的动态类(class,TObject)是不能保存在文件中的,指针要存,必须存它的内容,动态类,要存它属性的实际值,如要存一个Edit,一般的存储的格式为:
    Edit1: TEdit  //名字,类名,以下是属性
    Left = 232
    Top = 88
    Width = 121
    Height = 21
    TabOrder = 0
    Text = 'Edit1'
    你不能将edit(指针)直接写入文件
      

  2.   

    楼主,你的代码错误太多!
    首先你New一个P,然后加入List,马上又Dispose P是不正确的,应该是在使用完成后dispose p。
    正常的用法是:
    需要添加的时候:
    begin
    new(p);
    p.xxxx := aaaa;
    p.yyyy := bbbb;
    List.Add(p);
    end;
    最后在Form Destory中:
    var
      i : Integer;
      p : pT1;
    begin
      for i :=0 to List.Count - 1 do
      begin
        p := List[i];
        Dispose(p);
      end;
      List.Free;
    end;其次,你的
      T1 = record 
        c : TColor; 
        pt : TList; 
      end; 
    中,你直接写入这个Record,那么pt对应的List中的那些对象是不会写入文件的,只会写入4字节的内存地址数据,下次程序运行的时候那些地址都是不一定存在的。
      

  3.   

    问题解决了,但又有了一个新问题
    像string,和TStream这样类型是不定长的怎么保存啊?
      

  4.   

    不定长数据最常见的方法是先写一个Size,然后把对应的数据写入进去,读取出来的时候相反。