自定义文件格式保存

hua1081979 2008-09-19 07:40:16
我现在自已定义了一个文件格式,但是不知道怎么保存,一直出错
unit Unit1;

interface

uses
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中的指针
...全文
185 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kingron 2008-09-25
  • 打赏
  • 举报
回复
不定长数据最常见的方法是先写一个Size,然后把对应的数据写入进去,读取出来的时候相反。
hua1081979 2008-09-24
  • 打赏
  • 举报
回复
问题解决了,但又有了一个新问题
像string,和TStream这样类型是不定长的怎么保存啊?
hua1081979 2008-09-19
  • 打赏
  • 举报
回复
给点思路啊。。。
hua1081979 2008-09-19
  • 打赏
  • 举报
回复
那我该怎么存呢。。。
我现在一点办法都有啊,
Kingron 2008-09-19
  • 打赏
  • 举报
回复
楼主,你的代码错误太多!
首先你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字节的内存地址数据,下次程序运行的时候那些地址都是不一定存在的。
柯本 2008-09-19
  • 打赏
  • 举报
回复
没细看程序,不过可以肯定,指针及delphi的动态类(class,TObject)是不能保存在文件中的,指针要存,必须存它的内容,动态类,要存它属性的实际值,如要存一个Edit,一般的存储的格式为:
Edit1: TEdit //名字,类名,以下是属性
Left = 232
Top = 88
Width = 121
Height = 21
TabOrder = 0
Text = 'Edit1'
你不能将edit(指针)直接写入文件

5,388

社区成员

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

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