白痴级问题---保存对象到文件

CJ 2000-03-31 11:42:00
type
TMyType = Class(TComponent)
public
AString:String;
AInt:Integer;
ABoolean:Boolean;
AStrings:TStringList;
constructor Create(AOnower:TComponent);override;
destructor Destroy;override;
end;
...
MyList:TList;
...
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;

结果永远不对:(
...全文
209 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xinyue 2000-04-05
  • 打赏
  • 举报
回复
先建立一个永久性类数组
type
TClassArray=array[1..140] of TPersistentClass;
const
ClassArray:TClassArray=(TBitmap,TGraphic,TCanvas,...)

使用该数组注册类
procedure TForm1.FormCreate(Sender:TObject)
begin
RegisterClasses(ClassArray);....
xiaonan 2000-04-04
  • 打赏
  • 举报
回复
用WriteComponentResFile('filename',Tcomponent)函数把文件的所有属性保存到文件中,要用时,重新创建一个Tcomponent 用
ReadComponentRes('filename',Tcomponent)把文件的属性读回来
SimonDW 2000-04-01
  • 打赏
  • 举报
回复
你保存的只是引用而已(指向对象的指针)
要用指针把你要保存的东西直接写到盘上
所以,大多数要读写文件的类,都有自己的写方法
CJ 2000-04-01
  • 打赏
  • 举报
回复
不高不高!
只是结果不对我把整个测试程序铁上来
unit Unit1;

interface

uses
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.
CJ 2000-04-01
  • 打赏
  • 举报
回复
darkwing:
如果我直接用WRITE方法,的确如你所说,SIZEOF(类)永远是.是64位指针!
但是我用了READ/WRITECOMPONENT!
我自己搞顶了,是应该要把需要保存的东西都PUBLISH出来就可以了,很简单.
谢谢诸位
sayhello 2000-04-01
  • 打赏
  • 举报
回复
看起来很高深,让我仔细研究一下!

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧