delphi RTTI 三 属性读取与赋值
delphi RTTI 读取属性 运行期
通过RTTI给属性赋值
http://docwiki.embarcadero.com/CodeExamples/Berlin/en/Event_RTTI_Invocation_(Delphi)
http://www.cnblogs.com/del/archive/2009/10/15/1583969.html
var
context: TRttiContext;
method: TValue; // System.TMethod
methodType: TRttiInvokableType;
begin
{ Get the value of the OnChange property, which is a method pointer }
method := context.GetType(mapModel.ClassType).GetProperty('OnChange')
.GetValue(mapModel); { Display the method code and data pair }
Writeln(method.ToString); { Get event RTTI }
methodType := context.GetType(method.TypeInfo) as TRttiInvokableType;
Writeln(methodType.Name); { Invoke event }
{ The first parameter must be the procedure/method pointer in a TValue variable }
methodType.Invoke(method, [mapModel { Sender } , nil { Area } ]);
读取简单属性
procedure TForm2.Button6Click(Sender: TObject);
var
rc: TRttiContext;
v: TValue;
rm: TRttiMethod;
rt: TRttiType;
rp: TRttiProperty;
begin
//取Btn2的属性Name 和Caption
//分步
rt := TRttiContext.Create.GetType(self.Button2.ClassType);
rp := rt.GetProperty('Name');
v := rp.GetValue(self.btn2);
ShowMessage(v.AsString); //合并一步
ShowMessage( rt.GetProperty('Caption').GetValue(self.btn2).AsString); end;
修改属性
rt.GetProperty('Caption').SetValue(Button1,'New');
p.SetValue(Button1, TValue.FromOrdinal(TypeInfo(TAlign), Ord(alLeft)));
rc.GetType(Data.ClassType).GetField('FStatus').SetValue(Data, TValue.From(Status));
const
eval = 'alLeft';
p.SetValue(Panel1, TValue.FromOrdinal( p.PropertyType.Handle , Ord(alLeft)));
两种方法都可以
// tv := TValue.FromOrdinal(p.PropertyType.Handle, GetEnumValue(p.PropertyType.Handle, eval));
// p.SetValue(Panel1, tv);
//调用btn2单击方法
procedure TForm2.Button7Click(Sender: TObject);
var
tt: TRttiType;
rm: TRttiMethod;
begin
tt := TRttiContext.Create.GetType(self.btn2.ClassType);
rm := tt.GetMethod('Click');
rm.Invoke(self.btn2, []);//空参
end;
TTypeKind = (tkUnknown, tkInteger, tkChar, tkEnumeration, tkFloat,
tkString, tkSet, tkClass, tkMethod, tkWChar, tkLString, tkWString,
tkVariant, tkArray, tkRecord, tkInterface, tkInt64, tkDynArray, tkUString,
tkClassRef, tkPointer, tkProcedure {, tkMRecord});
PropInfo.PropType^.Kind = tkClass
aRPt: TRttiProperty;
aRPt.PropertyType.Handle就是PTypeInfo
aRPt.PropertyType.Handle.Kind
设置复杂的属性字体颜色 字体 Font.Size/Font.Color
procedure TForm13.Button7Click(Sender: TObject);
var
p : TRttiProperty;
p2: TRttiProperty;
c : TRttiContext;
begin
c := TRttiContext.Create;
try
p := c.GetType(Panel1.ClassInfo).GetProperty('Font');
p2 := c.GetType(p.PropertyType.Handle).GetProperty('Color');
p2.SetValue(p.GetValue(Panel1).AsObject,clred);
finally
c.Free;
end;
end; procedure TForm13.Button8Click(Sender: TObject);
var
p : TRttiProperty;
p2: TRttiProperty;
c : TRttiContext;
begin
c := TRttiContext.Create;
try
// self.Panel1.Font.Style:
p := c.GetType(Panel1.ClassInfo).GetProperty('Font');
p2 := c.GetType(p.PropertyType.Handle).GetProperty('Size');
p2.SetValue(p.GetValue(Panel1).AsObject,); //this line now works.
finally
c.Free;
end;
end;
http://stackoverflow.com/questions/6006326/how-i-can-set-the-value-of-a-nested-property-using-the-rtti?answertab=votes#tab-top
复杂类型(集合类型)tkSet
与控件实例无关,只是计算集合类型的字符串。获得某个控件当前某个集合属性的字符串参考System.TypInfo.GetSetProp
procedure GetOrdTypeInfo(ATypeInfo: PTypeInfo; AStrings: TStrings);
var
OrdTypeData: PTypeData;
I: Integer;
begin
OrdTypeData := GetTypeData(ATypeInfo);
AStrings.Add('------------------------------------');
AStrings.Add('Type Name: ' + ATypeInfo^.Name);
AStrings.Add('Type Kind: ' + GetEnumName(TypeInfo(TTypeKind),
Integer(ATypeInfo^.Kind)));
AStrings.Add('Data Type: ' + GetEnumName(TypeInfo(TOrdType),
Integer(OrdTypeData^.OrdType)));
if ATypeInfo^.Kind <> tkSet then
begin
AStrings.Add('Min Value: ' + IntToStr(OrdTypeData^.MinValue));
AStrings.Add('Max Value: ' + IntToStr(OrdTypeData^.MaxValue));
end;
if ATypeInfo^.Kind = tkSet then
GetOrdTypeInfo(OrdTypeData^.CompType^, AStrings);
if ATypeInfo^.Kind = tkEnumeration then
for I := OrdTypeData^.MinValue to OrdTypeData^.MaxValue do
AStrings.Add(Format(' Value %d: %s', [I, GetEnumName(ATypeInfo, I)]));
end; procedure TForm2.Button3Click(Sender: TObject);
begin
GetOrdTypeInfo(TypeInfo(Char), Memo1.Lines);
GetOrdTypeInfo(TypeInfo(Integer), Memo1.Lines);
GetOrdTypeInfo(TypeInfo(TFormBorderStyle), Memo1.Lines);
GetOrdTypeInfo(TypeInfo(TBorderIcons), Memo1.Lines);
GetOrdTypeInfo(TypeInfo(TMyEnum), Memo1.Lines);
GetOrdTypeInfo(TypeInfo(TDBGridOption), Memo1.Lines);
end;
TypeInfo(TPicture);
TypeInfo(TBitmap)
DBGrid
PropertyName:Options
Type Name: TDBGridOptions
Type Kind: tkSet
Data Type: otUWord
------------------------------------
Type Name: TDBGridOption
Type Kind: tkEnumeration
Data Type: otUByte
Min Value: 0
Max Value: 14
Value 0: dgEditing
Value 1: dgAlwaysShowEditor
Value 2: dgTitles
Value 3: dgIndicator
Value 4: dgColumnResize
Value 5: dgColLines
Value 6: dgRowLines
Value 7: dgTabs
Value 8: dgRowSelect
Value 9: dgAlwaysShowSelection
Value 10: dgConfirmDelete
Value 11: dgCancelOnExit
Value 12: dgMultiSelect
Value 13: dgTitleClick
Value 14: dgTitleHotTrack
gridEh控件
PropertyName:OptionsEh
Type Name: TDBGridEhOption
Type Kind: tkEnumeration
Data Type: otUByte
Min Value: 0
Max Value: 23
Value 0: dghFixed3D
Value 1: dghFrozen3D
Value 2: dghFooter3D
Value 3: dghData3D
Value 4: dghResizeWholeRightPart
Value 5: dghHighlightFocus
Value 6: dghClearSelection
Value 7: dghFitRowHeightToText
Value 8: dghAutoSortMarking
Value 9: dghMultiSortMarking
Value 10: dghEnterAsTab
Value 11: dghTraceColSizing
Value 12: dghIncSearch
Value 13: dghPreferIncSearch
Value 14: dghRowHighlight
Value 15: dghDblClickOptimizeColWidth
Value 16: dghDialogFind
Value 17: dghRecordMoving
Value 18: dghShowRecNo
Value 19: dghColumnResize
Value 20: dghColumnMove
Value 21: dghAutoFitRowHeight
Value 22: dghHotTrack
Value 23: dghExtendVertLines
通过RTTI给StringGrid单元格赋值
参考
http://stackoverflow.com/questions/15702778/how-can-i-set-get-property-value-through-rtti-for-compex-things-like-tstringgrid
var
ctx: TRttiContext;
rttitype: TRttiType;
rttiprop: TRttiIndexedProperty;
value: TValue;
begin
rttitype := ctx.GetType(StringGrid1.ClassType);
rttiprop := rttitype.GetIndexedProperty('Cells');
value := rttiprop.GetValue(StringGrid1, [, ]);
rttiprop.SetValue(StringGrid1, [, ], value.ToString + ' hello');
end;
判断属性类型
procedure DeserializeProperty(P: TRttiProperty; s: string);
var
v: TValue;
begin
case p.PropertyType.TypeKind of
tkInteger: v := StrToInt(s);
tkFloat: v := StrToFloat(s);
tkString: v := s;
end;
p.SetValue(self, v);
end;
delphi RTTI 三 属性读取与赋值的更多相关文章
- delphi RTTI 四 获取类属性列表
delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...
- delphi使用SQL的教程4(使用Params属性为参数赋值 )
17.4.1 使用Params属性为参数赋值 TQuery部件具有一个Params属性,它们在设计时不可用,在程序运行过程中可用,并且是动态建立的,当为TQuery部件编写动态SQL 语句时, D ...
- KnockoutJS 3.X API 第三章 计算监控属性(2) 可赋值的计算监控属性
.liveexample{ padding: 1em; background-color: #eeeedd; border: 1px solid #ccc; max-width: 655px; fon ...
- geotrellis使用(十一)实现空间数据库栅格化以及根据属性字段进行赋值
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 安装空间数据库 空间数据库栅格化 根据属性字段进行赋 ...
- (转载)Delphi StringGrid常用属性和常用操作
Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...
- 一句话改变TWinControl控件的left坐标的前世今生(入口函数是SetBounds,然后调用SetWindowPos起作用,并发消息更新Delphi的left属性值)
Delphi的重要属性,主要是Enable, Visible, Color, left等等.这里分析left,因为TWinControl里有些覆盖函数的原因,虽然起点都是TControl.SetLe ...
- GDAL库三个读取Jpeg2000格式驱动测试
0.目的 GDAL库中提供了四五种读取Jpeg2000的驱动,但是各个驱动读取数据的效率各不相同,下面就针对三种读取jpeg2000的效率进行测试. GDAL库中提供的读取Jpeg2000的驱动有下面 ...
- php删除多重数组对象属性,重新赋值的方法
php删除多重数组对象属性,重新赋值的方法 实例:sphinx搜索出来的结果,要去掉某个属性值:$cl = new SphinxClient ();$query = $cl->Query ( $ ...
- C# 类构造函数赋值里属性与字段赋值注意项
public class Test { public Test(int age) { this.Age=age;//如果这里使用的是this.age=age;那么属性里的判断将不会执行 } priva ...
随机推荐
- Mongodb安装超长等待
最近安装了一下mongodb最新版3.6下载各个版本安装都是停在installing MongoDB Compass位置,网上看到说可以等段时间之类的发现等了1个晚上居然还没成功,取消安装也不行. 于 ...
- java设计模式-State模式
1.背景: MM的状态是非常不固定的,说不定刚才还非常高兴,没准一会就生气了.就跟六月的天似的,说变就变. 封装一下MM的状态:smile,cry,say:MM的状态决定了这些方法该怎么执行. 2 ...
- 解决python中路径中包含中文无法找到文件的问题
a="C:\Users\Dell\Desktop\ATOU\公共测试用例" (带中文的路径) a=a.decode("utf-8").encode(" ...
- [转][Centos]常用命令之:ls和cd
来自:https://www.cnblogs.com/zerotomax/p/7224927.html ls 类似于 dir 在使用centos这个linux系统的时候,我们总是免不了需要查看当前目录 ...
- jdbi
JDBI是一个使用方便的SQL开发库,用符合Java语言习惯的集合.Bean等方式,提供关系数据库访问接口,同时保留了JDBC类似的信息.JDBI提供了链式和SQL两种风格的API. jdbi的网址是 ...
- Jmeter(二十九)Jmeter-Question之“Ant集成报告模板优化”
也是在和朋友探讨的时候,发现一个问题,Jmeter在与Ant集成的时候,通常选用的模板是jmeter自带的两个样式表 该自带的样式,节省了大家搭建框架的时间,不需要自己重新写样式,当然也相对简洁: 做 ...
- TF-IDF算法原理
原文:https://www.cnblogs.com/biyeymyhjob/archive/2012/07/17/2595249.html TF-IDF(term frequency–inverse ...
- int main(int argc,char* argv[])浅析
int main(int argc,char* argv[])浅析 argc : 指输入参数个数,默认值1,就是执行程序名称 argv[] : 输入参数数组指针 举个栗子: 1. 编写一个argc.c ...
- virtualbox创建虚拟机
两种方式: 1.使用.vdi硬盘镜像文件 2.使用操作系统新建 方法1: #结束! 方法2:
- 【LeetCode】3. 无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...