支持自绘画的属性编辑器(4)
2008-04-09 04:21:03来源:互联网 阅读 ()
procedure TSetPropertyEx.ListMeasureWidth(const Value: string; Canvas: TCanvas;
var Width: Integer);
begin
Width := Width Checked.Width 2;
end;
类似于显示集合元素,对于布耳类型的属性我们也可以加一个复选框。下面我们要实现TBooleanPropertyEx 属性编辑器对布耳类型进行了扩展,对于不同的布耳类型,比如ByteBool, WordBool和LongBool属性的实现方式是类似的,当时需要不同的属性编辑器。下面就是TbooleanPropertyEx的实现代码,对于复选框如何相应消息,有点小问题,因为通常我们是希望单击实现复选框切换状态,Delphi不支持单击,我们只好使用双击了(估计在Delphi 6中属性编辑器可能会支持单击),注意双击会调用属性编辑器的Edit方法。对于集合元素或布耳属性,双击可以切换属性值。估计在Delphi 6中属性编辑器可能会支持单击。
//根据True或者False来画一个复选框及布耳值的文本标签
procedure DrawBoolCheckBox(Canvas: TCanvas;
const Rect: TRect; const Value: string);
begin
Canvas.FillRect(Rect);
Canvas.TextRect(Rect, Rect.Left Checked.Width 2,
Rect.Top 1, Value);
if Value = BooleanIdents[False] then
Canvas.Draw(Rect.Left 1, Rect.Top 1, UnChecked)
else
Canvas.Draw(Rect.Left 1, Rect.Top 1, Checked);
end;
{ TSetElementPropertyEx }
// 每个列表项旁边显示一个复选框,用户必须双击
//而不是单击才能切换复选框状态
procedure TSetElementPropertyEx.PropDrawValue(
Canvas: TCanvas; const Rect: TRect; Selected: Boolean);
begin
DrawBoolCheckBox(Canvas, Rect, Value);
end;
{ TBoolPropertyEx }
// 为ByteBool, WordBool和LongBool类型显示复选框
procedure TBoolPropertyEx.PropDrawValue(Canvas: TCanvas;
const Rect: TRect; Selected: Boolean);
begin
DrawBoolCheckBox(Canvas, Rect, Value);
end;
使用属性编辑器
最后我们需要作的就是注册这些新的属性编辑器,大多数的编辑器比较容易注册,但是新的集合类属性编辑器存在一个问题,每一个集合都是一个独立的类型,我们必须分别为每个集合类型注册一遍属性编辑器。幸运的是,Delphi有一个不为人知的特性就是允许为所有的集合类型注册同一个属性编辑器。同通常的为单独一个类型注册属性编辑器不同的是,我们可以通过提供一个属性映射函数来实现注册,这个函数把对象和属性信息作为参数,然后返回属性编辑器类或是nil。这种情况下,映射函数校验属性类型,并为所有属性类型是tkSet的属性返回新的集合属性编辑器。下面是注册过程的代码:
//为全部的集合属性注册一个统一的属性编辑器
function SetMapper(Obj: TPersistent; PropInfo: PPropInfo):
TPropertyEditorClass;
begin
if PropInfo.PropType^.Kind = tkSet then
Result := TSetPropertyEx
else
Result := nil;
end;
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TFont), nil, '''''''',
TVisualFontProperty);
RegisterPropertyEditor(TypeInfo(TGraphic), nil, '''''''',
TVisualGraphicProperty);
RegisterPropertyEditor(TypeInfo(TComponentName),
TComponent, ''''Name'''', TBoldComponentNameProperty);
RegisterPropertyEditor(TypeInfo(Boolean), nil, '''''''',
TBooleanPropertyEx);
RegisterPropertyEditor(TypeInfo(ByteBool), nil, '''''''',
TBoolPropertyEx);
RegisterPropertyEditor(TypeInfo(WordBool), nil, '''''''',
TBoolPropertyEx);
RegisterPropertyEditor(TypeInfo(LongBool), nil, '''''''',
TBoolPropertyEx);
RegisterPropertyMapper(SetMapper);
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
相关文章
IDC资讯:
主机资讯
注册资讯
托管资讯
vps资讯
网站建设
网站运营:
建站经验
策划盈利
搜索优化
网站推广
免费资源
网络编程:
Asp.Net编程
Asp编程
Php编程
Xml编程
Access
Mssql
Mysql
其它
服务器技术:
Web服务器
Ftp服务器
Mail服务器
Dns服务器
安全防护
软件技巧:
其它软件
Word
Excel
Powerpoint
Ghost
Vista
QQ空间
QQ
FlashGet
迅雷
网页制作:
FrontPages
Dreamweaver
Javascript
css
photoshop
fireworks
Flash
热门词条
最新资讯
热门关注
