TComponent.InsertComponent

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

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

TComponent.InsertComponent

Сообщение VirtUX » 18.08.2010 21:13:01

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

Добавлено спустя 22 минуты 41 секунду:
Если сделать так:
Код: Выделить всё
Panel1.InsertComponent(ButtonA);
ButtonA.Parent := Panel1;

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

Re: TComponent.InsertComponent

Сообщение Mr.Smart » 18.08.2010 21:48:10

Не вызывайте InsertComponent. При присваивании ButtonA.Parent := Panel1; контрол автоматически переносится на Panel1.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TComponent.InsertComponent

Сообщение VirtUX » 18.08.2010 22:04:41

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

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

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

Re: TComponent.InsertComponent

Сообщение Mr.Smart » 18.08.2010 22:08:07

А зачем вам переопределять Owner? И ещё если вы думаете, что присвоение Parent управляет перерисовкой контрола, то вы ошибаетесь. При присвоении значение Parent контрол переносится на оконный контрол.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TComponent.InsertComponent

Сообщение VirtUX » 18.08.2010 22:11:03

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

Предидущий Owner может быть уничтожен во время исполнения.
Конечно можно создать новый. Потом Assign. Потом Удалить старый. НО! Должен быть простой и, главное, быстрый способ!
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: TComponent.InsertComponent

Сообщение Mr.Smart » 18.08.2010 22:14:58

Создавайте контрол как
Код: Выделить всё
ButtonA:=TButton.Create(nil)

и забейте на Owner.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: TComponent.InsertComponent

Сообщение VirtUX » 18.08.2010 22:20:21

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; 
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 59

Рейтинг@Mail.ru