【问题标题】:Delphi Insufficient RTTI available to support this operationDelphi 可用的 RTTI 不足,无法支持此操作
【发布时间】:2014-04-08 17:47:22
【问题描述】:

我刚开始使用 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,是否需要定义任何类型的键?

【问题讨论】:

  • 如果您提供一个完整的程序(SSCCE)可能会有所帮助。
  • 尝试创建 SSCCE 我发现我的代码在我的原始项目之外工作(创建了一个新项目)。 GetParameters 也返回 1,因此它正确读取参数计数。这是我的项目中的一些东西,它不起作用但不知道它可能是什么......还在表单项目和涉及的两个单元中添加了 {$M+} 但没有任何改变...... delphi 中两个项目的选项ide 完全一样。还有什么要检查的吗??
  • 我不知道。很明显,在我们拥有 SSCCE 之前,我们无法真正提供帮助。
  • 你得到什么错误?你是在运行时还是编译时得到它?由于您无法创建 SSCCE:您可以进一步压缩代码并仍然产生问题吗?你可以在硬编码类名时重现它吗?类在哪里声明?

标签: delphi rtti


【解决方案1】:

要获得详细的 RTTI,请按照 here 的说明打开 {$TYPEINFO}{$METHODINFO} 编译器指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2023-01-14
    • 1970-01-01
    • 2020-11-07
    • 2011-05-04
    • 2011-09-11
    相关资源
    最近更新 更多