2013-04-18 4 views
2

У нас есть некоторые устаревшие пользовательские компоненты delphi, которые переопределяют createwnd. Эти компоненты располагаются на панели внутри формы.Изменение родительского контейнера вызывает повторный вызов Createwnd, Delphi 6

Когда форма и панель получают экземпляр, так и компоненты, а createwnd вызывается один раз. Это имеет смысл.

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

Например, при определенных обстоятельствах я могу изменить родительский контейнер Panel1 как Form2.panel2. В основном рисовать Panel1 внутри панели Form2 во время выполнения.

TForm1.buttonclick(..) 
begin 
.. 
    Panel1.parent := Form2.panel2; 
.. 
end; 

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

И поведение одинаково для всех компонентов Panel1, даже для тех, которые не являются обычными, например, если у меня также был TButton на Panel1, будет ли он также воссоздаваться при переключении родителей? Я не думаю, что это так, поэтому я был так удивлен.

И, наконец, если это неправильное поведение, как это сделать, то createwnd не вызывается при изменении родительских контейнеров.

Спасибо!

+2

Поведение неверно. Он так же разработан. –

+2

На самом деле, что называется 'TControl.RecreateWnd'. Посмотрите на источник VCL, если он у вас есть; он ведет себя точно так же, как и был разработан. –

ответ

7

Все элементы управления на панели, которые спускаются с TWinControl, имеют обновленные оконные ручки, а также ручку окна панели (причина в другом).

Если ваш код должен называться только один раз за всю жизнь программы, то CreateWnd - это неправильное место. Вместо этого попробуйте конструктор.

Кроме того, замена панели из одной формы на другую может привести к смешению владения панелью и может привести к неожиданному поведению или даже к ошибкам. См .: How to detach a panel and show it in a separate window?

+0

Благодарим вас за ответ и прозрение. Я буду переводить код в конструктор. – sse

+0

Также казалось бы, что только изменение формы стиля, например, от fsMdichild до fsNormal, также вызывает создание компонентов компонентов. – sse

+0

Как и во многих других свойствах, таких как 'BorderStyle' и т. Д. ... – NGLN