【DEMO信息】
有問題的DEMO, 由芒果提交
【問題描述】
雙擊Tab頁面關閉頁面和插件的時候出現AV異常
procedure TfrmMain.pgcMainMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Index: Integer; lvPluginForm: IPluginForm; lvTabShtEx:TTabShtEx; begin // 左鍵點擊並且雙擊 if (Button = mbLeft) and (ssDouble in Shift) then begin Index := pgcMain.IndexOfTabAt(X, Y); if Index >= 0 then begin lvTabShtEx := TTabShtEx(pgcMain.Pages[Index]); lvPluginForm := lvTabShtEx.PluginForm; if Application.MessageBox('確認要關閉畫面嗎?', '詢問', MB_OKCANCEL + MB_ICONQUESTION) = IDCANCEL then Exit; lvPluginForm.freeObject; pgcMain.Pages[Index].Free; end; end; end;
這段代碼中有一個lvPluginForm為接口IPluginForm變量, 過程在退出時會執行lvPluginForm := nil和其他一些資源的清理工作,清理的時候會觸發對象的__release方法,但是我們看到這個對象已經釋放掉了,然後在進行清理的時候出現了上面看到的訪問違規的錯誤。
【問題解決】
找到出現問題的根本,解決起來就很快了,盡量不要等到過程清理時在去清理你的資源,特別是可能訪問不存在的資源。在end;之前 加一句lvPluginForm := nil;這樣就好了