Публикация свойства в компоненте Lazarus вызывает «нарушение прав доступа». - PullRequest
0 голосов
/ 25 января 2010

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Чтобы выставить собственность класса, вам нужно: 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;
0 голосов
/ 26 января 2010

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

...