Чисто RTTI подход с использованием TRttiMethod.Invoke()
будет выглядеть примерно так:
var
ctx: TRttiContext;
t: TRttiInstanceType;
m: TRttiMethod;
params: TArray<TRttiParameter>;
v: TValue;
inst: TControl;
begin
t := ctx.FindType(Edit1.Text) as TRttiInstanceType;
if t = nil then Exit;
if not t.MetaclassType.InheritsFrom(TControl) then Exit;
for m in t.GetMethods('Create') do
begin
if not m.IsConstructor then Continue;
params := m.GetParameters;
if Length(params) <> 1 then Continue;
if params[0].ParamType.Handle <> TypeInfo(TComponent) then Continue;
v := m.Invoke(t.MetaclassType, [TComponent(Form1)]);
inst := v.AsType<TControl>();
// or: inst := TControl(v.AsObject);
Break;
end;
inst.Parent := ...;
...
end;
гораздо более простой подход, который не использует TRttiMethod.Invoke()
будет выглядеть следующим образом:
type
// TControlClass is defined in VCL, but not in FMX
TControlClass = class of TControl;
var
ctx: TRttiContext;
t: TRttiInstanceType;
inst: TControl;
begin
t := ctx.FindType(Edit1.Text) as TRttiInstanceType;
if t = nil then Exit;
if not t.MetaclassType.InheritsFrom(TControl) then Exit;
inst := TControlClass(t.MetaclassType).Create(Form4);
inst.Parent := ...;
//...
end;
Большое спасибо, что сделал трюк, но что, если мне нужно установить свойство Text элемента управления? –
'Text' - это публичное свойство' TTextControl', которое происходит от 'TControl'. Таким образом, либо создавайте тип 'inst' to' TTextControl' для прямого доступа к «Тексту», либо используйте RTTI для получения «TRttiProperty» для «Text», а затем вызывайте 'TRttiProperty.SetValue()'. –
Хорошо! Я поеду с первым вариантом! Благодаря! –