В вашей форме вы можете переопределить метод 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 была той, которая находится в области видимости. Тем не менее, все это не кажется очень практичным.