Delphi 如何获取记录字段值
如何获取记录字段值?比如说, 对不起,我的描述不清楚,我有这样一个大记录Delphi 如何获取记录字段值,delphi,delphi-2007,Delphi,Delphi 2007,如何获取记录字段值?比如说, 对不起,我的描述不清楚,我有这样一个大记录 type myRec=record a:byte; c:single; //// a lot of fields end; var nowmyrec:myrec; tmystr:TMemoryStream; implementation procedure TForm1.FormCreate(Sender: TObject); begin tmystr:tmemerystream.create; tmystr.Load
type
myRec=record
a:byte;
c:single;
//// a lot of fields
end;
var
nowmyrec:myrec;
tmystr:TMemoryStream;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
tmystr:tmemerystream.create;
tmystr.LoadFromFile(ExtractFilePath(Application.exename)+'1.data');
tmstr.Position:=0;
tmstr.readbuffer(nowmyRec,sizeof(myRec));
end;
type
TmyRec = record
a: byte;
b: array [0 .. 35] of widechar;
c: single;
end;
var
myRec1, MyRec2: TmyRec;
ms: TMemoryStream;
x: single;
begin
ms := TMemoryStream.Create;
try
// Create a record
myRec1.a :=1;
myRec1.c :=1.50;
// Save record to TMemoryStream
ms.WriteBuffer(myRec1, SizeOf(TmyRec));
// Read one record from TMemoryStream
ms.Position := 0;
ms.ReadBuffer(myRec2, SizeOf(TMyRec));
// Get a value
x := MyRec2.c;
ShowMessage(FloatToStr(x));
finally
ms.Free;
end;
end;
如果nowmyRec的字段是1000,如何将字段值的dll获取到1000 form.edits,请不要使用记录点,我想使用记录的rtti,但delphi2007不支持。如果我不使用delphi2010,你还有其他方法吗
Blockquote您需要首先声明记录变量,如
Rec1:myRec代码>
var
Rec1: myRec;
myValue: Single;
begin
myValue := Rec1.c
end;
这是您想要的吗?您可以这样声明记录
type
myRec=record
a:byte;
c:single;
//// a lot of fields
end;
var
nowmyrec:myrec;
tmystr:TMemoryStream;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
tmystr:tmemerystream.create;
tmystr.LoadFromFile(ExtractFilePath(Application.exename)+'1.data');
tmstr.Position:=0;
tmstr.readbuffer(nowmyRec,sizeof(myRec));
end;
type
TmyRec = record
a: byte;
b: array [0 .. 35] of widechar;
c: single;
end;
var
myRec1, MyRec2: TmyRec;
ms: TMemoryStream;
x: single;
begin
ms := TMemoryStream.Create;
try
// Create a record
myRec1.a :=1;
myRec1.c :=1.50;
// Save record to TMemoryStream
ms.WriteBuffer(myRec1, SizeOf(TmyRec));
// Read one record from TMemoryStream
ms.Position := 0;
ms.ReadBuffer(myRec2, SizeOf(TMyRec));
// Get a value
x := MyRec2.c;
ShowMessage(FloatToStr(x));
finally
ms.Free;
end;
end;
像这样使用它
type
myRec=record
a:byte;
c:single;
//// a lot of fields
end;
var
nowmyrec:myrec;
tmystr:TMemoryStream;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
tmystr:tmemerystream.create;
tmystr.LoadFromFile(ExtractFilePath(Application.exename)+'1.data');
tmstr.Position:=0;
tmstr.readbuffer(nowmyRec,sizeof(myRec));
end;
type
TmyRec = record
a: byte;
b: array [0 .. 35] of widechar;
c: single;
end;
var
myRec1, MyRec2: TmyRec;
ms: TMemoryStream;
x: single;
begin
ms := TMemoryStream.Create;
try
// Create a record
myRec1.a :=1;
myRec1.c :=1.50;
// Save record to TMemoryStream
ms.WriteBuffer(myRec1, SizeOf(TmyRec));
// Read one record from TMemoryStream
ms.Position := 0;
ms.ReadBuffer(myRec2, SizeOf(TMyRec));
// Get a value
x := MyRec2.c;
ShowMessage(FloatToStr(x));
finally
ms.Free;
end;
end;
您的问题是“如何使用RTTI访问Delphi 2007中的记录字段?”答案是您不能,您需要Delphi 2010。+1约定类型的前缀是t
,因此您通常会定义TMyRec
,并创建该类型的变量var MyRec:TMyRec代码>我的意思是我想要得到myRec.a值和myRec.b值,而不是赋值,我的意思是我想要得到myRec.a值和myRec.b值,而不是赋值,@baba:新版本,它将记录存储在流中,并再次读取它以使用值。如果我的记录有1000个字段,我必须编写1000行x:=MyRec2.c;我要指出的是,这种流只适用于值类型(不是字符串、动态数组等)。随着程序的发展,它不会轻易接受记录结构的变化。但是如果你不告诉我们你在做什么,很难猜测。@baba:我认为你应该删除这个问题,然后问一个新的问题,这个问题实际上描述了你在做什么。另外,添加其他问题的链接,并解释为什么这不适合你。到目前为止,在这个问题中,你只描述了你不想做的事情,那就是键入了很多字段名。请编辑这个问题,使代码格式正确(缩进4个空格)。请想一想你的问题是什么,花点时间仔细解释一下。目前有两个人回答了一个与你实际问题完全无关的问题。那是因为你问得很糟糕,我放弃了。每次编辑和评论都会使问题变得比以前更不清楚。投票结束。对不起,请一次问一个问题。米凯尔和巴拉特回答了你的第一个问题。我回答了关于rtti的编辑问题。请接受其中一个并提出一个新问题。但要花更多时间编写格式和解释。@babalove欢迎使用StackOverflow。我否决了你的问题,不是因为英文不好(我的也不好),而是因为源代码示例不可读,无法按原样编译。这清楚地表明你没有把精力放在提问上。注意字段命名、变量命名、缩进、大小写一致等良好习惯。同时阅读常见问题解答:这对StackOverflow的志愿者回答您的问题非常有帮助。其他人投票赞成结束这个问题,但我想给你一个改进的机会。@Jeroen我们已经尝试帮助Q得到改进。如果对其进行进一步编辑,则会出现在第三个不同的问题上。这对那些答案看起来非常愚蠢的人来说是不公平的,因为他们回答的是一个早已过去的问题。最好是结束并提出一个新问题。就目前情况而言,迄今为止提出的两个问题得到了很好的回答,这些答案值得承认。