2016-08-26 3 views
0

最終的にRTTIを使用してフォームの子としてビジュアルコンポーネントを実行時に作成するにはどうすればよいですか? 私が得たすべてがTValueインスタンスです...文字列からのDelphi Firemonkeyコンポーネントのランタイム作成

t := (ctx.FindType(Edit1.Text) as TRttiInstanceType); 
inst:= t.GetMethod('Create').Invoke(t.MetaclassType,[Form1]); 

ありがとうございました! TRttiMethod.Invoke()を使用して

答えて

1

純粋に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; 

Aはるかに簡単な方法は、次のようになります。

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; 
+0

はなかったことを、本当にありがとうございましたトリックだけど、コントロールのTextプロパティを設定する必要がある場合はどうすればいいですか? –

+1

'Text'は' TControl'から派生した 'TTextControl'のパブリックプロパティです。ですから 'Text'に直接アクセスする' TTextControl'に 'inst'をタイプキャストするか、RTTIを使って' Text'の 'TRttiProperty'を取得してから' TRttiProperty.SetValue() 'を呼び出してください。 –

+0

私は最初のオプションで行く!ありがとう! –

関連する問題