2016-05-30 3 views
1

У меня есть компонент, унаследованный от 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; 
+0

Вы установили компонентный пакет в среду IDE? –

+0

yes, является установочным пакетом, однако, как указано выше, не сохраняет значение свойства Algarve в dfm ... Если я изменяю наследование TFrame на TEdit, например, эта проблема не возникает –

+0

Не смей нужно использовать другую функцию для регистрации фрейма –

ответ

1

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

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

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

TMyComponent = class (TFrame) 

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

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