Публикация свойства в компоненте Lazarus вызывает «Нарушение прав доступа».

в Lazarus на Linux я зарегистрировал класс как компонент, чтобы я мог скинуть его на форму.

Работает как шарм, за исключением того, что свойства, которые я могу опубликовать, ограничены простыми типами, такими как строки и целые числа.
Всякий раз, когда я пытаюсь опубликовать свойство, такое как TStringList или TImage, при нажатии возникает «Нарушение прав доступа». на нем в инспекторе объектов.

Я сравнил свой код со стандартными компонентами, но не вижу, что они делают по-другому.

Итак, какие дополнительные шаги необходимы для использования таких свойств в инспекторе объектов?


person lyle    schedule 25.01.2010    source источник


Ответы (2)


Чтобы получить свойство класса, вам необходимо: 1. Создать это свойство внутри конструктора вашего компонента, чтобы оно никогда не было нулевым 2. В вашем свойстве Setter вам нужно присвоить новое значение вашему компоненту. Поэтому вы должны реализовать метод Assign или AssignTo в своем компоненте. например

TMyComponent = class
private
  FString: TStrings;
published
  property Strings: TStrings read FStrings write SetStrings;
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  // always create it in the constructor so it will not be nil
  FStrings := TStringList.Create;
end;

procedure TMyComponent.SetStrings(const AValue: TStrings);
begin
  // this is correct statement
  FStrings.Assign(AValue);
  // this is not correct
  // FStrings := AValue;
end;
person Paul Ishenin    schedule 05.02.2011

Я думаю, что это примерно то же самое, что и в Delphi, для использования сложных типов во время разработки должен быть код времени разработки, который обрабатывает их отображение/редактирование.

person Marco van de Voort    schedule 26.01.2010
comment
Можете ли вы указать мне некоторые документы об этом? Ни в одной документации, которую я читал, ничего не говорится о специальной обработке сложных типов. :( - person lyle; 28.01.2010