我知道我已经看到了一个例子,该例子使用相同的类名定义了现有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(Instance: TObject; const ClassName: string)建议梅森回忆的黑客。第一行设置ClassType := Instance.ClassType。因此,我怀疑通过将pas文件中的声明从Button1: TButton更改为Button1: MyUnit.TButton会导致创建按钮。或者可能的破解方法是在结尾处在子句中添加MyUnit,以使您的TButton版本在范围之内。但是,这听起来并不实用。

09-25 17:42