2011-09-06 6 views
2

저는 Delphi의 '일반'도킹 (DockSite = True 및 UseDockManager = True)을 사용하고 있습니다. 이제 몇 가지 DockSite 컨트롤과 몇 가지 도킹 가능한 폼이 있습니다. 그러나 각 도킹 가능 양식이 각 독점 사이트에 들어갈 예정은 아닙니다.컨트롤이 도킹 될 위치를 어떻게 알 수 있습니까? 도킹을 방지하려면 어떻게해야합니까?

양식에 어떤 종류의 컨트롤이 부착되어 있는지 알고 있습니다. OTOH는 어떤 양식을 받아 들일지 알지 못합니다.

지금 내 문제는 드래그/드롭 (또는 드래그/고정) 작업을 취소 할 수있는 몇 가지 이벤트 인 DragOver, StartDock 등입니다. 그러나 이러한 이벤트는 모두 '수신'측에서 발생합니다. 떨어지는 컨트롤의 측면에; 그것이 내가 갖고 싶어하는 곳입니다. 그래서 도킹 된 폼이 특정 컨트롤에 도킹되는 것을 거부 할 수 있습니다.

그런 사건이 있습니까, 나는 무엇인가 내려다보고 있습니까? 아니면 다른 방식으로이 문제를 해결해야합니까?

+0

제대로 설정하면 양쪽에서 도크를 취소해도 문제가 없습니다. 도킹을 거부하는 목적지가 귀하에게 적합하지 않은 이유가 있습니까? –

+0

양식을 가능한 한 '플러그 형'으로 만들고 모든 필요한 로직 (비즈니스 클래스에 대한 참조)을 포함하고 싶습니다. 하지만 대상 컨트롤에 포함될 양식에 대한 지식이 없도록하고 싶습니다. 앞으로는 새로운 (클래스의) 도킹 가능한 양식을 추가해야 할 수도 있습니다. – Martijn

+0

도킹 가능한 양식에 기본 클래스를 사용할 수 없습니까? 그러면 컨트롤의 공간을 크게 줄일 수 있습니다. –

답변

1

나는 주석 대신 답변으로 추가해야한다고 생각했습니다. 사용자 정의 양식에 대한 기본 양식을 작성하고 논리를 입력하십시오. 그런 다음 각 컨트롤은 하나의 양식 클래스와 상호 작용하는 방법을 알아야합니다. 당신이 만드는 각각의 새로운 도킹 폼은이 기본 폼에서 내려와야 할 것입니다. 이 기능의 장점은 표준 이벤트 핸들러를 통해 모든 것을 처리 할 수 ​​있으므로 컨트롤의 사용자 지정 버전을 만들 필요가 없다는 것입니다.

0

도킹되는 컨트롤/폼에 대해 OnStartDock 이벤트가 시작되고 DockSite 컨트롤이 도킹되지 않는 경우에는 이벤트가 시작됩니다. 따라서 OnStartDock 이벤트 핸들러를 도킹 가능한 양식에 할당하거나 가상 DoStartDock() 메서드를 더 잘 재정의 할 수 있습니다.

+0

'OnStartDock'은 컨트롤이 드래그되기 시작하자마자 시작됩니다. DragKind가 dkDock 인 경우 컨트롤의 OnStartDrag 컨트롤에 해당합니다. 컨트롤이 도킹 될 곳은 없습니다. –

+0

Sertac처럼 : OnStartDock은 목표 컨트롤이 알려지기 전에 시작됩니다. 그리고 나는'DragDockObject' 내부에서 그것을 감지 할 방법을 찾을 수 없습니다 :'DragTarget' 속성은 필드를 직접 읽고 씁니다. 따라서 무시할 수있는 방법이 없습니다. – Martijn