TComponent.InsertComponent

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

TComponent.InsertComponent

Сообщение VirtUX »

Расскажите пожайлуста как с помощью этого метода переопределить предка? И есть-ли нюансы его поведения между временем исполнения, и временем дизайна?
Например:
Есть ButtonA. Он при дизайне имел Owner = Form1. Далее во время исполнения нужно его программно переопределить к Panel1 (не путать с перерисовать на Panel1 с помощью Parent), чтоб Owner стал указывать на Panel1.

Добавлено спустя 22 минуты 41 секунду:
Если сделать так:

Код: Выделить всё

Panel1.InsertComponent(ButtonA);
ButtonA.Parent := Panel1;

то при закрытии приложения вылетает ошибка и курсор становится на inherited Destroy; в деструкторе TControl.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Не вызывайте InsertComponent. При присваивании ButtonA.Parent := Panel1; контрол автоматически переносится на Panel1.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Mr.Smart писал(а):При присваивании ButtonA.Parent := Panel1; контрол автоматически переносится на Panel1.

Читаем выше:
VirtUX писал(а):(не путать с перерисовать на Panel1 с помощью Parent)

и далее:
VirtUX писал(а):чтоб Owner стал указывать на Panel1
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

А зачем вам переопределять Owner? И ещё если вы думаете, что присвоение Parent управляет перерисовкой контрола, то вы ошибаетесь. При присвоении значение Parent контрол переносится на оконный контрол.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Мне кажется нехватает еще какойто процедурки для вичистки его из предидущего Owner'а. :?
А зачем вам переопределять Owner?

Предидущий Owner может быть уничтожен во время исполнения.
Конечно можно создать новый. Потом Assign. Потом Удалить старый. НО! Должен быть простой и, главное, быстрый способ!
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Создавайте контрол как

Код: Выделить всё

ButtonA:=TButton.Create(nil)

и забейте на Owner.
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

Mr.Smart писал(а):Создавайте контрол как

Код: Выделить всё

ButtonA:=TButton.Create(nil)

и забейте на Owner.

Вариант. Но как в дизайнере форм сделать Owner = nil?

Добавлено спустя 14 минут 37 секунд:
Вот решение проблемы:

Код: Выделить всё

var
  own, b: TComponent;
begin
  own := ButtonA.Owner;
  b := ButtonA;
  own.RemoveComponent(ButtonA);
  Panel1.InsertComponent(b);
  TWinControl(b).Parent := Panel1; 
Ответить