很简单的代码逻辑,为什么会出错呢?

netrobo 2005-08-19 10:39:17
程序有两个窗体TForm1和TForm2;
我在TForm1的Private区加了如下代码:
private
Form2: TForm2;
然后TForm1窗体上加一按钮,按钮的事件代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
if not Assigned(Form2) then Form2 := TForm2.Create(Application);
Form2.Show;
end;
我设了TForm2的Close事件的Action := crFree,我的目的就是TForm2关闭的时候释放。

第一次点击按钮当然没有问题,但当你将Form2关闭,再次点击Form1的Button时,就出现了内存访问的错误,百思有点不解,感觉这样的代码应该很符合逻辑,但为什么会出错呢?
...全文
117 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaccor 2005-08-20
  • 打赏
  • 举报
回复
Form2.free只是释放,但指向原来的地址没有变,所有在关闭窗体的时候要
让Form2所指地址释放。
加一句Form2:=Nil就ok了
rockswj 2005-08-20
  • 打赏
  • 举报
回复
设了TForm2的Close事件的Action := crFree,然后再加一句,Form2 := nil
cncharles 2005-08-20
  • 打赏
  • 举报
回复
在MDIForm调用MDIChild窗体时要这样用
if not Assigned(Form2) then begin
Form2:=TForm2.Create(Self);
Form2.Show;
end else
Form2.BringToFront;

另外在MDIChild的OnClose, OnDestroy中要以下代码 Form2为MIDChild窗体的名称
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
Form2:=nil;
end;

xixuemao 2005-08-20
  • 打赏
  • 举报
回复
Assigned是判断对象是否为空。

所以free后将对象:= nil;就可以了。
konhon 2005-08-20
  • 打赏
  • 举报
回复
Form2不等於nil呀.
你這應是不行的.

看我的代碼:

function FindChildForm(aFormClass: TFormClass): TForm;
var
i: integer;
begin
Result := nil;
for i := 0 to Application.MainForm.MDIChildCount - 1 do
begin
if Application.MainForm.MDIChildren[i].ClassName
= aFormClass.ClassName then
begin
Result := Application.MainForm.MDIChildren[i];
Break;
end; // end if
end; // end for
end;

function TFrmMain.CreateChildForm(aFormClass: TFormClass): TForm;
begin
Result := FindChildForm(aFormClass);
if not Assigned(Result) then
begin
Perform(WM_SETREDRAW, 0, 0);
try
Result := aFormClass.Create(Application.MainForm);
finally
Perform(WM_SETREDRAW, 1, 0);
RedrawWindow(Handle, nil, 0, RDW_FRAME + RDW_INVALIDATE +
RDW_ALLCHILDREN + RDW_NOINTERNALPAINT);
end;
end;
Result.Show;
end;

cdsgajxlp 2005-08-20
  • 打赏
  • 举报
回复
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
form2.Release;
form2:=nil;
end;
konhon 2005-08-20
  • 打赏
  • 举报
回复
我觉得用下面的方式会好一些
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form2.Free;
end;

hqhhh(枫叶) 不要誤人子弟呀.
這樣窗體能顯示出來嗎
hqhhh 2005-08-20
  • 打赏
  • 举报
回复
我觉得用下面的方式会好一些
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form2.Free;
end;
shusure 2005-08-20
  • 打赏
  • 举报
回复
同意yaccor的意见
ntn115 2005-08-20
  • 打赏
  • 举报
回复
Form2.free只是释放
但还是会指向原来的地址
Assigned()当然为真了
onebody 2005-08-19
  • 打赏
  • 举报
回复
再加一句Form2 := nil;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧