Я схожу с ума из-за того, что «не могу создать циклическую зависимость между компонентами» в Delphi FMX. Я программно создаю элементы управления в форме, частью которой является метка, внутри сетки, внутри поля прокрутки, внутри сетки.
Соответствующие части кода:
Layout := TGridPanelLayout.Create(self);
Layout.Parent := self;
Panel := TVertScrollBox.Create(self);
Panel.Parent := Layout;
Form := TGridPanelLayout.Create(self);
Form.Parent := Panel;
FormLabel := TLabel(self);
FormLabel.Parent := Form;
Это в последней строке, где я получаю ошибку.
В частности, строка 4387 в FMX.Types вызывает ошибку:
procedure TFmxObject.SetParent(const Value: TFmxObject);
begin
if Value = Self then
Exit;
if FParent <> Value then
begin
if IsChild(Value) then
raise EInvalidOperation.Create(SCannotCreateCircularDependence);
if FParent <> nil then
FParent.RemoveObject(Self);
if Value <> nil then
Value.AddObject(Self)
else
FParent := Value;
end;
end;
Кто-нибудь знает, почему этот вопрос возникает из-за множества новых элементов управления?
Есть некоторый код, который не включен, но он настраивает строки/столбцы и не имеет значения, но я могу опубликовать при необходимости.
Спасибо.
FormLabel := TLabel(self);
Эта линия неверна. Вы сами выполняете приведение типов Self
вместо того, чтобы создавать новый ярлык, которым Self
владеет. Итак, вы действительно создаете циклическую ссылку:
Layout
— ребенок Self
= ОК
Panel
— ребенок Layout
= ОК
Form
— ребенок Panel
= ОК
FormLabel
(он же Self
) является дочерним элементом Form
= ОШИБКА! Self
не может быть (внуком)сам по себе.
Вместо этого строка должна быть такой:
FormLabel := TLabel.Create(self);
Спасибо, @Remy-Lebeau. Я впервые что-то программирую на Delphi, и я привык к тому, как работают конструкторы в большинстве других языков. Не знаю, как я этого не увидел (умирает). Спасибо!