Invoke 类型转换错误

hdj_myth 2011-12-20 10:34:44

unit Unit3;

interface

uses
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;
...全文
90 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jekhn 2011-12-20
  • 打赏
  • 举报
回复
是Form3不是TForm3,你得注意一下动态数组的下标是从0开始的不是1
hdj_myth 2011-12-20
  • 打赏
  • 举报
回复
自己解决了
hdj_myth 2011-12-20
  • 打赏
  • 举报
回复

unit Unit3;

interface

uses
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.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧