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;
2条答案
按热度按时间xfb7svmp1#
在窗体中,可以重写
ReadState
方法,如下所示:可能还有很多其他的方法可以做到这一点,但这就是我如何做到的!
编辑:检查
TReader.GetFieldClass(Instance: TObject; const ClassName: string)
会发现Mason回忆起的黑客攻击。第一行设置ClassType := Instance.ClassType
。所以我怀疑通过将pas文件中的声明从Button1: TButton
更改为Button1: MyUnit.TButton
会导致创建您的按钮。或者,黑客攻击可能是将MyUnit
添加到uses子句的最后,以便您的TButton版本在范围内。不过,这些听起来都不太实用。kyks70gy2#
我猜你要记住的是"interposer class":继承一个与祖先同名的类,通过前缀祖先的单元名。由于类名没有改变,dfm流机制没有被干扰。只会影响重新声明类的单元,除非它被放在一个单独的单元中,并且那个单元被包括在基类后面的uses节中。显然,你不能在一个插入类中发布属性。