作者:慧都控件网 | 2010-06-01 11:27:31| 阅读 1651次 有用 (1) 评论 (0) 收藏
概述:在使用DevExpress 的Ribbon控件过程中,发现cxBarEditItem的属性类型是可变的,并且难以确定。在界面上的显示只不过是TextEdit, ComboBox之类的字符串,而实际对应的对象却完全不是。本文将与你一起分享Ribbon控件如何确定cxBarEditItem的属性类型。
在使用DevExpress 的Ribbon控件过程中,发现cxBarEditItem的属性类型是可变的,并且难以确定。在界面上的显示只不过是TextEdit, ComboBox之类的字符串,而实际对应的对象却完全不是。要找出真实的对象名称,还是需要花一定的功夫的。
下面就是找对象名称的过程了,首先确保DevBar的Source目录被配置在了Library Path中,因为我们需要不止一次的重新编译控件,不能够只配置dcu的目录。然后,跟据属性编辑器的特点,找到相应的RegisterPropertyEditor方法,搜一下就会在cxBarEditItemReg.pas这个文件里,找到一句代码:
RegisterPropertyEditor(TypeInfo(TcxCustomEditProperties), TcxCustomBarEditItem,
'Properties', TcxBarEditItemPropertiesProperty);
从此代码可以确定,properties属性的编辑器就是TcxBarEditItemPropertiesProperty,然后按着Ctrl点一下这个类名,直接跳转到了属性编辑器的声明部分。我们直接看SetValue()方法。
在里面找到了关键的一句代码:
APropertiesClass := TcxCustomEditPropertiesClass(GetRegisteredEditProperties.FindByClassName(Value));
原来它的填充类是通过一个特定的工厂方法返回的,接着我们就能直接跟进去了,找到FindByClassName这个方法,打下断点。然后运行程序,会看到这个方法被一次次的调用,而其中有一次,就是properties属性调用的了。
在这里,我们无法确定哪一次才是Properties属性调用的,而且由于Dev控件的复杂性,这个方法被反复调用多次。因此,我们略微的修改代码,以满足确定属性的需要。
改动如下:
function TcxRegisteredClasses.FindByClassName(const AClassName: string): TClass;
var
I: Integer;
begin
Result := nil;
for I := 0 to Count - 1 do
begin
if Items[I].ClassName = AClassName then
begin
{$DEFINE DEBUG}
{$IFDEF DEBUG}
if items[i].InheritsFrom(TcxCustomEditProperties) then
begin
WriteLog(AClassName);
end;
{$ENDIF}
Result := Items[I];
Break;
end;
end;
end;
红色的部分就是添加的代码了,WriteLog是一个自定义函数,作用是往C盘根目录下写一个Log文件,文件的内容即继承自TcxCustomEditProperties的类。
程序执行后,打开这个文本一看,就一目了然了。
上面的代码用了编译预处理,如果不需要写文件,就把{$DEFINE DEBUG} 改成 {.$DEFINE DEBUG},如果下一次还需要做此工作,再改回来。
联系客服