程序有两个窗体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时,就出现了内存访问的错误,百思有点不解,感觉这样的代码应该很符合逻辑,但为什么会出错呢?
我在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时,就出现了内存访问的错误,百思有点不解,感觉这样的代码应该很符合逻辑,但为什么会出错呢?
但还是会指向原来的地址
Assigned()当然为真了
你這應是不行的.看我的代碼: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;
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;
让Form2所指地址释放。
加一句Form2:=Nil就ok了
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form2.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Application.CreateForm(TForm2, Form2);
Form2.Show;
Form2.Free;
end;hqhhh(枫叶) 不要誤人子弟呀.
這樣窗體能顯示出來嗎
begin
form2.Release;
form2:=nil;
end;