在开发不可视组件时,要使其中一个属性可以调用系统文件对话框选择文件从而获取到所需要的路径,而不是用手动输入路径。比如在软件设计期双击不可视组件弹出系统文件选择对话框,或者在属性选择器里面可以点击一个属性弹出系统文件对话框。

解决方案 »

  1.   

    越来越觉得:
    非界面的控件,还是直接做成类,由代码创建、设置、使用它们,更好
    因为做成组件,还得先安装到ide环境界面控件,因为设计时拖、摆的需要,做成组件方便很多
      

  2.   


    Delphi的非可视组件只是没有GUI显示,但是在IDE中也支持PME模型,使用者只需要设置几个属性、写若干事件处理代码,甚至啥都不需要写,这个组件就可以用起来了,如果“直接做成类,由代码创建、设置、使用它们”(这是第二代应用框架的方式,VCL属于第三代应用框架),你不先阅读它的文档、甚至源码,基本是用不起来的。
      

  3.   


    这样还是要看源码或者文档才能使用,而且PME模型并非只是针对简单组件,对复杂组件甚至更加有用,因为它能突出重点,只有组件的published属性、事件在object inspector中列出来,修改属性不用在代码中查找、改来改去,添加事件双击一下就行了,再比如测试某事件代码起作用、不起作用的效果,只需要在object inspector的events只点两下鼠标,或者点一下鼠标、按一下退格键,不用删除、修改、注释掉代码,比手写代码方式要方便多了。至于“有时候只是偶尔打开某个项目,它使用的控件也不是常见、常用的,却不得不为此编译、安装它使用到的所以控件”这确实是一个麻烦,但麻烦也只是一次,当然,如果能改进IDE,使之能够打开某个项目的时候自动加载它用到的(已经预编译的)组件就好了。
      

  4.   


    组件没源码也可以安装、使用,这点支持PME模型的组件比纯手写代码的应用框架高级更多了,对于后者,你不看一遍文档是别想用得起来的。
      

  5.   

    编写一个熟悉编辑器并注册,详细参考 《delphi5开发人员指南》第22章
      

  6.   

    呐,这个说的简单点,你按照以下步骤试试
    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
      

  7.   

    呐,如果你想双击控件图标弹出编辑界面的话,可以按照以下步骤试试
    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
      

  8.   

    麻烦,如果自已用,就直接使用string属性,直接输入文件的完整路径名即可,用组件编辑器有点小麻烦
      

  9.   

    12楼
    在第5步之后遗漏了一句
    还需要在 procedure  register 函数中添加以下一句
    RegisterComponentEditor(控件类, TXXXComponentEditor);
    sorry
      

  10.   

    “控件”这个概念基本上等同于可视组件(“控件”一词的来源应该是从“control”演变来的,“控制”则起源于“windows controls”这个概念,见:http://msdn.microsoft.com/en-us/library/windows/desktop/bb773173%28v=vs.85%29.aspx),“component”还是翻译成组件更合适。另外,从语言的角度来看,组件本身就是功能类(反之则不一定成立),功能类的用法都可以适用于组件(如果你想这么用的话),在我看来,一个功能类是否需要写成组件,主要是看它的功能复杂度和使用时的持久性,简单说就是“复用度”,如果比较简单、临时使用一下的功能,象TStringList,就不需要写成组件,反之,象Indy的TIdTcpServer、TIdUdpServer,写成组件则比较合适。
      

  11.   

    每个人的习惯不一样,不用为是用组件还是直接使用源代码而争论。现在的问题已经解决仿照delphi自带控件源码,已经可以调用系统的文件选择对话框了。delphi自带控件源码的确是一个非常好的学习材料。将一些常用的功能做成控件还是很不错的,既可以锻炼自己开发能力,也能使很多的功能简单化的,提高工作效率。