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