TOldBadButton=class(TButton)
private
fNoNeedToShowWarning: Boolean; //false when created
//some other stuff
protected
procedure Loaded; override;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
//some other stuff
end;
和实施:
procedure TBadOldButton.Loaded;
begin
inherited;
fNoNeedToShowWarning:=true;
end;
procedure TOldBadButton.WMPaint(var Message: TWMPAINT);
begin
inherited;
if (csDesigning in ComponentState) and not fNoNeedToShowWarning then begin
Application.MessageBox('Please, don''t use this component','OldBadButton');
fNoNeedToShowWarning:=true;
end;
end;
TStupidOpenDialog = class(TOpenDialog)
private
fNoNeedToShowWarning: boolean;
function GetAawPlease: string;
procedure SetAawPlease(value: string);
//some other stuff
protected
procedure Loaded; override;
//some other stuff
published
//with name like this, probably will be on top in property list
property Aaw_please: string read GetAawPlease write SetAawPlease;
end;
实施:
procedure TStupidOpenDialog.Loaded;
begin
inherited;
fNoNeedToShowWarning:=true; //won't show warning when loading form
end;
procedure TStupidOpenDialog.SetAawPlease(value: string);
begin
//nothing, we need this empty setter, otherwise property won't appear on object
//inspector
end;
function TStupidOpenDialog.GetAawPlease: string;
begin
Result:='Don''t use this component!';
if (csDesigning in ComponentState) and not fNoNeedToShowWarning then begin
Application.MessageBox('Please, don''t use this component','StupidOpenDialog');
fNoNeedToShowWarning:=true;
end;
end;
2条答案
按热度按时间w41d8nur1#
有一个受保护的动态方法TComponent.PaletteCreated,它只在一种情况下被调用:当我们从组件面板将此组件添加到表单时。
从组件面板创建组件时响应。
PaletteCreated是在设计时从组件面板创建组件时自动调用的。组件编写者可以重写此方法,以执行仅在从组件面板创建组件时才需要的调整。
在TComponent中实现时,PaletteCreated不执行任何操作。
您可以重写此方法以显示警告,这样,当用户试图将其放入窗体时,它只会警告用户一次。
更新
我无法在 Delphi 7、XE2和Delphi 10西雅图(试用版)中使用此过程,因此似乎无法实现从IDE调用PaletteCreated。
我将报告发送至QC:http://qc.embarcadero.com/wc/qcmain.aspx?d=135152也许有一天开发人员会让它工作。
更新2
有一些有趣的变通方法,我一直都在尝试,都能正常工作。假设TOldBadButton是不应该使用的组件之一。我们重写'Loaded'过程和WMPaint消息处理程序:
和实施:
问题是,这只适用于可视组件。如果你有自定义的对话框,图片列表等,他们永远不会得到WMPaint消息。在这种情况下,我们可以添加另一个属性,所以当它在对象检查器中显示时,它会调用getter,在这里我们会显示警告。类似这样的东西:
实施:
老版本的 Delphi 总是在从面板添加新组件时将对象检查器滚动到顶部,所以我们的Aaw_please属性肯定会起作用。新版本倾向于从属性列表中的某个选定位置开始,但非可视组件通常有相当多的属性,所以这应该不是问题。
nom7f22z2#
要确定组件首次创建(放置在窗体上)的时间,请执行以下操作:
覆写**“CreateWnd”**并在其中使用下列if陈述式:
点击此处了解更多详情〉〉Link