Delphi缺少RTTI来支持此操作。

3

我刚接触 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))) 返回 0。

所有其他变量都正确初始化。是否有定义键来启用 RTTI?


2
如果您提供一个完整的程序,即一个SSCCE(Short, Self-Contained, Correct Example),可能会更有帮助。 - David Heffernan
1
尝试创建SSCCE时,我发现我的代码在原始项目之外(创建了一个新项目)可以正常工作。GetParameters也返回1,因此正确读取参数计数。但是在我的项目中有些东西不起作用,但不知道可能是什么...还在表单项目和涉及的两个单元中添加了{$M+},但没有任何变化...Delphi IDE中两个项目的选项完全相同。还有其他要检查的吗? - user3383021
我不知道。看起来我们在拥有一个SSCCE之前无法真正提供帮助。 - David Heffernan
你遇到了什么错误?是在运行时还是编译时出现的?由于你无法创建一个SSCCE:你能进一步简化代码并仍然产生问题吗?当硬编码类名时,你能重现它吗?这个类在哪里声明的? - Jeroen Wiert Pluimers
1个回答

4

要获取详细的RTTI信息,请按照{$TYPEINFO}{$METHODINFO}编译指令,在此处有详细说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接