知识大全 通过实例看VCL组件开发全过程(三)
Posted 属性
篇首语:恐惧自己受苦的人,已经因为自己的恐惧在受苦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 通过实例看VCL组件开发全过程(三)相关的知识,希望对你有一定的参考价值。
通过实例看VCL组件开发全过程(三) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
四 组件属性编辑器和组件编辑器通过上面的努力我们的组件似乎已经比较完美了 可我们也忽略了一些重要的细节和一些有趣的事情 这一篇我们将研究两个很有用的组件特性
在之前开发组件核心功能时我们曾设置了两个属性BeginTime和WakeTime 他们都是字符串型的属性 然而他们所要表示的却是时间类型 这样就很有可能使组件使用者错误的编辑属性并导致转化字符串到时间时出错(当然这里只是为了文章的讲解 我们故意把它设置为了字符串类型) 虽然通过浏览原代码你知道我们也做了一些代码级别的防出错处理 使当输入错误时属性自动变成 : : 然而这对组件使用者来讲仍然显的很不友好 所以我们需要为这两个属性定制编辑器 我们的编辑器将弹出一个窗口里面有一个TdateTimePicker用来选择时间 在delphi中有许多这样的例子 例如大家都知道的lines属性 当你单击它右放的省略号时为自动弹出一个文本编辑器来编辑lines 这大大降低了组件使用者范错误的可能性
在定制完属性编辑器以后 我们将为组件本身加入一写有趣的元素——组件编辑器 这也是在delphi中经常出现的 例如有些组件当你双击它时 它并不会进入代码编写状态 而是弹出它自己的编辑器 虽然我们的组件似乎并不需要这种特性 但为了演示它 我们也将它考虑近来 我们给我们的组件编写了一个版权信息和一个关于对话框 当组件使用者双击它时弹出关于信息(当然 这仅仅是种演示) 上面提到的两种特性由于它们只是会在设计时起作用 所以你完全可以在新的组件包中编写并注册它们 并将这个组件包设置为Designtime Only 为了方便起见我们就直接把它们和组件的单元编写在一起 注意 以下出现的一些类和方法都需要引用单元DesignEditors(delphi )或DsgnIntf(delphi ) 与前面说的一样 它们都属于delphi的open tools api所以 如果你没有这写单元请按照前文的方法安装它们
首先来编写属性编辑器 由于BeginTime和WakeTime是字符串类型 所以我们必须从默认的字符串属性编辑器类TstringProperty继承并覆蓋它的一写方法(这里只介绍几个重要的方法 事实上所有的属性编辑器都从TpropertyEditor继承而来 然而我们不用直接继承这个基类) 其中一个重要的方法是GetAttributes 他将返回一些代表编辑器功能的值 这些值将会在代码的注释中说明(如果你的属性编辑器还需要一个下拉列表 你还需要另外一个重要的方法GetValues具体请查看delphi帮助)另外为了使属性编辑器为弹出的对话框我们需要覆蓋Edit方法 为了可以以可视化的方式设计对话框 我们可以建立一个普通工程 在设计好后将窗体的类声明复制到我们的组件单元 并将窗体的dfm文件拷贝到我们的组件包目录 并在代码中加入编译器开关$R * dfm 以下是窗体的类声明 这个窗体没有任何的代码需要编写
TTimeEditFrm = class(TForm)
DateTimePicker : TDateTimePicker;
Button : TButton;
Button : TButton;
private
Private declarations
public
Public declarations
end;
以下是属性编辑器的代码
TClockProperty=class(TStringProperty)
public
function GetAttributes:TPropertyAttributes;override;
procedure Edit;override;
end;
实现部分
procedure TClockProperty Edit;
var
TimeEditFrm:TTimeEditFrm;
begin
TimeEditFrm:=TTimeEditFrm Create(Application);
try
TimeEditFrm DateTimePicker Time:=StrToTime(GetValue);
if TimeEditFrm ShowModal=mrOK then
SetValue(TimeToStr(TimeEditFrm DateTimePicker Time));
//GetValue和SetValue是TStringProperty的基类方法 他直接读取和设置字符串的值
finally
TimeEditFrm Free;
end;
end;
function TClockProperty GetAttributes: TPropertyAttributes;
begin
result:=[paDialog paMultiselect];
//paDialog表示属性编辑器将显示一个对话框 paMulitiselect允许多个组件选择属性
//除此之外如果你想让属性编辑器显示下拉列表 你还需要paValueList具体请查看帮助
end;
最后我们用RegisterPropertyEditor方法注册属性编辑器:
procedure Register;
begin
……
RegisterPropertyEditor(TypeInfo(string) TClock BeginTime TClockProperty);
RegisterPropertyEditor(TypeInfo(string) TClock WakeTime TClockProperty);
end;
重新编译更新组件后我们就可以测试了 可以看到组件编辑器工作得很好
接下来我们来实现组件编辑器
组件编辑器需要继承TponentEditor并覆蓋一些重要的方法 GetVerbCount返回设计时组件右键自定义菜单的数目 GetVerb为每一个自定义菜单添加文字 ExecuteVerb为每一个菜单项添加事件 Edit为组件的缺省操作指定事件(即在设计时双击组件) 以下是代码
TClockEditor=class(TComponentEditor)
public
function GetVerbCount:integer;override;
function GetVerb(index:integer):string;override;
procedure ExecuteVerb(index:integer);override;
procedure Edit;override;
end;
实现部分
procedure TClockEditor Edit;
begin
ExecuteVerb( ); //默认显示关于
end;
procedure TClockEditor ExecuteVerb(index: integer);
begin
case index of
//第一个显示名字的菜单什么都不做显示
:showmessage( barton@ );
end;
end;
function TClockEditor GetVerb(index: integer): string;
begin
case index of
:result:= barton ;
:result:= About Clock ;
end;
end;
function TClockEditor GetVerbCount: integer;
begin
result:= ;//我们显示两条菜单 一个我的名字 一个关于
end;
同样最后我们注册组件编辑器
procedure Register;
begin
……
RegisterComponentEditor(TClock TClockEditor);
end;
同样可以看到组件编辑器的测试情况
文章写到这里也该结束了 虽然写了那么多 然而在组件开发中这仍是一小部分内容 本文只是抛砖引玉的作用 希望对正要进入组件开发的朋友一些启示 为了方便你阅读本文 如果你想要本文所开发的这个组件的全部原文件 请和我联系
cha138/Article/program/Delphi/201311/24765相关参考
通过实例看VCL组件开发全过程(二) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
通过实例看VCL组件开发全过程(一) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
怎样在Java实例开发的过程中使用进度条 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在读取大
基于Delphi的组件设计之简单实例 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!这是一个可以计数
Extjs单独定义各组件的实例代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网上看到的一个
在你的struts配置文件strutsconfigxml中加入下面的配置 <plugin
新建类库MyTestDLL 右击项目“MyTestDLL”》属性》生成》勾选“为互操作注册” 打开 AssemblyInfocs&nb
在laszlo应用开发过程中大部分编码过程集中在对系统组件的熟练应用比如取值传值刷新组件状态等等但是很多情况下尤其是项目的初始编码阶段需要定义一些满足项目特定要求的界面组件这就需要自定义组件了&n
VB.NET中的组件开发 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!简介组件其实是一段可以重用的
dotnet下开发COM+组件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一问题的提出 最