Подтвердить что ты не робот

Можете ли вы удалить опубликованное свойство из компонента delphi и не вызывать ошибок в формах, в которых используется компонент?

У меня есть компонент, который был разработан моей компанией и хотел бы удалить одно из опубликованных свойств, которое больше не требуется, и сталкивается с тем, как работает компонент сейчас.

Есть ли способ удалить свойство, а не вызвать свойство, которое не найдено ошибок во время выполнения или время разработки, когда загружаются формы, которые используют компонент? Т.е. существует ли способ заставить Delphi отключить свойство компонента?

4b9b3361

Ответ 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 *.

Ответ 2

Да. Просто удалите свойство, затем переопределите DefineProperties и обработайте его там. Это будет удовлетворять потоковой системе, загружая значение, которое вы можете просто выбросить. Обязательно ничего не делайте при записи потока.

Ответ 3

Вы не можете "тихо" удалить его, если он хранится в .DFM или указан в коде.

Если он не был указан в коде и хранился в текстовых файлах .DFM, JVCL имеет утилиту под названием DFM Cleaner, которая пройдет через. DFM и удалить свойства для вас. Затем вы можете открыть формы и перекомпилировать свои приложения безопасно. Он является частью JVCL и помещается в папку $(JVCL)\DevTools во время установки.