в Lazarus на Linux я зарегистрировал класс как компонент, чтобы я мог скинуть его на форму.
Работает как шарм, за исключением того, что свойства, которые я могу опубликовать, ограничены простыми типами, такими как строки и целые числа.
Всякий раз, когда я пытаюсь опубликовать свойство, такое как TStringList или TImage, при нажатии возникает "Нарушение прав доступа". на нем в инспекторе объектов.
Я сравнил свой код со стандартными компонентами, но не вижу, что они делают по-другому.
Итак, какие дополнительные шаги необходимы для использования таких свойств в инспекторе объектов?
Ответ 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, для использования сложных типов во время разработки должен быть код времени разработки, который обрабатывает их отображение/редактирование.