Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > вызов конструктора через RTTI


Автор: dvamaster 2.6.2011, 19:26
Доброго времени суток!

Как можно вызвать через RTTI конструктор с параметрами, чтобы создать объект.

Код

var
  rt: TRttiType;
  rm: TRttiMethod;
begin
  Result := false;
  rt := rttic.FindType(FClass);
  if rt = nil then
    begin
      FErrorStr := 'not found class "' + FClass + '"';
      Exit
    end;
  rm := rt.GetMethod('Create');
  if rm = nil then
    begin
      FErrorStr := 'not found method "Create"';
      Exit
    end;


как теперь его вызвать?
Какие параметры использовать в Invoke? результат должен получится как после вызова Create(nil)

Или конструкторы вызываются иначе?

Автор: CodeMonkey 2.6.2011, 23:48
Ммм.... интереса ради: а зачем такое надо?  smile 

Автор: dvamaster 3.6.2011, 06:56
Что-то навроде скриптинга (хранение описания форм в БД).

Сейчас изучаю исходники скриптовых систем

Автор: THandle 3.6.2011, 07:47
dvamaster, тут было нечто смежное, может быть будет интересно:

http://forum.vingrad.ru/index.php?showtopic=231619&view=findpost&p=1673891
http://forum.vingrad.ru/index.php?showtopic=231619&view=findpost&p=1674543
http://forum.vingrad.ru/index.php?showtopic=231619&view=findpost&p=1675057
http://forum.vingrad.ru/index.php?showtopic=231619&view=findpost&p=1678005

Автор: dvamaster 3.6.2011, 09:41
Ура, нашел!!!

http://delphi2010.ru/?p=218

Код

program Project12;
{$APPTYPE CONSOLE}
uses
  Classes, Rtti, TypInfo;
var
  ctx : TRttiContext;
  t : TRttiType;
  Param : TRttiParameter;
  AddMethod : TRttiMethod;
  SL : TValue; // Contains TStringList instance

begin
  ctx := TRttiContext.Create;
  t := ctx.GetType(TStringList.ClassInfo);
  // Create an Instance of TStringList
  SL := t.GetMethod('Create').Invoke(t.AsInstance.MetaclassType,[]);
  // Invoke "Add" and return string representatino of result.
  Writeln(t.GetMethod('Add').Invoke(SL,['Hello World']).ToString);
  // Write out context.
  Writeln((sl.AsObject as TStringList).Text);
  readln;
  ctx.Free;
end.


и еще, формирование параметра TValue

Код

var
  p: TValue;
begin
  TValue.Make(@Application, TypeInfo(TApplication), p);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)