PItem:^TItem;
TItem = Record
Name:String;
ID:integer;
end;
Procedure Save();
var
F:TFileStream;
P:PItem;
Begin
P:=New(PItem);
FillMemory(P,0,SizeOf(p));
P.Name:='Test';
p.ID:=0;
F:=TFileStream.Create('C:\1.txt',fmCreate or fmOpenWrite);
F.write(p^,Sizeof(p^));//改成 F.write(p,Sizeof(p));也差不多
F.Free;
FreeMemory(P);
//我看了保存的文件,只存到P的地址,只有四个字节。
end;Procedure Read();
var
F:TFileStream;
P:PItem;
Begin
P:=New(PItem);
FillMemory(P,0,SizeOf(p));
F:=TFileStream.Create('C:\1.txt',fmOpenRead);
F.Read(p^,Sizeof(p^));
F.Free;
ShowMessage(p^.Name);
FreeMemory(P);
end;怎样可以保存到正确的自定义数据类型?我要保存的是一个TList,里面的数据是自定义类型。
TItem = Record
Name:String;
ID:integer;
end;
Procedure Save();
var
F:TFileStream;
P:PItem;
Begin
P:=New(PItem);
FillMemory(P,0,SizeOf(p));
P.Name:='Test';
p.ID:=0;
F:=TFileStream.Create('C:\1.txt',fmCreate or fmOpenWrite);
F.write(p^,Sizeof(p^));//改成 F.write(p,Sizeof(p));也差不多
F.Free;
FreeMemory(P);
//我看了保存的文件,只存到P的地址,只有四个字节。
end;Procedure Read();
var
F:TFileStream;
P:PItem;
Begin
P:=New(PItem);
FillMemory(P,0,SizeOf(p));
F:=TFileStream.Create('C:\1.txt',fmOpenRead);
F.Read(p^,Sizeof(p^));
F.Free;
ShowMessage(p^.Name);
FreeMemory(P);
end;怎样可以保存到正确的自定义数据类型?我要保存的是一个TList,里面的数据是自定义类型。
解决方案 »
- SimpleDataSet使用的问题
- 为什么WebBrowser下载完成一个页触发两次onDocumentComplete事件
- KOL怎么安装才对
- 走过路过不要错过!
- 请问哪里有MD5.DLL 的文件下载
- access的字段问题!
- ------如何取的后台服务器的时间?急!!!========
- 有什么代理软件可以做到让ADSL代理上网
- 我要在程序中发一个回车命令它的字符是13我怎样在程序中具体实现
- 请问,我用图形控件做背景,可是当它被别的东西挡住了的时候,被挡的地方会变白了,如何才能使图形控件再次重画画面?
- TFileStream的.WriteComponentRes ()不能保存TTreeView的Item.Data的数据,怎么办?
- 类型文件问题?
FillMemory(P,0,SizeOf(p));
TFileItem=Record
Title:String[255];
FilePath:String[255];
FileInfo:String[255];
FileID:String[13];
ImageIndex:Integer;
end;
var
FFileList:TList;
……
……
……function TMainForm.SaveToFile(const Filename: String): TDocinfo;
var
f:TFileStream;
i,n:Integer;
Data:PFileItem;
t:TTreeView;
begin
f:=TFileStream.Create(filename,fmCreate or fmOpenWrite);
t:=TTreeView.Create(self);
t.Parent:=Self;
t.Visible:=false;
t.Items.Assign(tvFiles.Items);
f.WriteComponentRes (t.ClassName,t);
t.Free;
f.WriteBuffer (FFileList.Count,Sizeof(integer));
for i:=0 to FFileList.Count -1 do
begin
Data:=New(PFileItem);
Data:=GetFileItem(i);
f.WriteBuffer(Data^,sizeof(Data^));
n:=Sizeof(Data^);
FreeMemory(Data);
end;
f.Free;
end;function TMainForm.ReadFromFile(const FileName: String): TDocinfo;
var
f:TFileStream;
i,Count:Integer;
Data:PFileItem;
t:TTreeView;
begin
try
for i:=FFileList.Count - 1 downto 0 do
begin
FFileList.Delete(i);
DeleteFileItem(i);
end;
tvFiles.Items.BeginUpdate;
f:=TFileStream.Create(filename,fmOpenRead);
t:=TTreeView.Create(self);
t.Parent:=Self;
t.Visible:=false;
f.ReadComponentRes (t);
tvFiles.Items.Assign(t.Items);
t.Free;
f.ReadBuffer (Count,Sizeof(integer));
for i:=0 to Count -1 do
begin
Data:=New(PFileItem);
f.ReadBuffer(Data^,sizeof(TFileItem));
FFileList.Add(Data);
end;
finally
f.Free;
end;
lvFiles.Items.Count:=FFileList.Count;
lvFiles.Repaint;
end;
在读出来的数据里有些值不对是怎么回事?还有,如果我不固定String 的大小,用SizeOf就不会得到他的正确大小了,这是怎么回事?
例如:
PTest=^TTest;
TTest = Record
Txt:String;
ID:Integer;
end;
var
p:PTest;
Size:Integer;
Begin
p:=New(PTest);
Size:= SizeOf(p^);//Size = 11;
p.Txt:='This is a test of Record Data Save';
Size:=Sizeof(p^);/Size还是11;
xxx = record
...
...
end;var
fText :File of xxx;
z :xxx;
begin
assignfile(fText, '文件路径');
reset(fText);
Seek(z, sizeof(z));
try
write(z, fText);
finally
CloseFile(fText);
end;
end; //这样整个结构就写入文件了
用指针就不行,好像是SIZEOF函数有问题还请高手出来看看Procedure Save();
var
F:TFileStream;
P:tItem;
Begin
//P:=New(PItem);
//FillMemory(P,0,SizeOf(p));
P.Name:='Test';
p.ID:=0;
F:=TFileStream.Create('C:\1.txt',fmCreate or fmOpenWrite);
f.position := 0;
F.write(p,Sizeof(p));//改成 F.write(p,Sizeof(p));也差不多
F.Free;
//FreeMemory(P);
end;Procedure Read();
var
F:TFileStream;
P:tItem;
Begin
//P:=New(PItem);
//FillMemory(P,0,SizeOf(p));
F:=TFileStream.Create('C:\1.txt',fmOpenRead);
f.position := 0;
F.Read(p,Sizeof(p));
F.Free;
ShowMessage(p.Name);
//FreeMemory(P);
end;