我知道我已经看到一个例子,在一个黑客的地方定义一个现有的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是范围内的.然而,这些都不是很实际的.
原文地址:https://www.jb51.cc/delphi/102682.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。