Delphi 检查组件是否具有文本属性

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;

如何检查组件是否具有文本属性。正如我所读到的,Rtti将是一个很好的解决方案,但我以前没有使用过它。任何帮助都将不胜感激

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;