相关疑难解决方法(0)

Delphi,记录类型属性,记录字段分配:分配给预期的记录的本地副本

在以上的问题“左边不能被分配到”在德尔福记录类型的属性,有一个答案椿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)

delphi compiler-errors record

8
推荐指数
1
解决办法
180
查看次数

记录属性的 DWScript setter

我的问题很简单。我有一个具有以下代码的 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 dwscript

5
推荐指数
1
解决办法
308
查看次数

将项目从2009升级到XE时出现Delphi"E2064左侧无法分配"错误

我读到了这个问题,其中讨论了同样的问题,无论如何我能够在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)

delphi compiler-errors delphi-2009 delphi-xe

4
推荐指数
1
解决办法
2526
查看次数

Delphi:类中的记录

以下情况:

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 records delphi-2007 delphi-2010

3
推荐指数
1
解决办法
3842
查看次数