이벤트를 발생시킨 컨트롤이 아닌 포커스를받은 컨트롤에서 작동해야하는 이벤트가 발생하면 어떻게 처리할까요? 중재자 (MGM) 패턴? 두 개 이상의 모델이있는 경우이 질문이 밀접하게 관련된 MVP pattern에도 적용됩니다.Model-GUI-Mediator 패턴 (MVP 일 수도 있음)으로 이벤트 위임
이벤트 생성 컨트롤의 조정자가 선택한 컨트롤 (또는 모델)의 조정자에게 이벤트를 위임해야한다고 생각하기 때문에 '위임 이벤트'라고 제목을 붙였습니다.하지만 질문은 '어떻게?'입니다.
배경
MGM 패턴은 각 제어 (폼 당보다는 한 발표자)에 대해 별도의 '중재자'를 가질 것을 제외하고, 조금 MVP Passive View 같다. 컨트롤의 이벤트는 모두 중개자에 의해 처리되며 조정자는 특정 모델의 메서드를 호출하여 호출합니다. 조정자는 모델의 observer이며 모델 변경시 제어를 업데이트합니다. 특히 컨트롤에 데이터 바인딩이없고 하위 클래스를 원하지 않는 RAD 환경에 적합합니다. 또한 Passive View와 달리 이벤트 연결을위한 상용구 코드가 거의 없다는 장점이 있습니다. 여기서 두 더 자세한 설명은 다음
증상 례 A 형 모델의 수에 대한보기를 제공하는 컨트롤들을 포함
사물. 한 번에 하나의보기 만 선택할 수 있습니다. (뭔가 구체적인 것을 원한다면 다중 문서 편집기를 상상해보십시오.)
사용자가 메뉴에서 명령을 호출합니다. 특정 메뉴 항목의 조정자 개체에서 Execute 메서드를 호출합니다. 메뉴 항목은 컨트롤이므로 해당 조정자가 있습니다.
명령은 현재 선택한 컨트롤에서 작업을 수행해야합니다.
따라서 메뉴 항목의 조정자는 선택한 컨트롤에 속한 조정자를 찾고 해당 컨트롤을 위임해야하거나 선택한 컨트롤의 조정자와 연결된 모델을 찾아 직접 호출해야합니다.
그러나 메뉴 항목의 조정자가 선택한 컨트롤의 조정자를 어떻게 찾습니까?
MGM에서 mediator 객체는 자체 포함되어 있으므로 다른 mediator 객체에 대해서는 알지 못합니다. 컨트롤은 모델에 대해 아무 것도 알 수 없으므로 (명확한 관심사 분리를 유지하기 위해). 컨트롤이 중재자에 대해 아는 유일한 것은 이벤트 처리기입니다.
해키 해결
내가 지금까지 가지고 올 그 컨트롤의 중재자에 객체 메소드 포인터 될 것입니다 선택한 컨트롤에 이벤트 필드를 검사하는 것 중에 최고. 델파이에서 이것을 TMethod에 캐스트 할 수 있으므로 컨트롤의 조정자에 대한 객체 포인터를 추출 할 수 있습니다.그런 다음이를 중재자 유형으로 캐스팅하고 필요한 방법을 호출 할 수 있습니다.
그러나 이것은 언어 기능 (TMethod)에 크게 의존하고 또한 중재자 클래스 간의 종속성을 생성합니다.
는 아마도 내가
(PS 나보다 더 담당자와 함께 누군가가 "모델의 GUI-중재자"태그를 만들시겠습니까? 감사합니다.) ... 완전히 잘못된 트랙에있어