文中均以Delphi XE 10.3平台为例。
在上一篇中,我们简单的实现了一个对Delphi自身的TEdit编辑框控件的一个扩充!但是我们并不能像Delphi自己的TEdit一样,能够在设计状态下进行设计,而是非得要自己手动创建控件,然后才能使用。这个虽然说也是组件,但是却失去了组件的可设计的方便性,仅仅可作为一个类库来使用。现在我就来介绍一下,如何让这个组件注册到IDE上,然后让你能够在设计状态下可以设计使用。
在讲注册组件的时候,我们需要先明白Delphi中的包的概念,这里我就不做说明了。在注册组件时,就需要一个设计期间的包文件。操作方法如下:
一:新建控件包
1、File -> New -> Package - Delphi
2、保存 File -> Save All 工程名为 TEditEx1.dproj ,这样包就建好了,如图:

二:使用 组件向导(New Component)创建TEdit组件模板
1、Component -> 选 New Component;
2、选VCL for Delphi Win32 -> Next;
3、 在 搜索框 输入edit快速找到TEdit 选中TEdit -> Next;
4、设置 Class Name: 我这里设为TEditEx1
Palete Page: 选 Standard 选择卡,方便使用
Unit name: .pas单元保存的路径,选刚刚新建的包的目录,文件名也改为EditEx1.pas -> Next;
5、选 Add unit to TEditEx1.dproj project (直接添加进刚刚的包中) -> Finish
6、弹出保存对话框 保存 -> Yes。
EditEx1.pas 使用上一篇的代码,完整代码如下:
unit EditEx1;
interface
uses
System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, WinApi.Windows, WinApi.Messages;
type
TEditEx1 = class(TEdit)
private
{ Private declarations }
protected
procedure WMNCPAINT(var msg: TWMNCPaint); message WM_NCPAINT;
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TEditEx1]);
end;
procedure TEditEx1.WMNCPAINT(var msg: TWMNCPaint);
var
DC: HDC;
BorderBrush: HBRUSH;
R: TRect;
begin
inherited; // 必须继承Windows消息,让我们不处理的丢给Windows自己处理
DC:= GetWindowDC(Handle);
try
SetRect(R,0,0,Width,Height);
BorderBrush:= CreateSolidBrush(RGB(78,160,209));
FrameRect(Dc, R, BorderBrush);//绘制默认的边线框
DeleteObject(BorderBrush);
finally
ReleaseDC(Handle,DC)
end;
end;
end.
关于Register组件注册过程
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Standard', [TEditEx1]);
end;
这个Register就是组件注册的过程,包会自动调用的,注册过程中调用了RegisterComponents这个过程
这个过程的第一个参数指定要注册到IDE的哪个组件面板(如果IDE组件面板中没有你给定的这个值,Delphi会自动添加一个新的组件面板),参数二指定的是要注册到IDE的组件对象类数组。
接下来编译安装 项目管理器 -> 右建点击 TEditEx1.bpl 项目 -> 点 Install 如图:

这样TEditEx1就被添加到了Standard选项卡中;但是TEditEx1还是不能正常工作的,会提示找不到EditEx1.pas单元文件,此时还需要把EditEx1.pas所在目录添加进Library path;添加方法:
Tools -> Options -> Language -> Delphi Options -> Library -> Library path 如图:

测试 可以直接在 项目管理器 -> 右建 ProjectGroup1 -> Add New Project (新建 Windows VCL Application) 用于测试
效果图:


组件图标更换
在IDE的组件面板上,可以发现TEditEx1和TEdit1两个组件的图标是一样的!其实也就是TEditEx1同时也继承的TEdit显示的图标,这个图标是可以换成别的图标的!下面我们再给这个组件换一个我们自己的图标,这个可以用Delphi7版本的ImageEditor构建一个dcr文件,新建一个dcr文件,然后添加位图,然后添加一个图片资源,然后修改名称为你组件的名字,比如这里叫TEditEx1,将图片修改成这个名字,然后保存到和EditEx1.pas相同的目录下保存名字为EditEx1.dcr,然后再编译一下包文件,再去看组件面板上的信息,就发现图标变了!这里,因为我用的是Delphi XE 10,所以没有那个ImageEditor的资源编辑器了,这里我就直接用Brcc32这个资源编译工具来生成dcr。
1、首先,我们新建立一个rc文件叫EditEx1.rc,用记事本打开写内容为:
TEDITEX1 BITMAP TEDITEX1.bmp
前面表示资源名称为TEDITEX1, BITMAP表示是位图资源, TEDITEX1.bmp指定的就是位图的文件了
2、rc文件建立好了之后,运行命令brcc32 文件路径\EditEx1.rc
3、会在对应的文件夹下生成一个EditEx1.res的资源文件,我们将后缀名改为dcr,那就是我们需要的那个资源文件了,然后我们再修改TEditEx1.dpk的那个包文件代码
修改方法看图:

package TEditEx1;
{$R 'EditEx1.dcr'} // 此行为后面添加的
{$R *.res}
{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO OFF}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION OFF}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES ON}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DEFINE DEBUG}
{$ENDIF IMPLICITBUILDING}
{$IMPLICITBUILD ON}
requires
rtl,
vcl;
contains
EditEx1 in 'EditEx1.pas';
end.
在最开头添加一行{$R 'EditEx1.dcr'},这个就表示包含进我们刚编辑完成的那个资源文件。
注意几点:
1、图片为bmp、大小24 * 24、色深不大于 24位。
2、资源名称必须大写且和组件类名称一致。如上面的: 资源名称 TEDITEX1, 组件类名称 TEditEx1
3、EditEx1.dcr 和 EditEx1.pas 在同一目录下。
4、关闭工程重新打开,你会发现EditEx1.dcr已列出到项目管理器。如下图
5、重新编译,安装,即可了;如果图标没有变化可尝试重启电脑,重新编译,安装。

效果图:





