unit Unit3;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm3 = class(TForm)
    mo1: TMemo;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure say(str: string);
  end;var
  Form3: TForm3;implementation{$R *.dfm}uses
  Rtti;procedure TForm3.btn1Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
begin
  mo1.Clear;
  for t in ctx.GetTypes do
    mo1.Lines.Add(t.Name);
end;procedure TForm3.btn2Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
  m: TRttiMethod;
begin
  mo1.Clear;
  t := ctx.GetType(TForm3);
  for m in t.GetMethods do
    mo1.Lines.Add(m.Name);
end;procedure TForm3.btn3Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
  f: TRttiField;
begin
  mo1.Clear;
  t := ctx.GetType(TButton);
  for f in t.GetFields do
    mo1.Lines.Add(f.Name);
end;procedure TForm3.btn4Click(Sender: TObject);
var
  ctx: TRttiContext;
  t: TRttiType;
  m: TRttiMethod;
  V: TValue;
begin
  t := ctx.GetType(TForm3);
  m := t.GetMethod('say');
  V := TValue.From<string>('123');
  m.Invoke(TForm3, V);//此处报错Invalid class typecast.
end;procedure TForm3.say(str: string);
begin
  mo1.Clear;
  mo1.Lines.Add(str);
end;

解决方案 »

  1.   


    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm3 = class(TForm)
        mo1: TMemo;
        btn1: TButton;
        btn2: TButton;
        btn3: TButton;
        btn4: TButton;
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
        procedure btn3Click(Sender: TObject);
        procedure btn4Click(Sender: TObject);
      private
        { Private declarations }
      public
        procedure say(str: string);
      end;var
      Form3: TForm3;implementation{$R *.dfm}uses
      Rtti;procedure TForm3.btn1Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
    begin
      mo1.Clear;
      for t in ctx.GetTypes do
        mo1.Lines.Add(t.Name);
    end;procedure TForm3.btn2Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
      m: TRttiMethod;
    begin
      mo1.Clear;
      t := ctx.GetType(TForm3);
      for m in t.GetMethods do
        mo1.Lines.Add(m.Name);
    end;procedure TForm3.btn3Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
      f: TRttiField;
    begin
      mo1.Clear;
      t := ctx.GetType(TButton);
      for f in t.GetFields do
        mo1.Lines.Add(f.Name);
    end;procedure TForm3.btn4Click(Sender: TObject);
    var
      ctx: TRttiContext;
      t: TRttiType;
      m: TRttiMethod;
      V: array of TValue;
    begin
      t := ctx.GetType(TForm3);
      m := t.GetMethod('say');
      SetLength(V, 1);
      V[1] := TValue.From<string>('123');
      m.Invoke(TForm3, V);//此处报错Invalid class typecast.
    end;procedure TForm3.say(str: string);
    begin
      mo1.Clear;
      mo1.Lines.Add(str);
    end;end.
      

  2.   

    是Form3不是TForm3,你得注意一下动态数组的下标是从0开始的不是1