手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

支持自绘画的属性编辑器

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
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);

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!