我刚接触 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?