高分求解:自定义VCL中,如何实现自定义属性分组显示?

SCUM 2008-12-06 09:47:46
比如定义一个 xxColor 组件
希望把它的 R,G,B,H,S,L 属性在 IDE 的属性编辑器里分组显示 类似 Font 属性 可展开关闭 不用显示在一堆

目前我用的方法是把 RGB HSL 分别定义成另一个继承自 TPersistent 的类
在 xxColor 里声明其实例
这样在属性编辑器里能实现分组显示
但是相互之间有很多关联计算 更新太麻烦
记得 delphi 下可以实现 把一个类里的属性分组显示
不知道 CB 里是否可以实现 如何实现
...全文
216 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCUM 2008-12-23
  • 打赏
  • 举报
回复
感谢楼上各位
尤其是 jxw1987628 的帮助

对vcl架构太不熟悉了
时间紧迫 最终用了 delphi写vcl 在cb里用的临时方案

现在研究这些的真是不多了 borland的式微太可惜...

结贴了
renxucai 2008-12-19
  • 打赏
  • 举报
回复
我也在做这个东西,用的delphi,这个属性分类折磨我一周了,还没有解决。
RegisterPropertyInCategory,看不到效果,我也同样着急
iamhaiergg 2008-12-11
  • 打赏
  • 举报
回复

class PACKAGE TXXColor: public Classes::TPersistent
{

public:
// ..............

private:
//........

__published:
__property TRGB* RGB={read=GetRGBValue,write=SetRGBValue} ;
__property THSL* HSL={read=GetHSLValue,write=SetHSLValue} ;

};

class PACKAGE TRGBProperty:public TClassProperty
{
public:
inline __fastcall virtual TRGBProperty(const Designintf::_di_IDesigner ADesigner, int APropCount)
:TClassProperty(ADesigner,APropCount)
{

}
TPropertyAttributes __fastcall GetAttributes(void)
{
return TPropertyAttributes()<<paSubProperties;
}
};


namespace xxx
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid( TXXColor)};
RegisterComponents("Samples", classes, 0);


RegisterPropertyEditor(__typeinfo(TRGB),__classid( TXXColor),
"RGB",__classid(TRGBProperty));

RegisterPropertyEditor(__typeinfo(THSL),__classid( TXXColor),
"HSL",__classid(THSLProperty));

}
}

jxw1987628 2008-12-08
  • 打赏
  • 举报
回复

class PACKAGE TXXColor: public Classes::TPersistent
{

public:
// ..............

private:
//........

__published:
__property TRGB* RGB={read=GetRGBValue,write=SetRGBValue} ;
__property THSL* HSL={read=GetHSLValue,write=SetHSLValue} ;

};

class PACKAGE TRGBProperty:public TClassProperty
{
public:
inline __fastcall virtual TRGBProperty(const Designintf::_di_IDesigner ADesigner, int APropCount)
:TClassProperty(ADesigner,APropCount)
{

}
TPropertyAttributes __fastcall GetAttributes(void)
{
return TPropertyAttributes()<<paSubProperties;
}
};


namespace xxx
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid( TXXColor)};
RegisterComponents("Samples", classes, 0);


RegisterPropertyEditor(__typeinfo(TRGB),__classid( TXXColor),
"RGB",__classid(TRGBProperty));

RegisterPropertyEditor(__typeinfo(THSL),__classid( TXXColor),
"HSL",__classid(THSLProperty));

}
}

// 另外好像你需要注册1个窗体来辅助完成你的子对象 RGB,HSL属性的编辑,只给了框架代码
filec75 2008-12-08
  • 打赏
  • 举报
回复
mark
yuanreid 2008-12-07
  • 打赏
  • 举报
回复

对象观察器如何显示属性
属性类型 对象观察器的处理
简单型(S a m p l e) 数字、字符和字符串属性被显示为数字、字符和字符串。应用程序开发
人员能直接编辑它们的值(续)
属性类型 对象观察器的处理
枚举型(E n u m e r a t e d) 枚举型(包括B o o l e a n型)属性显示为可编辑的字符串。应用程序开发人
员既可以通过双击值域,也可以通过下拉式列表框选择可能的值
集合型(S e t) 集合型属性显示为集合(s e t s) 。应用程序开发人员通过双击该属性象处
理布尔值一样扩展、处理集合的每个元素
对象型(O b j e c t) 本身就是类的属性,自身就有自己属性的编辑器,由组件注册过程指定。
如果作为属性的类有自己的发布部分,对象观察器允许应用程序开发人员
扩展(通过双击)列表包含并编辑它们。对象属性必须从 T p e r s i s t e n t
数组型(A r r a y) 数组属性必须有自己的属性编辑器。对象观察器对它们的编辑没有内置
支持。当你注册你的组件时,你能指定一个属性编辑器
ximenwuji 2008-12-07
  • 打赏
  • 举报
回复
VS2005的推出,C++BUILDER用户越来越少了
可叹阿
yuanreid 2008-12-07
  • 打赏
  • 举报
回复
楼主可以参考《C++ Builder 5 开发人员指南》,控件属性部分的描述及自定义属性编辑器部分
SCUM 2008-12-07
  • 打赏
  • 举报
回复
re yuanreid:
老兄的这段话有一定的帮助
不知道引自何处
老兄是否有更详细的资料


re shadowstar :
感谢回复!
目前我就是这样做的
只是觉得要定义每一个分项的类比较麻烦
不过经过两天的 gg 暂时没有发现更好的代替方法
如果不行就只能将就这样了(很可能)
SCUM 2008-12-07
  • 打赏
  • 举报
回复
.....没找到修改帖子的地方。。。难道 csdn 改掉了。。。

就在这里补充一下:

比如 xxColor 有如下 published 属性:
R G B H S L C M Y K........

默认情况下 组件发布后 这些属性在 Object Inspector 里是分开显示的
我的目的是希望把它们分组显示 如下:

...
- RGB
  R
  G
  B
- HSL
  H
  S
  L
- CMYK
  C
  M
  Y
  K
...

也就是分成 RGB、HSL、CMYK 等可展开/关闭的组


另外 在 Object Inspector 里 可以选择按 Category 排列属性
其实这在一定程度上可以将就用了 不过仍然是不够完美

找到点 delhp 的资料提到 可以用 RegisterPropertyInCategory 注册新属性类别 但没能完整测试成功

等待...




SCUM 2008-12-07
  • 打赏
  • 举报
回复
re 1楼:

xxColor 本身是继承自 TCustomControl
我是另外又定义了两个类 RGB HSL 继承自 TPersistent 这样不用自己处理 .dfm stream

我把问题再补充一下
shadowstar 2008-12-07
  • 打赏
  • 举报
回复
我还是不太明白,说下我的理解。

{伪代码}
xxColor = class(TCustomControl)
published
R, G, B: Byte;
H, S, L: Byte;
C, M, Y, K: Byte;
end;

xxRGB = class(TPersistent)
published
R, G, B: Byte;
end;

如果像上面这样的话,可以改成这样:

xxColor = class(TCustomControl)
published
RGB: xxRGB;
HSL: xxHSL;
public
R, G, B: Byte;
H, S, L: Byte;
C, M, Y, K: Byte;
end;

shadowstar 2008-12-06
  • 打赏
  • 举报
回复
class xxColor : public TPersistent
???

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧