自定义文件格式保存

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中的指针
...全文
196 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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(指针)直接写入文件
version :4.0 1、将生成的代码和事件用两个文件实现。 2、修改了部分Bug; 3、颜色设置做了部分改进; 4、内部集成了VC的编译器,和模拟器,生成C文件后可以直接在uCGUIBuilder中编译,运行模拟器了 5、添加代码自动完成功能; 6、添加画线功能。 version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件错误的Bug; 4、添加了控件ID自动增加功能; 5、添加了控件ID检查功能,控件ID有重复时会有警告; 6、添加了用户自定义字体功能; 7、支持中英文切换(但功能不够完善); 8、支持自动检查更新; 9、修改了不能保存用户自定义ID的BUG; version : 3.0.0.0 重写了部分内核,运行更稳定; 支持窗体设计器的复制、粘贴、剪切、删除、撤销、等基本操作; 支持多控件,对齐、公共属性修改等基本操作; 支持将.ucfrm文件与ucGUIBuilder关联功能; 支持控件自定义ID; 添加了窗体预览功能; 添加了对控件事件的支持; 添加了在线检查更新功能; 等…… version : 2.1.0.5 优化了控件库; 修复了一些Bug; 代码生成窗口中添加了C语言语法高亮显示功能; C文件模板做了部分修改(C文件模板大家可以随意修改为自己喜欢的格式(..\Template\Template.c文件) 但是要保证$$$GUI_WIDGET_CREATE_INFO$$$ $$$Defination$$$ $$$InitDialog$$$ 三个字符串位置不变) 支持设计的窗体保存为文件,并可以打开; 对所有控件属性添加了Description(在属性窗口最下面显示); 窗体布局可以保存,可以自定义为自己喜欢的窗体布局; 修改了部分功能; version : 2.0.0.5 优化了控件库; 修复了一些Bug; 可以生成完整的C文件(包括 资源表,初始化代码等); 修改了部分功能; version : 1.0.0.0 功能很不完善; 还有好多BUG; 目前只能生成资源表; 暂时不能生成其他代码; 大家有什么好的建议可以发送Email 到: ucguibuilder@163.com

5,928

社区成员

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

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