Delphi 检查组件是否具有文本属性
如何检查组件是否具有文本属性。正如我所读到的,Rtti将是一个很好的解决方案,但我以前没有使用过它。任何帮助都将不胜感激Delphi 检查组件是否具有文本属性,delphi,delphi-xe,Delphi,Delphi Xe,如何检查组件是否具有文本属性。正如我所读到的,Rtti将是一个很好的解决方案,但我以前没有使用过它。任何帮助都将不胜感激 function HasTextProp(aControl: TControl): Boolean; begin Result := False; if (aComponent is ?) then Exit(True); end; var ObjList: TObjectList<TControl>; ObjIdx: Integer;
function HasTextProp(aControl: TControl): Boolean;
begin
Result := False;
if (aComponent is ?) then
Exit(True);
end;
var
ObjList: TObjectList<TControl>;
ObjIdx: Integer;
begin
ObjList := TObjectList<TControl>.Create,
ObjList.Add(comp1); {is TcxButton}
ObjList.Add(comp2); {is Tedit}
ObjList.Add(comp3); {is TDateTimeEdit}
for ObjIdx := 0 to lObjList.Count -1 do
begin
if HasTextProp(lObjList.Items[ObjIdx]) then
do something...
end;
end;
函数HasTextProp(aControl:TControl):布尔值;
开始
结果:=假;
如果(组件是?)那么
退出(真);
结束;
变量
对象列表:对象列表;
ObjIdx:整数;
开始
对象列表:=TObjectList.Create,
对象列表添加(组件1);{是TcxButton}
对象列表添加(组件2);{是Tedit}
对象列表添加(comp3);{is TDateTimeEdit}
对于ObjIdx:=0到lObjList.Count-1 do
开始
如果HasTextProp(lObjList.Items[ObjIdx]),则
做点什么。。。
结束;
结束;
例如,已发布的属性:
uses
System.TypInfo;
function HasTextProp(AControl: TControl): Boolean;
begin
Result := IsPublishedProp(AControl, 'Text');
end;
Victoria向您展示了如何使用旧式RTTI实现您的目标,该RTTI仅适用于已发布的属性,而不适用于其他内容。在Delphi 2010及更高版本中,有一种新型RTTI,几乎可以处理所有内容(私有/受保护/公共/已发布、属性、数据成员等),还可以实现您的目标,例如:
uses
..., System.TypInfo, System.Rtti;
function HasTextProp(aControl: TControl): Boolean;
var
Ctx: TRttiContext;
Prop: TRttiProperty;
begin
Prop := Ctx.GetType(aControl.ClassType).GetProperty('Text');
Result := (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]);
end;
你用RTTI做了什么?FWIW TControl有一个文本属性,它只是受保护的。所以我猜您想知道从TControl继承的具体类是否已公开或发布。谢谢Victoria!这就是我要找的。如果我想检查它的值呢?假设
Text
是字符串属性,您可以使用GetStrProp(AControl,'Text')'
。非常感谢!非常感谢,这是有用的。我可以确认这工作得很好!只是对于我在TEdit
和TComboBox
控件中的小问题来说,这部分代码有点太多了,我喜欢在这些控件中读写它们的.SelStart
和一些其他属性。
var
Ctrl: TControl
Ctx: TRttiContext;
Prop: TRttiProperty;
begin
...
Ctrl := lObjList.Items[ObjIdx];
Prop := Ctx.GetType(Ctrl.ClassType).GetProperty('Text');
if (Prop <> nil) and (Prop.Visibility in [mvPublic, mvPublished]) then
begin
if Prop.GetValue(Ctrl).IsEmpty then
Prop.SetValue(Ctrl, 'Not Empty Anymore!');
end;
...
end;