我有以下代码,可以运行,但我不能 100% 理解它(请参阅代码中的注释):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyRec=record
a:Integer;
b:String;
end;
TRecArray=array of TMyRec;
PRecArray = ^TRecArray;
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
v1:TRecArray;
procedure Test(a:PRecArray);
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(v1,3);
v1[0].b:='test1';//set the first value
Test(PRecArray(v1));//call method to change the value assigned before
end;
procedure TForm1.Test(a: PRecArray);
begin
ShowMessage(v1[0].b);//shows test1
try
a^[0].b:='test2' //this is raising an error...
except
end;
PRecArray(@a)^[0].b:='test3';//this is working...
ShowMessage(v1[0].b);//shows test3
end;
end.
我不明白为什么 'a^[0].b:='test2' 会引发错误。
谢谢!
最佳答案
您的“测试”过程需要一个“PRecArray”,但您正在向它传递一个“TRecArray”。尝试这样调用它
Test(@v1);//call method to change the value assigned before
将“TRecArray”类型转换为“PRecArray”不会使其成为“PRecArray”。 (注意:你的“test3”当然会失败。)
关于delphi指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119659/