如何判断一个类中是否含有某个属性?(100分)

  • 主题发起人 主题发起人 Prinse
  • 开始时间 开始时间
P

Prinse

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠:
在应用运行时,如何判断一个类中是否含有某个属性?谁能指点一二?
 
RunTime Type Info (RTTI)。
Delphi 的 IDE 为什么能知道哪个类有哪些属性,并把它们显示在 Object Inspector 中?
关键就是 RTTI。Is 和 As 是怎样工作的?也在于 RTTI。
 
有一本《Delphi 5 开发人员指南》里面详细介绍了 RTTI 的使用。
btw: 你的问题应该可以用类方法:FieldAddress 和 MethodAddres 解决。
 
FieldAddress 和 MethodAddres似乎都只能处理publish的属性。
另,我有一本从http://www.china-pub.com/上dl的《Delphi 5 开发指南》,不知是否你
说的《Delphi 5 开发人员指南》?不过那本书里对RTTI没说什么。
 
不是那本。我说的书是黄色封皮,颜色由上到下从黄色渐变成白色,外国人写的,非常厚。
130 / 160 多元,记不清楚了。
 
可以用欺骗的方法访问一个类的所有内容.
 
procedure GetPropertyList ( AnObject: TComponent; List: TStrings);
var
PropertyIndex,
PropertyCount : Integer;
PropList : TPropList;
begin

PropertyCount := GetPropList ( AnObject.ClassInfo, tkAny,
@PropList) ;
// the second parameter could be also tkProperties for only get the
// property names or tkMethods to get the methods names.

for PropertyIndex := 0 to PropertyCount -1 do
List.Add ( PropList[PropertyIndex].PropType^.Name );
end;{GetPropertyList}
 
To GGCat
能否说一下如何“用欺骗的方法访问一个类的所有内容”吗?
 
在 本单元的 定义部分加上一个 伪装外套。
以 Tbutton 为例 ,不通过Caption直接访问保护成员:
Type
TFakebutton=Class(Tbutton );

Tform1=Class(Tform);
.......

然后在处理中进行强制类型转换:

TFakebutton(Mybutton).text:='888';




 
应该就是象 akju 说的那样。但是不知道 TPropList 和 GetPropList 在那个 Unit 里。
Delphi 把类信息在运行期间都置入对象的空间中,所以能在运行时使用 is 和 as 方法。
这就是所谓的 RTTI 。
To Prinse: 这里有两篇文章,你读过之后,应该对 RTTI 有更深的理解。
<a href="DispQ.asp?LID=237769">文章推荐[来自www.chinasp.com] (12k)</a>
<a href="DispQ.asp?LID=293314">文章推荐[来自www.chinasp.com](续)</a>

btw: GGCAT 说的不是 Prinse 题目的原意。
 
function IsDataAware(AComponent: TComponent):Boolean;
var
PropInfo: PPropInfo;
begin
//查找DataSource属性
PropInfo := GetPropInfo(AComponent.ClassInfo,'DataSource');
Result := PropInfo<>nil;
end;
调用GetPropInfo()函数返回给定属性的TPropInfo指针。如果存在则返回 nil 。
 
To All
好象Delphi的RTTI只支持对Published属性,而对Public和Protected属性似乎
没有办法。

To Bakubaku
谢谢你指出的两篇文章,但都过于简浅了些,实务上更是没有帮助。它们倒更象
哲学文章。

我本也想钻到类结构里去,可本人确实又是太懒惰,想撮取各位大侠的心得。难
道就没人愿意钻一钻,看个究竟?
 
的确如此,Delphi 只为 Published 对象生成 RTTI 。
Published members have the same visibility as public members. The difference is that
runtime type information (RTTI) is generated for published members. RTTI allows
an application to query the fields and properties of an object dynamically and
to locate its methods. Delphi uses RTTI to access the values of properties when
saving and loading form (.DFM) files, to display properties in the Object Inspector,
and to associate specific methods (called event handlers) with specific properties
(called events).
btw: 上面两篇文章对类结构说得很详细啊,还是仔细读一读吧。
 
Prinse:如果还想接着讨论请定期提前自己的帖子,如果不想继续讨论请结束帖子。
 
多人接受答案了。
 
后退
顶部