记录为程序

时间:2014-11-13 11:29:51

标签: delphi

是否可以创建可以作为过程调用的记录? 例:

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;

但在这种情况下,我需要始终使用虚构结果创建函数并使用尖括号。

2 个答案:

答案 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');