Delphi:这段代码是否是在FormClose中使指针归零的正确过程?

时间:2018-06-02 10:37:38

标签: delphi pointers delphi-xe6

IDE:Delphi XE6。

我的主窗体创建了另一个窗体,该窗体创建了TFormZoom的实例。一切似乎都完美无瑕。

我只想确保我在FormClose中取消指针的过程不会扭曲Delphi的一些内部工作。

procedure TFormZoom.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  // if I did not set it to nil here, the next time I would create this form I would get
  // EAccessViolation, because my other code checks for this form <> nil ...

  FormZoom := nil;
end;

我现在正在考虑,这种方法是否合适。我没有得到任何编译,也没有运行时错误,这个问题只是一个技术性问题。

2 个答案:

答案 0 :(得分:2)

如果在end; TFormZoom.FormClose设置断点,并使用F8进入调用onclose事件处理程序的VCL代码,您将看到它被调用来自TCustomForm.DoClose之前从TCustomForm.Close调用的DoClose(CloseAction); if CloseAction <> caNone then if Application.MainForm = Self then Application.Terminate else if CloseAction = caHide then Hide else if CloseAction = caMinimize then WindowState := wsMinimized else Release; 。在那个时间点,可以看到以下代码(在Delphi 10.2.3中)

caFree

因为您将Action var设置为.Release,这意味着VCL代码将调用表单<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="false"> <android.support.v7.widget.LinearLayoutCompat android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.vishal.my2.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/featured_list" android:layout_width="match_parent" android:layout_height="300dp" /> <android.support.v7.widget.RecyclerView android:id="@+id/all_topic_list" android:layout_width="match_parent" android:layout_height="300dp" /> </android.support.v7.widget.LinearLayoutCompat> </ScrollView> 。我的结论是:将全局变量FormZoom设置为nil,不会造成任何问题。

答案 1 :(得分:-3)

有时OnClose事件可能根本不会发生。所以除了设置 Action := caFree; 我会将其他代码移到OnCloseQuery或OnDestroy事件中。

FormZoom := nil;
在我看来,

必须在OnDestroy事件中,因为可能存在一些其他事件,例如控件,如果表单变量已经为零,则会在关闭期间运行并导致访问冲突。