2013-04-18 2 views
2

createwnd를 재정의하는 일부 기존 델파이 사용자 정의 컴포넌트가 있습니다. 이러한 구성 요소는 양식 내의 패널에 있습니다.상위 컨테이너를 변경하면 Createwnd가 다시 호출됩니다. Delphi 6

폼과 패널이 인스턴스화되면 구성 요소도 초기화되므로 createwnd는 한 번 호출됩니다. 이것은 의미가 있습니다.

런타임 중에 패널의 부모를 전환하면 createwnd가 다시 호출된다는 사실에 놀랐습니다.

예를 들어 특정 상황에서 Panel1의 상위 컨테이너를 Form2.panel2로 변경할 수 있습니다. 기본적으로 런타임에 Form1의 패널 안에 Panel1을 그립니다.

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

부모가 변경되면 왜 Panel1의 사용자 지정 구성 요소가 다시 만들어 집니까?

그리고 Panel1의 모든 구성 요소에 대해 동일한 동작이 발생합니다. 예를 들어 Panel1에 TButton이있는 경우와 같이 사용자 지정이 아닌 경우에도 부모가 전환 될 때 다시 생성됩니까? 나는 그렇게 생각하지 않는다. 그래서 나는 너무 놀랐다.

마지막으로,이 동작이 올바르지 않으면 부모 컨테이너가 변경 될 때 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로 formstyle을 변경하는 것 또한 구성 요소의 createwnds를 트리거하는 것으로 보입니다. – sse

+0

'BorderStyle' 등 많은 다른 속성과 마찬가지로 ... – NGLN