Delphi 使用 RTTI 动态通过名称调用函数和设置控件属性值
2010-10-15 11:42
603 查看
// 设置控件的属性名
uses TypInfo, JclAnsiStrings;
function GetObject(obj:TObject; path:String): TObject;
var objName:String;
begin
Result := obj;
while System.Length(path) > 0 do begin
objName := JclAnsiStrings.StrToken(path, '.');
if obj is TComponent then begin
Result := TComponent(Result).FindComponent(objName);
end else begin
Result := TypInfo.GetObjectProp(Result, objName);
end;
end;
end;
procedure SetPropValue(obj:TObject; path:String; value:Variant);
var tk:TTypeKind;
i:Integer;
propName:String;
begin
i := JclAnsiStrings.StrLastPos('.', path);
if i > 0 then begin
obj:= GetObject(obj, JclAnsiStrings.StrLeft(path, i-1));
propName:= JclAnsiStrings.StrRestOf(path, i+1);
end else begin
propName := path;
end;
TypInfo.SetPropValue(obj, propName, value);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetPropValue(Self, 'button1.caption', 'test');
SetPropValue(Self, 'button1.width', '200');
SetPropValue(Self, 'label1.Visible', false);
end;
// 动态调用函数/过程
type
TMyProcedure = procedure of object;
TMyMethod = function(x, y: Integer): integer of object;
function GetMethod(obj: TObject; MethodName: string): TMethod;
var Rounte: TMethod;
begin
Result := nil;
Rounte.Data := Pointer(obj);
Rounte.Code := obj.MethodAddress(MethodName);
if not System.Assigned(Rounte.Code) then Exit;
Result := Rounte;
end;
procedure Form1.Button1Click(Sender:TObject);
var m1: TMyProcedure;
m2: TMyMethod;
i:Integer;
begin
m1 := TMyProcedure(GetMethod(Self, 'show'));
m1(); // execute
m2 := TMyMethod(GetMethod(), 'Add');
i := m2(1,2); // execute
end;
uses TypInfo, JclAnsiStrings;
function GetObject(obj:TObject; path:String): TObject;
var objName:String;
begin
Result := obj;
while System.Length(path) > 0 do begin
objName := JclAnsiStrings.StrToken(path, '.');
if obj is TComponent then begin
Result := TComponent(Result).FindComponent(objName);
end else begin
Result := TypInfo.GetObjectProp(Result, objName);
end;
end;
end;
procedure SetPropValue(obj:TObject; path:String; value:Variant);
var tk:TTypeKind;
i:Integer;
propName:String;
begin
i := JclAnsiStrings.StrLastPos('.', path);
if i > 0 then begin
obj:= GetObject(obj, JclAnsiStrings.StrLeft(path, i-1));
propName:= JclAnsiStrings.StrRestOf(path, i+1);
end else begin
propName := path;
end;
TypInfo.SetPropValue(obj, propName, value);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SetPropValue(Self, 'button1.caption', 'test');
SetPropValue(Self, 'button1.width', '200');
SetPropValue(Self, 'label1.Visible', false);
end;
// 动态调用函数/过程
type
TMyProcedure = procedure of object;
TMyMethod = function(x, y: Integer): integer of object;
function GetMethod(obj: TObject; MethodName: string): TMethod;
var Rounte: TMethod;
begin
Result := nil;
Rounte.Data := Pointer(obj);
Rounte.Code := obj.MethodAddress(MethodName);
if not System.Assigned(Rounte.Code) then Exit;
Result := Rounte;
end;
procedure Form1.Button1Click(Sender:TObject);
var m1: TMyProcedure;
m2: TMyMethod;
i:Integer;
begin
m1 := TMyProcedure(GetMethod(Self, 'show'));
m1(); // execute
m2 := TMyMethod(GetMethod(), 'Add');
i := m2(1,2); // execute
end;
相关文章推荐
- 一句话改变TWinControl控件的left坐标的前世今生(入口函数是SetBounds,然后调用SetWindowPos起作用,并发消息更新Delphi的left属性值)
- Flex反射:通过调用getDefintionByName函数动态创建按钮等控件的例子
- 使用SetTimer函数为Delphi的Win控件设置时钟
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
- C# 利用函数名称(字符串)函数名调用对应函数(不使用委托、Action和函数指针)
- Devexpress控件使用皮肤,设置默认皮肤及动态换肤
- 使用ADF-BC 实现查询功能之四:通过代码动态设置Where条件参数
- Android在使用WebView时,通过Javascript调用JAVA函数
- 通过函数调用使用冒泡法
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明
- java 通过方法名称动态调用方法
- C#通过反射来动态创建类对象并调用相关泛型函数(Excel数据自动导入到SQL Server数据库)
- dll函数动态调用工具1.0(Delphi+asm实现)
- Qt主窗体显示最前 在delphi中使用Application.BringToFront;可以保证当前程序显示在最前。 然而今天在Qt中,没有类似函数供调用。 尝试了activeWindow,s
- MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应
- delphi通过函数名动态调用函数的方法(方便功能的扩展)
- 使用动态包导出函数的调用单元完整源代码
- ASP.NET 使用CustomValidator调用js函数动态修改验证TextBox的正则表达式,无刷新
- VC++ 的类中使用函数指针的小例子,通过函数指针调用不同的函数
- android 动态设置控件的高度,使用对应布局中的dp值