Не сохраняйте опубликованное свойство в фрейме компонента

У меня есть компонент, унаследованный от TFrame... Но мои опубликованные свойства не сохраняют значения в.dfm... Ошибка возникает при закрытии Delphi и повторном открытии, перезагружая проект.

Эта ошибка: "Ошибка чтения MyComponent1.Obs: свойство Obs не существует..."

TMyComponent = class(TFrame)
   FObs: string;
   procedure SetObs(const Value: string);
published
   property Obs: string read FObs write SetObs;
end;

procedure register;

implementation

procedure register;
begin
   RegisterComponents('My Components', [TMyComponent]);
end;

procedure TMyComponent .SetObs(const Value: string);
begin
  if FObs <> Value then
    FObs := Value; 
end;

1 ответ

Мне удалось воспроизвести ошибку и затем исправить ее, но я не могу точно понять, почему это происходит, связано с визуальным наследованием, которое работает довольно сложным образом (надеюсь, Дэвид или Реми могли бы объяснить, что здесь происходит).

Прежде всего, эта ошибка указывает, что свойство действительно было сохранено в файл dfm. Дело в том, что это совершенно нормальная ситуация, когда некоторые свойства отсутствуют в dfm, это просто означает, что свойство должно иметь значение по умолчанию (или значение, которое было у предка), поэтому IDE никогда не вызывает ошибку, потому что не нашла какое-либо свойство в файле.

Здесь происходит обратное: свойство 'obs' было найдено в dfm, но не найдено в самом классе. То же самое произошло, когда я создал новый проект, а затем добавил рамку для самого проекта. Похоже, что в этом случае вместо обычного наследования имело место визуальное наследование, а именно: IDE обнаружил, что класс TMyComponent описан в "визуальном" блоке, принадлежащем проекту, нашел эту строку:

TMyComponent = class (TFrame)

и сделал TMyComponent просто псевдоним для TFrame, Вот почему произошла ошибка: TFrame на самом деле не имеет свойства "obs".

И вот обходной путь: не добавляйте этот фрейм в сам проект. Вместо этого добавьте кадр из палитры компонентов. Таким образом, все работает как положено. Если IDE не может найти файлы этого компонента, добавьте папку, содержащую их, в путь поиска.

Другие вопросы по тегам