在以上的问题“左边不能被分配到”在德尔福记录类型的属性,有一个答案椿Krijthe演示如何分配至创纪录的财产的字段可以由记录的声明中使用特性来完成。为便于参考,以下是Toon Krijthe发布的代码段。
type
TRec = record
private
FA : integer;
FB : string;
procedure SetA(const Value: Integer);
procedure SetB(const Value: string);
public
property A: Integer read FA write SetA;
property B: string read FB write SetB;
end;
procedure TRec.SetA(const Value: Integer);
begin
FA := Value;
end;
procedure TRec.SetB(const Value: string);
begin
FB := Value;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FRec : TRec;
public
property Rec : TRec read FRec write FRec; …Run Code Online (Sandbox Code Playgroud) 我的问题很简单。我有一个具有以下代码的 dwsUnit:
type
TPointCoord = record
X: Float;
Y: Float;
Z: Float;
end;
type
TMyClass = class
private
fPosition: TPointCoord;
function GetPosition: TPointCoord;
procedure SetPosition(Val: TPointCoord);
public
property Position: TPointCoord read GetPosition write SetPosition;
constructor Create;
end;
function TMyClass.GetPosition: TPointCoord;
begin
Result := fPosition;
end;
procedure TMyClass.SetPosition(Val: TPointCoord);
begin
fPosition := Val;
end;
constructor TMyClass.Create;
begin
inherited Create;
fPosition.X := 1;
fPosition.Y := 2;
fPosition.Z := 3;
end;
var
mc: TMyClass;
begin
mc := TMyClass.Create;
mc.Position.X := 2; //Syntax Error …Run Code Online (Sandbox Code Playgroud) 我读到了这个问题,其中讨论了同样的问题,无论如何我能够在Delphi 2009中做到这一点,这是不可能的,因为我升级到XE.
我在这里粘贴一个简单的虚拟示例:这在2009年编译并在XE上提供E2064 ...为什么?是否有可能将XE设置为像2009年一样?或者我应该去寻找解决方法?
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TTestRecord = record
FirstItem : Integer;
SecondItem : Integer;
end;
TForm2 = class(TForm)
procedure AssignValues;
private
FTestRecord :TTestRecord;
public
property TestRecord : TTestRecord read FTestRecord write FTestRecord;
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.AssignValues;
begin
with TestRecord do
begin
FirstItem := 14; // this gives error in XE but not in 2009
SecondItem := 15;
end;
end; …Run Code Online (Sandbox Code Playgroud) 以下情况:
type
TRec = record
Member : Integer;
end;
TMyClass = class
private
FRec : TRec;
public
property Rec : TRec read FRec write FRec;
end;
Run Code Online (Sandbox Code Playgroud)
以下不起作用(左侧不能分配),这是可以的,因为它TRec是一个值类型:
MyClass.Rec.Member := 0;
Run Code Online (Sandbox Code Playgroud)
在D2007中,虽然以下内容有效:
with MyClass.Rec do
Member := 0;
Run Code Online (Sandbox Code Playgroud)
不幸的是,它在D2010中不起作用(我认为它在D2009中也不起作用).第一个问题:为什么?故意改变了吗?或者它只是其他一些变化的副作用?D2007的解决方法只是一个"错误"吗?
第二个问题:您如何看待以下解决方法?使用安全吗?
with PRec (@MyClass.Rec)^ do
Member := 0;
Run Code Online (Sandbox Code Playgroud)
我在这里谈论现有代码,因此必须进行的更改才能使其工作应该是最小的.
谢谢!
delphi ×4
delphi-2007 ×1
delphi-2009 ×1
delphi-2010 ×1
delphi-xe ×1
dwscript ×1
record ×1
records ×1