呐,如果你想双击控件图标弹出编辑界面的话,可以按照以下步骤试试 1:找到控件的注册单元,也就是在dpk工程中找到包含 procedure Register(); 这个方法实现的那个unit 2:从TComponentEditor派生类,命名为TXXXComponentEditor 3:重载function GetVerbCount: Integer; override; 这个方法决定了你右键单击控件图标,右键菜单中自定义的菜单项的数量 双击控件,默认响应Index为0的菜单项 如果这里你只是想要一个弹出的对话框,那返回值写 Result:= 1; 4:重载function GetVerb(Index: Integer): String; override; 与上一个函数对应,从0开始,每一个菜单项的显示名称 如果你只是一个要弹出对话框的菜单项,就写成 case Index of 0: Result:= 'Select a Directory'; else Result:= ''; end;
5:重载 procedure ExecuteVerb(Index: Integer); override; 与上一个函数对应,从0开始,每一个菜单项的执行事件 如果你只是一个要弹出对话框的菜单项,就写成 case Index of 0: begin {open dialog} end; end; 6:rebuild
非界面的控件,还是直接做成类,由代码创建、设置、使用它们,更好
因为做成组件,还得先安装到ide环境界面控件,因为设计时拖、摆的需要,做成组件方便很多
Delphi的非可视组件只是没有GUI显示,但是在IDE中也支持PME模型,使用者只需要设置几个属性、写若干事件处理代码,甚至啥都不需要写,这个组件就可以用起来了,如果“直接做成类,由代码创建、设置、使用它们”(这是第二代应用框架的方式,VCL属于第三代应用框架),你不先阅读它的文档、甚至源码,基本是用不起来的。
这样还是要看源码或者文档才能使用,而且PME模型并非只是针对简单组件,对复杂组件甚至更加有用,因为它能突出重点,只有组件的published属性、事件在object inspector中列出来,修改属性不用在代码中查找、改来改去,添加事件双击一下就行了,再比如测试某事件代码起作用、不起作用的效果,只需要在object inspector的events只点两下鼠标,或者点一下鼠标、按一下退格键,不用删除、修改、注释掉代码,比手写代码方式要方便多了。至于“有时候只是偶尔打开某个项目,它使用的控件也不是常见、常用的,却不得不为此编译、安装它使用到的所以控件”这确实是一个麻烦,但麻烦也只是一次,当然,如果能改进IDE,使之能够打开某个项目的时候自动加载它用到的(已经预编译的)组件就好了。
组件没源码也可以安装、使用,这点支持PME模型的组件比纯手写代码的应用框架高级更多了,对于后者,你不看一遍文档是别想用得起来的。
1:找到控件的注册单元,也就是在dpk工程中找到包含 procedure Register(); 这个方法实现的那个unit
2:如果你要编辑的那个属性的类型是string的话,你就声明一个类从TStringProperty继承类,
命名为TXXXStrProp,
3:重载function GetAttributes: TPropertyAttributes; override;
返回值是一个集合
如果你是想要一个按钮就写 Result:= [paDialog];
如果你还想让editor只读 就写 Result:= [paReadOnly, paDialog];
4:如果你将上面GetAttributes类型返回成为 paDialog,
请重载procedure Edit; override;
在Edit方法中编写open dialog 方法
获取当前编辑控件对象的方法是 (GetComponent(0) as 当前编辑对象类).当前编辑的属性
对其赋值 即可
5:在procedure Register();方法中添加以下函数调用
RegisterPropertyEditor(TypeInfo(String), 控件类, '你要编辑的属性名',
TXXXStrProp);
6:rebuild
1:找到控件的注册单元,也就是在dpk工程中找到包含 procedure Register(); 这个方法实现的那个unit
2:从TComponentEditor派生类,命名为TXXXComponentEditor
3:重载function GetVerbCount: Integer; override;
这个方法决定了你右键单击控件图标,右键菜单中自定义的菜单项的数量
双击控件,默认响应Index为0的菜单项
如果这里你只是想要一个弹出的对话框,那返回值写 Result:= 1;
4:重载function GetVerb(Index: Integer): String; override;
与上一个函数对应,从0开始,每一个菜单项的显示名称
如果你只是一个要弹出对话框的菜单项,就写成 case Index of
0: Result:= 'Select a Directory';
else Result:= '';
end;
5:重载 procedure ExecuteVerb(Index: Integer); override;
与上一个函数对应,从0开始,每一个菜单项的执行事件
如果你只是一个要弹出对话框的菜单项,就写成 case Index of
0:
begin
{open dialog}
end;
end;
6:rebuild
在第5步之后遗漏了一句
还需要在 procedure register 函数中添加以下一句
RegisterComponentEditor(控件类, TXXXComponentEditor);
sorry