是否可以创建可以作为过程调用的记录? 例:
Var
R: TTestRecord;
begin
R(1);
// or
R(1, 'Sametext');
end;
我尝试使用运算符重载,如下所示:
TProcedure = procedure (const Value: Integer) of object;
TTestRecord= record
class operator Implicit(const Value: TTestRecord): TProcedure;
end;
但它不起作用。
我知道我可以使用默认索引属性并像这样写
Var
R: TTestRecord;
begin
R[1];
// or
R[1, 'Sametext'];
end;
但在这种情况下,我需要始终使用虚构结果创建函数并使用尖括号。
答案 0 :(得分:0)
你唯一的希望是使这个语法编译和函数将是运算符重载。此处列出了可以重载的运算符:http://docwiki.embarcadero.com/RADStudio/en/Operator_Overloading_(Delphi)
函数调用不在可重载的运算符列表中。因此,无法实现所需的语法。
答案 1 :(得分:0)
另一种制作方式:
首先我创建了一个示例类,但您可以使用任何类。
type
TAnyObject = class
procedure MyMethod;
end;
implementation
procedure TAnyObject.MyMethod;
begin
ShowMessage('OK');
end;
现在使用此功能执行您的程序。
type
procedure T(var InstantiatedObject: TObject; ProcedureName: String);
implementation
uses Rtti;
procedure T(var InstantiatedObject: TObject; ProcedureName: String);
var
LRttiContext: TRttiContext;
LRttiType: TRttiType;
LRttiMethod: TRttiMethod;
begin
LRttiContext := TRttiContext.Create;
try
LRttiType := LRttiContext.GetType(InstantiatedObject.ClassType);
LRttiMethod := LRttiType.GetMethod(ProcedureName);
LRttiMethod.Invoke(InstantiatedObject,[]);
finally
LRttiContext.Free;
end;
end;
以下是使用此程序的示例:
var
LAnyObject : TAnyObject;
begin
LAnyObject := TAnyObject.Create;
T(TObject(LAnyObject),'MyMethod');
或:
var
LAnyObject : TObject;
begin
LAnyObject := TAnyObject.Create;
T(LAnyObject,'MyMethod');