In your form you can override the ReadState
method like so:
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;
There are likely numerous other ways to do this, but this is how I do it!
EDIT: Inspecting TReader.GetFieldClass(Instance: TObject; const ClassName: string)
suggests the hack that Mason recalls. The first line sets ClassType := Instance.ClassType
. So I suspect that by changing the declaration in the pas file from Button1: TButton
to Button1: MyUnit.TButton
will result in your button being created. Or perhaps the hack was to add MyUnit
to the uses clause right at the end so that your version of TButton is the one that is in scope. However, none of this sounds very practical.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…