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;
我现在正在考虑,这种方法是否合适。我没有得到任何编译,也没有运行时错误,这个问题只是一个技术性问题。
答案 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事件中,因为可能存在一些其他事件,例如控件,如果表单变量已经为零,则会在关闭期间运行并导致访问冲突。