当前位置:主页>仓库管理软件> 列表

记录类型存盘问题? 找国内erp软件供应商

记账软件版1楼: 1.记录类型的结构
type
test = packed record
a: Boolean;
b: Integer;
c: string;
end;
ptest = ^test;

function SaveData(data:test; const filename: string): boolean;
var
Stream: TFileStream;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmCreate);
try
Stream.Position := 0;
Stream.WriteBuffer(data, SizeOf(data));
data.a:= true;
data.b:= 100;
data.c:= ''xzm'';
Stream.WriteBuffer(data, SizeOf(data));
finally
Stream.Free;
end;
except
Result := false; {writing failed}
end;
end;

function LoadData(data:ptest; const filename: string): boolean;
var
Stream: TFileStream;
lCount: integer;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmopenread);
try
Stream.Position := 0;
lCount:= Stream.Read(ldata^, SizeOf(ldata^));
lCount:= Stream.Read(ldata^, SizeOf(ldata^));

finally
Stream.Free;
end;
except
Result := false;
end;
end;


2.将记录存入文件
procedure TForm1.Button7Click(Sender: TObject);
var a:test;
begin
a.b:=1;
a.c:= self.Edit1.text;//将Edit.text赋给a.c则不行,为什么? //''test'';如果用字符串常量则可以
savedata(a,''c:\xzm.txt'');
caption:=a.c;
end;

3.从文件中取记录数据
procedure TForm1.Button8Click(Sender: TObject);
var a:test;
begin
//new(a);
caption:= '''';
loaddata(@a,''c:\xzm.txt'');
caption:=a.c;
end;
以上代码中,a.c:= edit1.text存入不能正确读出,用a.c:=''test''则可以,为什么?如何解决?

2楼: 如果字符串不长的话把c:String换成c:ShortString;
要不就自己逐个字段写入长度和内容 如手机进销存管理系统

3楼: 能不能说得详细点.
在这里觉得好象是地址有错.a.c:= ''字符串常量'';则没问题,而如果用a.c:= Edit1.text,非字符串常量则不行,就象writebuffer(a,sizeof(a))中的a指向的内存有错似的!

4楼: a.c:= pchar(self.Edit1.text);
试一下

5楼: function SaveData(data:ptest; const filename: string): boolean;
//把data的類型改為PTest指針類型
function LoadData(ldata:ptest; const filename: string): boolean;
//這里的data是不是ldata?

procedure TForm1.Button7Click(Sender: TObject);
var p:pTest; //結構怎能實例化,只能用結構指針進行引用
begin
New(p); //分配空間
p.b:=1;
p.c:= Edit1.text;//這里就沒必要用self.Edit.text了
savedata(p,''c:\xzm.txt'');
caption:=p.c;
dispose(p); //釋放空間
end;

procedure TForm1.Button8Click(Sender: TObject);
var p:PTest;
begin
new(p);
caption:= '''';
loaddata(p,''c:\xzm.txt'');
caption:=p.c; //奇怪,p.c為何沒有在loaddata過程中賦值,因此Caption是空的
Dispose(p);
end;

6楼: 方法一、记录类型存盘使用blockwrite,写就可以了,读取的时可以使用blockread。
方法二、听说xml配置文件可以保存记录类型。已经代替了传统的.ini,可以增加你的思路。

记账软件版7楼: 1、楼主保存的文件中string类型实际上只是一个指针(可以查看文件)。
2、如果保存文件时赋常数值,程序重新运行时常数的分配地址是固定的,即文件中保存的指针指向的内存地址所在的字符串是一致的,造成了字符串保存到文件中的假象,如果改变常数值重新编译一把(注意:不保存文件),然后再读取旧文件,读出的字符串就变掉了。
3、如果保存文件时赋窗体属性,由于窗体属性字符串是以PChar类型保存的,直接以string类型指向时就会有问题。
4、楼主的记录中string类型需改成shortstring类型才是可靠的。

8楼: 1.记录类型的结构
type
test = packed record
a: Boolean;
b: Integer;
c: shortstring;//改成
end;
ptest = ^test;

9楼: 如果有一种方法,虽然用edit1.text的值赋给a.c,但转换成字符串常量的形式再赋给a.c,这样存入文件后,就可以正确读出了!问题是长字符串string在delphi中是怎样表示的?

10楼: 用shortstring我就是觉得比较浪费空间,a.c的字符串是不定长的,有的只有几个字符,有的比较长!如果没有其他办法,只得用shortstring了!

11楼: type
test = packed record
a: Boolean;
b: Integer;
c: string;
end;
ptest = ^test;

function SaveData(const data:test; const filename: string): boolean;


var
Stream: TFileStream;
L : Integer;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmCreate);
try
Stream.Position := 0;

Stream.Write(Data.A, SizeOf(Data.A));
Stream.Write(Data.B, SizeOf(Data.B));

L := Length(Data.C);
Stream.Write(L, SizeOf(L));
if L > 0 then Stream.Write(Data.C[1], L);
finally
Stream.Free;
end;
except
Result := false; {writing failed}
end;
end;

function LoadData(var data:test; const filename: string): boolean;
var
Stream: TFileStream;
L: Integer;
begin
Result := true;
try
Stream := TFileStream.Create(filename, fmopenread);
try
Stream.Position := 0;
Stream.Read(Data.A, SizeOf(Data.A));
Stream.Read(Data.B, SizeOf(Data.B));

Stream.Read(L, SizeOf(L));
SetLength(Data.c, L);
if L > 0 then Stream.Read(Data.C[1], L);
finally
Stream.Free;
end;
except

Result := false;
end;
end;


//2.将记录存入文件
procedure TForm5.Button1Click(Sender: TObject);
var a:test;
begin
a.b:=1;
a.c:= Edit1.text;//将Edit.text赋给a.c则不行,为什么? //''test'';如果用字符串常量则可以
savedata(a,''c:\xzm.txt'');
caption:=a.c;
end;

//3.从文件中取记录数据
procedure TForm5.Button2Click(Sender: TObject);
var a:test;
begin
//new(a);
caption:= '''';
loaddata(a,''c:\xzm.txt'');
caption:=a.c;
end;

12楼: 接受答案!谢谢大家! 如国内erp软件供应商

13楼: 帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯

记账软件版14楼: 多人接受答案了。