我知道我已经看到一个例子,在一个黑客的地方定义一个现有的VCL组件的定制版本,如TButton或TEdit,具有相同的类名,并做一些事情,使DFM流光镜将实例化您的版本,而不是原本的.不幸的是,我处于这样的情况,我需要能够做到这一点,我找不到写作.有人知道在哪里找到关于如何完成这个的信息?
解决方法
在您的表单中,您可以覆盖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(实例:TObject; const ClassName:string)建议Mason回忆的破解.第一行设置ClassType:= Instance.ClassType.所以我怀疑通过将pas文件中的声明从Button1:TButton更改为Button1:MyUnit.TButton将导致您的按钮被创建.或者也许黑客是在最后添加MyUnit到uses子句,以便你的版本的TButton是范围内的.然而,这些都不是很实际的.