Ответ 1
В зависимости от свойства проще всего оставить свойство, но пометьте его как устаревшее и просто укажите, что бит чтения/записи указывает на поле, которое никогда не использовалось.
В качестве альтернативы вы можете переопределить DefineProperties
и вызвать Filer.DefineProperty('PropertyName', ReadProc);
, где PropertyName - это свойство, которое вы удалили, а ReadProc - это функция, которая вызывает различные Чтения TReader * функции. Это имеет то преимущество, что свойства больше не находятся в вашем интерфейсе.
Например, скажем, вы удалили это свойство:
property Center: TPoint read FPoint write SetPoint;
Здесь вы добавили бы к своему компоненту:
TMyComponent = class...
private
procedure SkipReadPoint(Reader: TReader);
protected
procedure DefineProperties(Filer: TFiler); override;
end;
procedure TMyComponent.DefineProperties(Filer: TFiler);
begin
inherited;
Filer.DefineProperty('Center', SkipReadPoint, nil, False);
end;
procedure TMyComponent.SkipReadPoint(Reader: TReader);
begin
Reader.ReadListBegin;
Reader.ReadInteger;
Reader.ReadInteger;
Reader.ReadListEnd;
end;
Пропуск простого типа типа Boolean или Integer проще, поскольку вы можете просто вызвать ReadBoolean
или ReadInteger
, не беспокоясь о функциях ReadList.
В нашем случае у нас было много сходных свойств в группе классов (для совместимости с CLX), поэтому у нас были глобальные функции "dummy":
procedure DummyReadBool(Self: Pointer; Reader: TReader);
begin
Reader.ReadBoolean;
end;
const
SkipReadBool: TMethod = (Code: @DummyReadBool; Data: nil);
а затем вызов DefineProperty выглядит следующим образом:
Filer.DefineProperty('PropName', TReaderProc(SkipReadBool), nil, False);
Таким образом, каждому классу не нужно дублировать функции Skip *.