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

标签 delphi vcl-styles

正如我所写的标题,当启用运行时主题时,我遇到了由 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;

框架单位:

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;

主窗体单元:

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

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

最佳答案

您正在破坏框架,从而在其 OnClick 事件期间破坏所包含的按钮。因此,OnClick 事件之后的按钮和/或框架实例内的每个代码都引用已销毁的自身。在我看来这不太理智。

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

关于delphi - 启用运行时主题时,FTouchManager 会导致 AV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27313831/

相关文章:

delphi - 在 Delphi XE2 中的创建/显示表单上设置变量样式

delphi - 从 Delphi VCL 样式获取特定字形

delphi - Flash 应用程序任务栏按钮?

delphi - 当用户按下 CTRL+X 时如何进行干扰并仍然保持 TMemo 的默认 CTRL+X 行为?

delphi - 如何在Delphi中禁用VCL样式

delphi - 调整表单大小,即使它是无边框的 - 删除斜角边缘

delphi - 在 Delphi 2010 中,尽管相应按钮被禁用,但仍处理 Click 事件

delphi - 寻找进程间通信中使用的 Windows 消息的替代方案

regex - 我该如何处理这个正则表达式问题?

delphi - 古老的 Delphi VCL 应用程序看起来没有 Windows 主题或 VCL 风格