Не сохраняйте опубликованное свойство в фрейме компонента
У меня есть компонент, унаследованный от 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 не может найти файлы этого компонента, добавьте папку, содержащую их, в путь поиска.