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

支持自绘画的属性编辑器

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

我的主页: http://www.tommstudio.com/

属性编辑器对于大多数Delphi程序员来说无疑是很熟悉的,在对象编辑器的内核中有着大量的属性编辑器,每个对象编辑器中的属性都对应一个属性编辑器类的实例。

Delphi5中提供了一些新的高级特性,使我们能够定义新的属性编辑器,为以有的属性提供新的功能,或者设定和显示新的控件的新的属性的显示方法。在Delphi5以前,对象编辑器只能够以文本的形式显示属性值。在Delphi 5中给属性编辑器提供了新的特性,使我们能够以任何形式显示属性的名称和值,如下图所示如果属性有一个下拉列表,我们就可以为每一个列表项添加一个图标。下面我们就来研究一下如何实现属性编辑器的自绘画的功能。


属性编辑刷新器

所有的属性编辑器都是从TpropertyEditor继承下来的。我们可以为特定的属性类型、属性名或控件注册一个属性编辑器。对象编辑器检查每一个要显示的属性的名称和类型,选择合适的属性编辑器类。然后它会创建这个类的一个实例(每个属性对应一个实例)。当我们选择了另一个控件,对象编辑器会释放全部的属性编辑器对象,然后为新的控件创建新的对象。

属性编辑器可以决定如何显示属性的值以及用户如何设定一个新的属性值。比如,TintegerProperty调用IntToStr函数以字符串的形式显示整数值并用StrToInt函数来转换用户输入的新值。 当用户输入了一个新的属性值时,TcolorProperty同样使用一个整型值来表示,但把整数解释为颜色,并尽可能地映射颜色值为一个名称(如clBlack或clBtnFace) 。

一个属性编辑器实现上述功能是通过重载TpropertyEditor的一个或多个方法来实现的。绝大多数的属性编辑器需要重载GetValue方法,GetValue方法获得属性值的字符串形式。以及SetValue方法,SetValue方法把一个字符串转化为属性值。要想了解关于编写属性编辑器的进一步信息,需要仔细研究DsgnIntf.pas文件(在Delphi5\Source\Toolsapi目录下)以及Delphi 5 在线帮助(在"property editors, creating"部分里)。

基础步骤

要实现一个最基本的自绘画属性编辑器,我们只需要重载TpropertyEdiotr的PropDrawValue 方法。比如如前面图中所见到的,TcolorProperty属性重载了PropDrawValue方法在颜色名前显示一个对应于相应颜色的彩色小方块。为了理解如何使用PropDrawValue方法,我们为Tfont对象写一个新的属性编辑器,新的编辑器将会用当前字体名对应的字体来显示Tfont对应的属性。

Delphi本身已经提供了一个属性编辑器TfontProperty,它在对象编辑器中添加了一个省略按钮,用户可以点击按钮调出标准的Windows字体选择对话框来设定字体的属性。我们可以直接从TfontProperty继承新的编辑器,类的声明如下:


type
TVisualFontProperty = class(TFontProperty)
public
procedure PropDrawValue(Canvas: TCanvas;
const Rect: TRect; Selected: Boolean); override;
end;


当对象编辑器需要显示属性值的时候,IDE会调用PropDrawValue方法来画属性值。Delphi传递一个画布对象(Canvas)及绘画区域来供程序画属性值。Selected参数现在还没用,我们可以忽略它。

注意:Delphi并不会为给定的绘画区域设定剪裁区域,也就是说我们必须严格按照给定的区域绘画,如果超出界限,会把别的属性值给覆盖掉。

TvisualFontProperty对象的唯一任务就是选择相应于Font名字的字体来画属性值。它设定字体的名称,样式以及颜色(当颜色不同于背景色的时候),字体的大小显示保留不动,以免使用非常大或非常小的字体大小画值的时候会出现的问题。下面就是PropDrawValue的实现部分:



// 替换乏味的Tfont属性值的显示方式,用选定的字体样式
//和字体来画相应的属性值,用户可能会选择比较大的字体
//尺寸,所以这里保留字体大小不动,只有当字体颜色不同
//于背景色的时候,才用相应的颜色画,否则前景背景一样
//的话就无法看到字体的属性值了

procedure TVisualFontProperty.PropDrawValue(
Canvas: TCanvas; const Rect: TRect; Selected: Boolean);
var
Font: TFont;
begin
Font := TFont(GetOrdValue);
if Font <> nil then begin
if ColorToRGB(Font.Color) <> ColorToRGB(clBtnFace) then
Canvas.Font.Color := Font.Color;
Canvas.Font.Name := Font.Name;
Canvas.Font.Style := Font.Style;
end;
inherited;
end;


另外我们重载GetValue方法来提供更多的信息,比如字体名和大小。


function TVisualFontProperty.GetValue:

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