(一)前言

本文将用一个例子描述组件开发与属性编辑器。例子(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.