我知道我在某个地方看到过一个 hack 的例子,用于定义现有 VCL 组件的自定义版本,例如TButton
or TEdit
,具有相同的类名,并执行一些操作,以便 DFM Streamer 实例化您的版本而不是原始版本。不幸的是,我所处的情况是我需要能够做到这一点,但我找不到这篇文章。有谁知道在哪里可以找到有关如何实现此目标的信息?
在您的表单中,您可以覆盖ReadState
像这样的方法:
type
TMyForm = class(TForm)
protected
procedure ReadState(Reader: TReader); override;
end;
procedure TMyForm.ReadState(Reader: TReader);
begin
Reader.OnFindComponentClass := FindComponentClass;
inherited;
end;
procedure TMyForm.FindComponentClass(Reader: TReader; const ClassName: string;
var ComponentClass: TComponentClass);
begin
if ComponentClass=TButton then begin
ComponentClass := TMySuperDuperButton;
end else if ComponentClass=TEdit then begin
ComponentClass := TMyTotallyAwesomeEdit;
end;
end;
可能还有很多其他方法可以做到这一点,但这就是我的做法!
编辑:检查TReader.GetFieldClass(Instance: TObject; const ClassName: string)
梅森回忆起的黑客行为。第一行设置ClassType := Instance.ClassType
。所以我怀疑通过更改 pas 文件中的声明Button1: TButton
to Button1: MyUnit.TButton
将导致您的按钮被创建。或者也许黑客是添加MyUnit
到最后的 use 子句,以便您的 TButton 版本是在范围内的版本。然而,这些听起来都不实用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)