• Delphi组件与属性编辑器1


    (一)前言

    本文将用一个例子描述组件开发与属性编辑器。例子(TdsWaitDialogEx)是一个可视组件,调用其show方法后显示一个Dialog,其中包含一个TAnimate,两个提示信息(即TLabel),一个进度条(TGauge)。

      枚举属性:DialogStyle,AVIPosition
      记录属性:Options
      属性集合对象从TPersistent继承,本文例中AVISource属性集合包含TAnimate
      的动画属性CommonAVI、FileName
      属性编辑器应用与AVISource的FileName属性,即String型FileName编辑时弹出一个
      TOpenDialog,其过滤Filter为*.avi

    (二)组件包dsDlgPack.dpk

    为了便于发布、安装等,要用到要组件包.dpk。

      在Delphi6以后的版本中(我不知D5以前的版本怎样),有若干文件Delphi没有发布,如Proxies。

    安装组件时若用到这些文件,可绕过这些文件而用包含这些文件的包。

      本例属性编辑器用到DesignEditors文件,而DesignEditors中需要Proxies文件,因此在发布此组件

    的包(.dpk)中包含designide,解决了Proxies不存在的问题,这样装组件就会成功

        package dsDlgPack;

        ...

        requires
          rtl,
          vcl,
          VclSmp,
          designide;       

        contains
          dsDlgWaitEx in 'dsDlgWaitEx.pas' {DlgWaitEx},
          dsDlgWaitExReg in 'dsDlgWaitExReg.pas';

        end.

    (三)组件注册文件dsDlgWaitExReg.pas

    问:为什么要多用这样一个文件? 因为:如果dsDlgWaitExReg.pas中的代码合并到dsDlgWaitEx.pas中,虽然dsDlgPack.dpk中包含designide解决了安装组件时Proxies不存在的问题,但是在应用程序调用此组件时仍出Proxies不存在的问题,因为DesignEditors中需要用到Proxies文件;因此象下面这段代码单独形成文件,应用程序调用此组件是不需用到dsDlgWaitExReg.pas,可绕过Proxies不存在问题。

        unit dsDlgWaitExReg;

        interface

        uses Classes, Dialogs, Forms, dsDlgWaitEx, DesignIntf, DesignEditors ;

        type

          TdsAVIFileNameProperty = class(TStringProperty) //属性编辑器要用到DesignEditors文件
          public
            function GetAttributes:TPropertyAttributes;override; //方法覆盖
            procedure Edit;override;                             //方法覆盖
          end;

        procedure Register;

        implementation

        procedure Register;
        begin
          //注册此组件到 Delisoft 组件页面
          RegisterComponents('Delisoft', [TdsWaitDialogEx]);
          //注册此属性编辑器
          RegisterPropertyEditor(TypeInfo(string), TdsAVISource, 'FileName', TdsAVIFileNameProperty);
        end;

        { TdsAVIFileNameProperty }
        function TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
        begin
          result:=[paDialog];
        end;

        procedure TdsAVIFileNameProperty.Edit;
        begin
          with TOpenDialog.Create(application) do
          try
            Filter:='AVI Files(*.avi)|*.avi|All Files(*.*)|*.*';
            if Execute then SetStrValue(FileName);
          finally
            free;
          end;
        end;

        end.

    好的代码像粥一样,都是用时间熬出来的
  • 相关阅读:
    Spring中@Autowired注解、@Resource注解的区别 (zz)
    ECLIPSE使用HG插件去上载 GOOGLE.CODE下的代码
    jrebel
    myeclipse 上安装 Maven3
    web项目目录结构
    笔记 利用python进行数据分析
    算法浅入浅出之Textrank
    算法浅入浅出之TF-IDF
    python库之jieba小试牛刀 3
    python库之jieba小试牛刀 2
  • 原文地址:https://www.cnblogs.com/jijm123/p/14233301.html
Copyright © 2020-2023  润新知