Почему мой новый элемент управления не появляется, если я передаю родительский элемент управления в Create вместо назначения свойства Parent?

В Lazarus я пытаюсь это сделать:

TabSaveButton := TButton.Create(nil);
with TabSaveButton do
  begin
    Parent:=NewTab;
    Width:=75;
    Height:= 25;
    Top:=530;
    Left:=715;
    Caption:='Save';
  end;

И это работает. То есть я получаю кнопку, и она активна, и она является дочерним элементом динамически созданной вкладки.

Но следующее не не показывает ни кнопку, ни ошибки:

TabSaveButton := TButton.Create(NewTab);
with TabSaveButton do
  begin
    Width:=75;
    Height:= 25;
    Top:=530;
    Left:=715;
    Caption:='Save';
  end;
  1. Почему второй способ не работает?

  2. Одинаково ли это влияет на Lazarus и Delphi?


person itsols    schedule 12.12.2012    source источник
comment
Вам просто не хватает Parent участника.   -  person TLama    schedule 12.12.2012
comment
@TLama: Бьюсь об заклад, ОП считает, что Parent и Owner - это одно и то же.   -  person Andreas Rejbrand    schedule 12.12.2012
comment
@Андреас, да, ты прав, теперь я понимаю. Удаление моих комментариев...   -  person TLama    schedule 12.12.2012
comment
@TLama +1 за вашу мысль - спасибо!   -  person itsols    schedule 12.12.2012


Ответы (1)


Аргумент Create устанавливает владельца элемента управления. Владелец — это компонент, ответственный за освобождение рассматриваемого компонента. Например, если вы освобождаете компонент, то все компоненты, принадлежащие ему, также освобождаются. родительский элемент — это совсем другое. Это окно (элемент управления), в котором размещен рассматриваемый элемент управления.

Здесь нет разницы между Delphi и Lazarus.

person Andreas Rejbrand    schedule 12.12.2012
comment
Спасибо за этот сверхбыстрый ответ. Итак, из того, что вы говорите, они оба действуют как суперкласс для контроля. И если я освобожу родителя ИЛИ владельца, разве внутренний контроль не должен быть освобожден? - person itsols; 12.12.2012
comment
Если вы освобождаете владельца, контроль также освобождается. ‹del›Если вы освобождаете родителя, он не освобождается. И у него нет родителя, так что я бы предположил, что он становится невидимым.‹/del› - person Andreas Rejbrand; 12.12.2012
comment
Так правильно ли говорить, что владельцем может быть любой объект, но родителем всегда является элемент управления окном? - person itsols; 12.12.2012
comment
Почти. Я думаю, что родитель должен быть TComponent. Но это не обязательно должен быть визуальный элемент управления, и даже если он есть, он не обязательно должен быть оконным. Но, конечно, родитель должен быть окном (оконный элемент управления). - person Andreas Rejbrand; 12.12.2012
comment
@Andreas, ad Если вы освобождаете родителя, он не освобождается. Нет, даже Parent освобождает всех своих потомков. - person TLama; 12.12.2012
comment
@TLama: Хорошо, думаю, это хорошо. (В свое оправдание могу сказать, что я только что начал тестовый проект, чтобы выяснить это!) - person Andreas Rejbrand; 12.12.2012
comment
@TLama Правда в Delphi. Неправда в Лазаре. - person David Heffernan; 12.12.2012
comment
Таким образом, ни родитель, ни владелец не выступают в качестве суперкласса для элемента управления. Термин суперкласс уже относится к чему-то другому. В случае TButton надклассом является TCustomButton. Вы можете получить это значение во время выполнения с помощью метода ClassParent. . Родитель, владелец и суперкласс — это три совершенно разных понятия. - person Rob Kennedy; 12.12.2012
comment
@Tlama: раньше в Delphi освобождение родителя не освобождало детей. Это изменилось после D5, хотя я точно не знаю, в какой именно версии. - person Marjan Venema; 12.12.2012
comment
@RobKennedy +1 за ваш вклад. Спасибо за это объяснение - person itsols; 12.12.2012