为什么一用FormX.Free就会出错?(17分)

  • 主题发起人 主题发起人 spt
  • 开始时间 开始时间
S

spt

Unregistered / Unconfirmed
GUEST, unregistred user!
在Form1中打开Form2,然后自己隐藏:
我写: Form2.Show;
Form1.Hide;
Form1.Free;

可是一运行就出现如下错误:
“Project test.exe raised exception class EAccessViolation with
message'Access violation at address 00403061 in module'test.exe',Read
of address 00000004'.Process stopped,Use Step or Run to continue”

这是什么意思呀?我把'Form1.Free'去掉就正常了。
问题出在哪呢?有点莫名其妙。
请教!

 
我试了,没问题呀,你把这些代码放在什么地方出错
 
你应该注意后创建的窗提应该先释放
不然的话,如果一旦别的单元引用了该窗体,
而你已经将它释放,内存中就没有了你的
Form1的实例,当然就会出错!
注意一下有没有别的单元引用了该窗体!
 
请将源代码截取部分贴出,因为上述出错原因是释放空指针操作造成的。
 
procedure TForm1.Button1Click(Sender: TObject);
var num: String;
begin
num:=Edit1.Text;
with table1 do
begin
IndexFieldNames:='YGID';
SetKey;
FieldByName('YGID').Value:=num;
if GotoKey then
begin
if Edit2.Text = FieldByName('PASSWORD').Asstring then
begin
form2.show;
form1.Hide;
// form1.Free;
end
else ShowMessage('您输入的员工号或密码有误');
end
else ShowMessage('您输入的员工号或密码有误');
end;
end;

就是一个登录界面,form1校验tabel1中的ygid和password,如果正确,就打开form2;
另外,我两个unit互相uses了,问题是不是出在这?

另外多谢jp72324,njzwb,左右手三位的热心,我是个新手,不懂的太多太多,多谢大家
不吝赐教!
 
你可以将登陆界面的上的table1放置在数据模块上。
这样一来出错的可能要小些!
既然你两个Unit相互Uses了,当你Form2.show时自然会
报错!因为Form1都已经被你释放了,内存中不存在它的实例。
另外,你要注意在Form1.free之前最好将Table1 close掉!
这样要安全些;不过,我还是建议你最好将table1放到数据模块
上去!

procedure TForm1.Button1Click(Sender: TObject);
var num: String;
begin
num:=Edit1.Text;
with table1 do
begin
IndexFieldNames:='YGID';
SetKey;
FieldByName('YGID').Value:=num;
if GotoKey then
begin
if Edit2.Text = FieldByName('PASSWORD').Asstring then
begin
Table1.close;//关闭表!当然form2不能再引用form1
form2.show;
form1.Free;
end
else
begin
ShowMessage('您输入的员工号或密码有误');
edit1.setfocus; //给用户重新输入的机会!
end;
end
else ShowMessage('您输入的员工号或密码有误');
end;
end;

 
谢谢!

分数太少,可不是我吝啬,因为我本来只有210分!呵呵。
 
接受答案了.
 
555~~~~~~~~~~我初来乍到!不懂得怎么操作,连分数都发错了!

njzwb,真的很谢谢你!
 
后退
顶部