2009-07-10 2 views
4

나는 3 개의 동일한 TFrames (TVehicleUnitFrame)을 가진 TForm (TVehicleEditForm)을 가지고 있습니다.TFrame 내부의 EventHandler?

아이디어는 프레임의 모든 인스턴스가 프레임 내부의 eventhandler에 의해 자체 이벤트를 처리한다는 것이 었습니다. 문제는 eventhandler이 호출되지 않는다는 것입니다.

eventhandler 코드에서 프레임 내에서 Create 메서드를 재정 의하여 할당하려고했지만 해당 경우에도 처리기가 호출되지 않습니다.

그러나 양식에서 프레임 외부에 eventhandler을 할당하면 제대로 작동합니다. 좋아요 :

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick; 
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick; 
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick; 

그리고 이것은 하나의 버튼에 불과합니다! 프레임 안에 많은 구성 요소가 있기 때문에 많은 할당이 발생합니다 ... 오브젝트 인스펙터에서 직접 수행해야하는 경우 매우 추한 코드입니다.

저는 D2007을 사용하고 있습니다. 원인에 대한 생각은?

감사 롤랜드

답변

11

당신이 코드에서 그것을 할 때, 당신이 상관없이 이전이 있었는지의 이벤트 처리기에 포인터를 대체한다는 것입니다 작동하는 이유.

디자인 타임에는 핸들러를 설정할 수있는 장소가 두 곳 있습니다. Unit1에 Frame1이 있고이를 MyUnit의 MyForm에 배치한다고 가정합니다. 두 곳에서 이벤트 처리기를 설정할 수있는 기회가 주어집니다.

귀하의 경우 프레임 자체 (예 : Unit1)에 이벤트 처리기를 설정하려는 경우, 참조하는 코드가 프레임 자체에 있습니다. 그렇게하면 작동 할 것입니다. 이벤트 처리기를 사용 된 장소 (MyUnit)에 설정하면 이벤트 처리기가 여기에 지정됩니다.

Delphi는 이전에 을 할당 한 상태에서 프레임에서 이벤트 핸들러를 호출 할만큼 충분히 똑똑합니다. 폼에 처음 추가 한 다음 프레임에 핸들러를 추가하면 프레임의 핸들러는 이 아닌이 호출됩니다. 양식에서 처리기를 제거해도 여전히 양식의 처리기를 호출하지는 않습니다.

마우스 오른쪽 Clcik 양식을하고 텍스트로보기를 선택 :

은 무엇 당신이해야 할 것은이에게 있습니다. 프레임까지 아래로 스크롤하십시오.

OnClick = FormOldClickHandler 

혹은

OnClick = nil 

이 삭제를 : 당신은 같은 것을 볼 수있다

inherited cmdNewOwner: TButton 

을 찾아, 그 아래에는

inline FrameX: fraVehicleUnitFrame1 

: 그것은 뭔가를해야한다 OnClick 할당, 다음 형식으로보기 양식을 다시 작성하고 저장하십시오. 모든 것이 잘되어야합니다.폼에서 단추 (또는 cmdNewOwner가 무엇이든)를 선택하면 개체 관리자는 해당 이벤트 옆에 아무것도 표시하지 않아야합니다.

+0

조언 해 주셔서 감사합니다. 나는 그것을 다시 일하게했다 :) 많은 감사 –

+0

내가 도울 수 있었던 것을 기쁘게해라! –

+0

프레임 인스턴스를 폼에서 제거하고 다시 추가하여이 문제를 해결할 수 있습니다. 그러나 프레임 인스턴스를 수정 한 경우 이동하는 것이 가장 좋은 방법입니다. –

관련 문제