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


0

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

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

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

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

Источник
  •  27
  •  2
  • 19 апр 2020 2020-04-19 07:54:42

2 ответа

0

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

2

Чтобы исправить свойство класса, вам необходимо: 1. Создайте это свойство внутри своего компонента-конструктора - так оно никогда не будет nil 2. в вашем сетевом сетевом устройстве вам необходимо назначить новое значение для вашего компонента. Поэтому вы должны реализовать метод 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;