Delphi记录助手记录

时间:2017-09-25 13:48:53

标签: delphi

我有这段代码:

type
 TSolution = record
  x1, x2, i1, i2: double;
 end;

 TSupport = record helper for TSolution 
  function toFraction: string;
 end;

我希望能够在内部(例如)按钮点击事件中调用类似的内容:

var k: TSolution;
begin

 //...
 Memo1.Lines.Add(k.x1.toFraction);
 //...

end;

其中toFraction是我编写的一个函数,它将double转换为一个分数。我认为我需要一个记录助手,但为什么这不起作用?

{ TSupport }

function TSupport.toFraction: string;
begin
 Result := TFunction.DoubleToFraction(self);
end;

如果您想知道,TFunction是一个类(与记录/记录助手在同一个单元中),它有DoubleToFraction类函数,它返回一个字符串。

  

E2010不兼容的类型:'Double'和'TSolution'

好的,这是错误,但如果我不使用自我,那么我该如何获取参数?参数将是x1,x2,i1或i2,具体取决于我的需要。在上面的例子中,在Memo1里面我应该将x1(参数)转换为分数。该怎么办?

我注意到,如果你写的是

TSupport = record helper for double

然后自我工作!基本上我想知道如何避免Self引用TSolution记录,但是要引用它的双重字段。

1 个答案:

答案 0 :(得分:3)

这是错误的背景:你打电话

k.x1.toFraction

这意味着您调用与toFraction对应的函数x1,但它是double,而不是TSolution

您的辅助函数将被调用,如

k.toFraction

我认为toFraction事先知道要采用哪个变量x1, x2, i1, i2: double;。否则你可以为double编写一个帮助器。

关于@Remy Lebeau考虑的

APENDED

你可以使用这样的结构:

TMyDouble = record
  private
    class var FX: double;
  public
    class property X: double read FX write FX;
    class operator Implicit(a: TMyDouble): double;
    class operator Implicit(a: double): TMyDouble;
    function toFraction: string;
  end;

function TMyDouble.toFraction: string;
begin
  result := FloatToStr(self.FX { .Fraction } ); // or other FX.methods
end;

class operator TMyDouble.Implicit(a: TMyDouble): double;
begin
  result := FX
end;

class operator TMyDouble.Implicit(a: double): TMyDouble;
begin
  result.FX := a;
end;

它将模拟double功能,并且似乎是双重记录。