【发布时间】: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:您可以进一步压缩代码并仍然产生问题吗?你可以在硬编码类名时重现它吗?类在哪里声明?