如何让VCL设计器中TEdit介入类的CheckValid属性在新拖放控件显示
VCL设计器显示自定义TEdit控件属性的实现方法
你当前使用的是单元级类重定义(类劫持)方案,这种实现仅在运行时生效,VCL设计器默认读取的是原生Vcl.StdCtrls.TEdit的元数据,因此不会显示你自定义的CheckValid属性。可以通过以下两种稳定方案实现需求:
方案1:将自定义类封装为正式自定义控件(推荐)
该方案兼容性最好,不会影响原生TEdit的使用:
- 调整自定义类命名避免和原生类冲突,示例调整后代码如下:
unit MyEditUnit; interface uses Vcl.StdCtrls, System.Classes, System.Threading, Vcl.Controls; type TMyEdit = class(Vcl.StdCtrls.TEdit) private FCheckValid : boolean; procedure GetLength; protected procedure Change; override; // 示例:修改Text时触发GetLength逻辑 published property CheckValid : boolean read FCheckValid write FCheckValid; end; procedure Register; implementation uses Vcl.Graphics, System.SysUtils; procedure TMyEdit.Change; begin inherited; // 增加设计时判断,避免多线程逻辑在IDE中执行导致崩溃 if not (csDesigning in ComponentState) then GetLength; end; procedure TMyEdit.GetLength; var aTask : ITask; begin if Length(Self.Text) = 0 then begin aTask := TTask.Create( procedure begin TThread.Synchronize(TThread.Current, procedure begin Self.Color:=clYellow; end); Sleep(100); TThread.Synchronize(TThread.Current, procedure begin Self.Color:=clWhite; end); end ); aTask.Start; end; end; procedure Register; begin // 注册到组件面板的CustomControls分类 RegisterComponents('CustomControls', [TMyEdit]); end; end.
- 新建Delphi设计时包项目,将上述单元添加到包中,编译后点击「安装」按钮将包注册到IDE
- 安装完成后组件面板的
CustomControls分类下会出现TMyEdit控件,拖放到窗体后,对象查看器中就会直接显示CheckValid属性。
方案2:替换原生TEdit类
如果你需要拖放原生TEdit控件就自动加载你的自定义逻辑和属性,可以用组件替换机制:
- 自定义类保留和原生类相同的名称
TEdit - 在设计时包的注册逻辑中添加类替换声明,将原生TEdit映射到你的自定义类,同时要保证自定义类完全兼容原生TEdit的所有公开接口,避免IDE崩溃。
- 安装设计时包后,拖放原生TEdit时IDE会自动创建你的自定义类实例,对象查看器也会显示
CheckValid属性。
临时调试方案
如果你只是临时测试不想做组件包,可以直接在窗体的DFM文件中手动添加属性赋值,比如:
object Edit1: TEdit Left = 200 Top = 100 Width = 121 Height = 21 Text = 'Edit1' CheckValid = True // 手动添加该行即可 end
该方式运行时可以正常读取属性值,仅设计时对象查看器不会显示该属性。
内容的提问来源于stack exchange,提问作者user1937012
相关产品推荐
相关产品推荐

