启用运行时主题时,FTouchManager会导致AV

时间:2014-12-05 10:30:31

标签: delphi vcl-styles

正如我写的那样标题我在启用运行时主题时由FTouchManager引起AV问题。在主窗体上,我有一个带一个按钮的框架。 OnClick事件调用主窗体方法,它必须销毁帧。如果我点击那个按钮,我就可以在VLC.Controls'中获得AV。当我禁用运行时主题时,一切都会正常工作。我该如何解决这个问题?

提前谢谢你,蒂姆

测试:Delphi XE3,XE6 平台:Win32

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;

1 个答案:

答案 0 :(得分:4)

您正在OnClick事件期间销毁框架,从而销毁包含的按钮。因此,OnClick事件后面的按钮和/或框架实例中的每个代码都会引用一个被破坏的自我。对我来说这看起来不太合理。

最好将消息发布到在消息处理程序中调用DestroyFrame的表单(PostMessage)。