備案

2017-09-25 20 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'單位,那麼是的,它會。一次只能有一個幫助器在給定類型上處於活動狀態。 –