不高不高!
只是结果不对我把整个测试程序铁上来
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;type
    TMyType = Class(TComponent)
//    public
        AString:String;
        AInt:Integer;
        ABoolean:Boolean;
        AStrings:TStringList;
        constructor Create(AOnower:TComponent);override;
        destructor Destroy;override;
end;type
  TForm1 = class(TForm)
    btnLoad: TButton;
    btnSave: TButton;
    btnPost: TButton;
    btnCancel: TButton;
    btnFirst: TButton;
    btnLast: TButton;
    btnPrev: TButton;
    btnNext: TButton;
    btnDel: TButton;
    btnNew: TButton;
    editString: TEdit;
    editNum: TEdit;
    chkBoolean: TCheckBox;
    memoTString: TMemo;
    btnSearch: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btnCancelClick(Sender: TObject);
    procedure btnFirstClick(Sender: TObject);
    procedure btnPostClick(Sender: TObject);
    procedure editNumExit(Sender: TObject);
    procedure btnLastClick(Sender: TObject);
    procedure btnPrevClick(Sender: TObject);
    procedure btnNextClick(Sender: TObject);
    procedure btnDelClick(Sender: TObject);
    procedure btnNewClick(Sender: TObject);
    procedure btnSearchClick(Sender: TObject);
    procedure btnLoadClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
  private
    { Private declarations }
    MyList:TList;
    APossion:Integer;
    procedure ClearDisplay;
    procedure ShowData;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.DFM}constructor TMyType.Create(AOnower:TComponent);
begin
    inherited;
    AString := '';
    ABoolean := false;
    AInt := -1;
    AStrings := TStringList.Create;
end;destructor TMyType.Destroy;
begin
    FreeAndNil(AStrings);
    inherited;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
    MyList := TList.Create;
    APossion := -1;
    ClearDisplay;
end;procedure TForm1.FormDestroy(Sender: TObject);
var
    i:Integer;
    tmp:TMyType;
begin
    for i:=0 to MyList.Count - 1 do
    begin
        tmp := MyList.Items[i];
        tmp.Free;
    end;
    MyList.Clear;
    MyList.Free;
end;procedure TForm1.ClearDisplay;
begin
    editString.Text := '';
    editNum.Text := '0';
    chkBoolean.Checked := false;
    memoTString.Lines.Clear;
end;procedure TForm1.btnCancelClick(Sender: TObject);
begin
    if APossion < 0 then
    begin
        Showmessage('No data exists');
        exit;
    end;    if (APossion >= MyList.Count) then
        APossion := MyList.Count - 1;
    ShowData;        
end;procedure TForm1.btnFirstClick(Sender: TObject);
begin
    if MyList.Count > 0 then
    begin
        APossion := 0;
        ShowData;
    end
    else
        Showmessage('No data to display!');
end;procedure TForm1.ShowData;
begin
    with TMyType(MyList.Items[APossion]) do
    begin
        editString.Text := AString;
        try
            editNum.Text := IntToStr(AInt);
        except
        end;
        chkBoolean.Checked := ABoolean;
        memoTString.Text := AStrings.GetText;
        Caption := IntToStr(APossion);
    end;
end;procedure TForm1.btnPostClick(Sender: TObject);
begin
    with TMyType(MyList.Items[APossion]) do
    begin
        AString := editString.Text;
        try
            AInt := StrToInt(editNum.Text);
        except
        end;
        ABoolean := chkBoolean.Checked;
        AStrings.Assign(memoTString.Lines);
    end;
end;procedure TForm1.editNumExit(Sender: TObject);
begin
    try
        StrToInt(editNum.Text);
    except
        editNum.SetFocus;
    end;
end;procedure TForm1.btnLastClick(Sender: TObject);
begin
    if MyList.Count > 0 then
    begin
        APossion := MyList.Count - 1;
        ShowData;
    end
    else
        Showmessage('No data to display!');
end;procedure TForm1.btnPrevClick(Sender: TObject);
begin
    if APossion - 1 >= 0 then
    begin
        dec(APossion);
        ShowData;
    end
    else
        Showmessage('Already top of the list!');end;procedure TForm1.btnNextClick(Sender: TObject);
begin
    if APossion + 1 < MyList.Count then
    begin
        inc(APossion);
        ShowData;
    end
    else
        Showmessage('Already top of the list!');
end;procedure TForm1.btnDelClick(Sender: TObject);
begin
    if (APossion > 0) and (APossion < MyList.Count) then
        MyList.Delete(APossion)
    else
        APossion := -1;
end;procedure TForm1.btnNewClick(Sender: TObject);
var
    tmpNode:^TMyType;
begin
    tmpNode := TMyType.Create(nil);
    APossion := MyList.Add(tmpNode);
    ClearDisplay;
end;procedure TForm1.btnSearchClick(Sender: TObject);
var
    s:String;
    i:Integer;
begin
    s := InputBox('Input','Key to search:','');
    if s = '' then
        exit;
    for i := 0 to MyList.Count - 1 do
    begin
        if TMyType(MyList.Items[i]).AString = s then
        begin
            APossion := i;
            ShowData;
            exit;
        end;
    end;
    ShowMessage('Not Found!');
end;procedure TForm1.btnLoadClick(Sender: TObject);
var
    fs:TFileStream;
    tmp:TMyType;
begin
    if OpenDialog1.Execute then
    begin
        fs := TFileStream.Create(OpenDialog1.FileName,fmOpenRead);
        try
            while fs.Position < fs.Size do
            begin
                tmp := (fs.ReadComponent(tmp));
                APossion := MyList.Add(tmp);
            end;
        finally
            FreeAndNil(fs);
            ShowData;
        end;
    end;
end;procedure TForm1.btnSaveClick(Sender: TObject);
var
    fs:TFileStream;
    i:Integer;
    tmp:TMyType;
begin
    if SaveDialog1.Execute then
    begin
        fs := TFileStream.Create(SaveDialog1.FileName,fmOpenWrite or fmCreate);
        try
            for i := 0 to MyList.Count - 1 do
            begin
                tmp := TMyType(MyList.items[i]);
                fs.WriteComponent(tmp);
            end;
        finally
            FreeAndNil(fs);
        end;
    end;
end;end.

解决方案 »

  1.   

    darkwing:
    如果我直接用WRITE方法,的确如你所说,SIZEOF(类)永远是.是64位指针!
    但是我用了READ/WRITECOMPONENT!
    我自己搞顶了,是应该要把需要保存的东西都PUBLISH出来就可以了,很简单.
    谢谢诸位
      

  2.   

    用WriteComponentResFile('filename',Tcomponent)函数把文件的所有属性保存到文件中,要用时,重新创建一个Tcomponent 用
    ReadComponentRes('filename',Tcomponent)把文件的属性读回来
      

  3.   

    先建立一个永久性类数组
    type
      TClassArray=array[1..140] of TPersistentClass;
    const
      ClassArray:TClassArray=(TBitmap,TGraphic,TCanvas,...)使用该数组注册类
    procedure TForm1.FormCreate(Sender:TObject)
    begin
    RegisterClasses(ClassArray);....