好奇怪 !!(估计很难)(100分)

  • 主题发起人 wangsangwu
  • 开始时间
W

wangsangwu

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序在运行中有时候会报错“invalid pointer operation ”
procedure TStart_form.Scada1Click(Sender: TObject);
begin
Form_DataManage1:=TForm_DataManage1.Create(application);
try
Form_DataManage1.ShowModal;
finally
Form_DataManage1.Free;
Form_DataManage1:=Nil;
end
end;
上面是我的一个菜单操作,(我有很多这样的菜单,这是其中一个,其他和这个类似)
可是我在程序启动后,即使没有对这些菜单操作,直接退出,他也会报错。
但是,很奇怪的是,如果我将TForm_DataManage1.Create(application);中的application
改为self后, 他又不会抱错了 。我百思不得其解。
另外,这样修改后,当我对数据库进行一些操作后,又会出现同样的错误,
于是我又将self该为application,暂时解决拉问题,
但到底这是为什么?高分求教!!!
不够再给!
 
我不记得是从哪本书上看到的,如果是create(application),那它的有效期是这个App结束,
而很明显你在用完这个FORM之后,就让他FREE了。问题是不是出在这里?
还有,看你的名字是叫Form_DataManage1,从字面上来看,数据管理,这样的窗体,
不知你是在什么时候开始动态创建的,查一查你的代码,看是不是创建得太晚了的缘故?
 
发觉你的语句没有什么意思呀,
为什么创建了以后就立即free,nil呢?
这样还不等于没有创建呀
不知道是什么意思,等高人指点吧
 
我想肯定和程序其他部分有关系,我的代码和这差不多,我的测试是没问题
 
关键是只要出现第一次错误后,如果启动程序后即使不做任何操作,
他也会报错,我很郁闷。
以下是我的程序初始化时的程序
Confrm:=TConfrm.create(application);
Confrm.Show;
Confrm.Update;
Application.Initialize;
Application.Title := '';
Application.CreateForm(TStart_form, Start_form);
Application.CreateForm(TForm_GlobalVarible, Form_GlobalVarible);
Application.CreateForm(TDM, DM);
Application.CreateForm(TForm_CalInformation, Form_CalInformation);
Confrm.Hide;
Confrm.free;
Application.Run;
 
//Form_DataManage1:=TForm_DataManage1.Create(application);
代表在应用程序退出的时候自动释放。
而你的要求显然是自己释放,所以改成这样更好些:
Form_DataManage1:=TForm_DataManage1.Create(nil);


 
Form_DataManage1:=TForm_DataManage1.Create(application);
///////////////// 这个是正确的类名吗,
可能是个变量名。
 
难道这个问题真的如此难吗??
玉门!!
 
procedure TStart_form.Scada1Click(Sender: TObject);
begin
Form_DataManage1:=TForm_DataManage1.Create(application);
//try
Form_DataManage1.ShowModal;
//finally
Form_DataManage1.Free;
//Form_DataManage1:=Nil;
// end
end;
procedure TStart_form.onclose(Sender: TObject);
begin
Form_DataManage1:=Nil;
end;
 
你的 Form_DataManage1 在程序的其它地方有没有用到,
如果没有用到声明为局部变量。

估计很可能在其它地方用了。
 
[:)]在新建的窗体的ONCLOSE事件中先释放掉就可以了
 
还是不行!!
 
这样试试:
procedure TStart_form.Scada1Click(Sender: TObject);
begin
Form_DataManage1:=TForm_DataManage1.Create(Self);
Form_DataManage1.ShowModal;
end;

在 TForm_DataManage1 的 onDestory 事件中写:
self:= nil;

在 TForm_DataManage1 的 onClose 事件中写:
Action := caFree;

 
procedure TStart_form.Scada1Click(Sender: TObject);
var Form_DataManage1:Tform_DataManage1; //注意这里,要先定义!
begin
Form_DataManage1:=TForm_DataManage1.Create(self);//这里要用self
try
Form_DataManage1.ShowModal;
finally
Form_DataManage1.Free;
Form_DataManage1:=Nil;
end
end;
 
这个错误好象是因为试图两次释放同一个指针 或者试图对已经被释放的指针进行操作
可是 我只不过是将start_form 初始化 根本没有做任何操作
怎摸会出现这个错误呢?
下面是他的初始化procedure TStart_form.FormCreate(Sender: TObject);
begin
ID_Dispatcher:=-1;
ParaSet.Enabled:=False;
ScheduleOperate.Enabled:=False;
end;

下面是几个自创建窗体的创建procedure
procedure TDM.DataModuleCreate(Sender: TObject);
begin
Numb_Units:=0;
ChangeYesterday:=False;
ID_Dispatcher:=-1;
if ADOCon_zdmis.Connected=False then ADOCon_zdmis.Connected:=True;
if ADOConPU.Connected=False then ADOConPU.Connected:=True;
end;

其他两个窗体都没有create过程
 
把你的程序出问题部分简化成最小代码贴上来,
然后让人们一试验就会很容易解决问题不会瞎猜测(用此不当????)
 
关键是我根本旧不知道是哪里出错
单我启动程序 ,(start_form是我的主界面),什么也不做
直接退出 ,程序最后会弹出提示框,说:invalid pointer operation
也就是说 ,他总共执行的代码是:
工程文件:
begin
Confrm:=TConfrm.create(application);
Confrm.Show;
Confrm.Update;
Application.Initialize;
Application.Title := '';
Application.CreateForm(TStart_form, Start_form);
Application.CreateForm(TForm_GlobalVarible, Form_GlobalVarible);
Application.CreateForm(TDM, DM);
Application.CreateForm(TForm_CalInformation, Form_CalInformation);
Confrm.Hide;
Confrm.free;
Application.Run;
end;

主界面:
procedure TStart_form.FormCreate(Sender: TObject);
begin
ID_Dispatcher:=-1;
ParaSet.Enabled:=False;
ScheduleOperate.Enabled:=False;
end;
procedure TStart_form.FormDestroy(Sender: TObject);
begin
Start_form:=nil;
end;

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


没有做任何其他的操作 。
 
出错后 ,再次运行,会弹出对话框
error
runtime error 217 at 00004052
 
try
with TForm_DataManage1.Create(self) do
begin
ShowModal
Free;
end;
finally
end;
 
顶部