当我写标题时,启用运行时主题时,FTouchManager导致AV出现问题。在主窗体上,我有一个带有一个按钮的框架。 OnClick事件调用必须销毁框架的主窗体方法。如果我单击该按钮,则会在“ Vcl.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;

最佳答案

您正在破坏框架,并因此破坏了它包含的按钮在其OnClick事件中。因此,在OnClick事件之后,按钮和/或框架实例中的每个代码都引用了一个已销毁的自身。在我看来,这似乎并不理智。

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

07-28 03:28