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.

posted on   癫狂编程  阅读(309)  评论(0编辑  收藏  举报

编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2020-01-05 如何在控制面板中删除ODBC,不要隐藏!!!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
好的代码像粥一样,都是用时间熬出来的
点击右上角即可分享
微信分享提示