У нас есть некоторые устаревшие пользовательские компоненты Delphi, которые переопределяют createwnd. Эти компоненты располагаются на панели внутри формы.
Когда форма и панель создаются, то же самое делают и компоненты, и createwnd вызывается один раз. Это имеет смысл.
Я был удивлен, обнаружив, что createwnd будет вызываться снова, если я переключу родителя панели во время выполнения.
Например, при определенных обстоятельствах я могу изменить родительский контейнер Panel1 на Form2.panel2. В основном рисование Panel1 внутри панели Form2 во время выполнения.
TForm1.buttonclick(..)
begin
..
Panel1.parent := Form2.panel2;
..
end;
Почему пользовательские компоненты в Panel1 создаются заново при изменении родительского компонента?
И является ли поведение одинаковым для всех компонентов в Panel1, даже для тех, которые не являются пользовательскими, например, если бы у меня также был TButton на Panel1, он также был бы воссоздан при переключении родителей? Я не думаю, что это так, поэтому я был так удивлен.
Наконец, если это поведение неверно, как мне сделать так, чтобы createwnd не вызывался при изменении родительских контейнеров.
Спасибо!
TControl.RecreateWnd
. Посмотрите исходный код VCL, если он у вас есть; он ведет себя точно так, как задумано. - person Ken White   schedule 19.04.2013