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

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

目前我用的方法是把 RGB HSL 分别定义成另一个继承自 TPersistent 的类
在 xxColor 里声明其实例
这样在属性编辑器里能实现分组显示
但是相互之间有很多关联计算 更新太麻烦
记得 delphi 下可以实现 把一个类里的属性分组显示
不知道 CB 里是否可以实现 如何实现
...全文
179 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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创作助手写篇文章吧