我有这段代码:
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记录,但是要引用它的双重字段。
答案 0 :(得分:3)
这是错误的背景:你打电话
k.x1.toFraction
这意味着您调用与toFraction
对应的函数x1
,但它是double
,而不是TSolution
。
您的辅助函数将被调用,如
k.toFraction
我认为toFraction
事先知道要采用哪个变量x1, x2, i1, i2: double;
。否则你可以为double编写一个帮助器。
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
功能,并且似乎是双重记录。