Delphi不足以支持此操作的RTTI

时间:2014-03-06 08:09:36

标签: delphi rtti

我是使用 RTTI 的新手,现在我遇到了错误。

我正在尝试按名称调用过程并使用array of TValue传递参数。第一个问题是GetParameters返回一个 0长度而不是1 )的数组,我不能忽略这个尝试调用该过程一个空数组。

以下是代码:

procedure TFormGenPopUpMessaggi.ExecMethod(Form : TObject; MethodName:string; const Args: array of TValue);
var
 R : TRttiContext;
 T : TRttiType;
 M : TRttiMethod;
 LParams : TArray<TRttiParameter>;
begin
  T := R.GetType(TFormAcqGestioneRichiesteAcquisto);
  for M in t.GetDeclaredMethods do
    if (m.Parent = t) and (m.Name = MethodName)then
    Begin
      LParams := m.GetParameters;
      showmessage(IntToStr(Length(LParams)));
      M.Invoke(TFormAcqGestioneRichiesteAcquisto.Create(Self), Parametri);
    End;
end;

procedure TFormGenPopUpMessaggi.EseguiMessaggio(Sender : TObject);
  var Procedura, TipoClasse : String;
      Argomenti : String;
      ArrayArgomenti : Array of TValue;
      IdMessaggio, IdElenco : Integer;
      I : Integer;
      C : TRttiContext;
      O : TObject;
begin
    [...]`
    Procedura := QGenerica.FieldByName('NOME_PROCEDURA').AsString;
    [...]
    TipoClasse := 'U' + Copy(QGenerica.FieldByName('NOME_FORM').AsString, 6, 1000) + '.' +         QGenerica.FieldByName('NOME_FORM').AsString;

    O := (C.FindType(TipoClasse) as TRttiInstanceType).MetaClassType.Create;

    if Length(ArrayArgomenti) = 0 then
      ExecMethod(O, Procedura,[])
    else
      ExecMethod(O, Procedura, ArrayArgomenti);

[...]
End;    

被叫程序是:

procedure TrovaRichiesta(Id : Integer);

在另一个班级type TFormAcqGestioneRichiesteAcquisto公开宣布。 代码正确查找过程名称,正确创建新表单类但不提供任何参数showmessage(IntToStr(Length(LParams))) result is 0

所有其他变量都已正确初始化。是否有任何类型的键要定义,以启用RTTI?

1 个答案:

答案 0 :(得分:4)

按照here的说明,获取详细的RTTI启用{$TYPEINFO}{$METHODINFO}编译器指令。