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得到改进。如果对其进行进一步编辑,则会出现在第三个不同的问题上。这对那些答案看起来非常愚蠢的人来说是不公平的,因为他们回答的是一个早已过去的问题。最好是结束并提出一个新问题。就目前情况而言,迄今为止提出的两个问题得到了很好的回答,这些答案值得承认。