2014-12-05 2 views
1

런타임 테마를 사용할 때 FTouchManager로 인한 AV에 문제가 있습니다. 기본 폼에는 버튼이 하나있는 프레임이 있습니다. OnClick 이벤트는 프레임을 파괴해야하는 기본 폼 메서드를 호출합니다. 그 버튼을 클릭하면 'Vcl.Controls'에 AV가 생깁니다. 런타임 테마를 비활성화하면 모든 것이 정상적으로 작동합니다. 이 문제를 어떻게 해결할 수 있습니까? 델파이 XE3, XE6 플랫폼 : Win32에서런타임 테마가 활성화 될 때 FTouchManager가 AV를 발생시킵니다.

Vcl.Controls :

procedure TWinControl.WndProc(var Message: TMessage); 
... 
WM_MOUSEFIRST..WM_MOUSELAST: 
     with FTouchManager do 
      if (GestureEngine <> nil) and (efMouseEvents in GestureEngine.Flags) then // <-- here I get AV error because FTouchManager = nil 
      GestureEngine.Notification(Message); 
... 
end; 

FrameUnit :

constructor TFrame2.Create(AOwner: TWinControl); 
begin 
    inherited Create(AOwner); 
    Parent := AOwner; 
end; 

destructor TFrame2.Destroy; 
begin 
    Parent := nil; 
    inherited; 
end; 

procedure TFrame2.Button1Click(Sender: TObject); 
begin 
    Form1.DestroyFrame; 
end; 

MainFormUnit

은 사전에 팀

에서 테스트를 주셔서 감사합니다 :

procedure TForm1.FormShow(Sender: TObject); 
begin 
    Frame2 := TFrame2.Create(Form2); 
end; 

procedure TForm1.DestroyFrame; 
begin 
    FreeAndNil(Frame2); 
end; 

답변

4

OnClick 이벤트 중에 프레임과 따라서 포함 된 단추가 삭제됩니다. 따라서 OnClick 이벤트 다음에 나오는 버튼 및/또는 프레임 인스턴스 안의 모든 코드는 파괴 된 자체를 참조합니다. 그건 나에게 아주 제정신이 아닌 것처럼 보입니다.

메시지 처리기에서 DestroyFrame을 호출하는 양식 (PostMessage)에 메시지를 게시하는 것이 좋습니다.

+0

또는 'Postmessage'를 통해 'TForm'과 정확히 같은 'TFrame'에 대해 'Release' 메소드를 구현하십시오. 또한 생성자에서'Parent'를 설정하는 것이 나에게 맞는 것 같지 않습니다. – kobik

+0

도움 주셔서 감사합니다. 내가 제안한대로 PostMessage를 사용할 것입니다. 버튼이 파괴 된 후 AV를 유발 한 메시지가 한 개 더 수신 된 것으로 보입니다. – Tim