Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: lyleОтветов: 2

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

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

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

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

propertiescomponentslazarus

Ответы

Ответ 1 · рейтинг 2 · Paul Ishenin

Чтобы получить свойство класса, вам необходимо: 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;

Ответ 2 · Marco van de Voort

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы