备案

2017-09-25 21 views
1

德尔福记录帮手我有这样的代码:备案

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转换为fraction的函数。我认为记录帮手就是我需要的,但为什么这不起作用?

{ TSupport } 

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

如果你想知道,TFunction是一个类(在同一单元作为记录/记录助手),它具有DoubleToFraction类函数返回过程的字符串。

E2010不兼容的类型:“双师型”和“TSolution”

确定这是错误,但如果我不使用自话,我怎么可以把参数?参数可以是x1,x2,i1或i2,具体取决于我需要的。在上面的例子中,在Memo1中,我应该将x1(参数)转换为分数。在这里做什么?


我已经注意到,如果你写例如

TSupport = record helper for double 

然后自我的作品!基本上我想知道如何避免自我提及TSolution记录,而是涉及双重领域。

+0

但是,为什么你需要帮助你自己的类型?为什么不将功能/属性添加到TSolution? – MBo

+0

@MBo因为我已经有了toFraction的类函数。我想能够添加到我的TSolution“快速”像k.x1.toFraction而不是k.toFraction(k.x1) –

+0

这完全忽略了这一点。将一个方法添加到调用你的类函数的TSolution。在这里使用助手是完全滥用功能。 –

回答

3

这是错误的上下文:你叫

k.x1.toFraction 

这意味着你调用一个函数toFraction对应于x1,但它是一个double,不TSolution

您的辅助函数会被调用的形式类似于

k.toFraction 

我认为toFraction事先知道采取哪些变量x1, x2, i1, i2: double;的。否则,你可以写一个帮助双重。在@Remy勒博考虑

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功能,似乎双是一个纪录。

+0

但是,如果我使用记录助手Double,将删除所有其他默认操作,我可以有一个双。不是吗? –

+0

好的,非常感谢你 –

+1

@RaffaeleRossi:如果你的意思是你的帮助者将会替换在[定义在'SysUtils'单位,那么是的,它会。一次只能有一个帮助器在给定类型上处于活动状态。 –