Delphi 模块中地址09A878EE处的访问冲突
我有一个问题,我可以通过抛出这个错误来解决这个问题,兄弟,我按下一个按钮,调用一个表单Cencillo进行搜索。错误如下 消息:模块'Almacen.pgi'中地址09A878EE的访问冲突。读取地址00000000。 给我这个错误的按钮的代码如下:Delphi 模块中地址09A878EE处的访问冲突,delphi,access-violation,Delphi,Access Violation,我有一个问题,我可以通过抛出这个错误来解决这个问题,兄弟,我按下一个按钮,调用一个表单Cencillo进行搜索。错误如下 消息:模块'Almacen.pgi'中地址09A878EE的访问冲突。读取地址00000000。 给我这个错误的按钮的代码如下: procedure TfListaEntregaBodegas.SBBuscarClick(Sender: TObject); begin inherited; FBuscarRequisicionBodega := TFBuscarRe
procedure TfListaEntregaBodegas.SBBuscarClick(Sender: TObject);
begin
inherited;
FBuscarRequisicionBodega := TFBuscarRequisicionBodega.Create(Application);
FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones;
FBuscarRequisicion.ShowModal;
FBuscarRequisicion.Free;
dbgListaRequisiciones.Setfocus;
end;
明显的问题在下面的注释行中,您创建了一个名为
TfBusCarrequisitionBodega
的东西,并将其分配给名为fBusCarrequisitionBodega
的变量,并设置了fBusCarrequisitionBodega
的一些属性。然后对名为fBusarrequisition
的完全不同的变量调用showmodel
,然后释放它。您现在孤立了fBusarrequisitionOdega
(没有任何东西可以释放它),同时调用了showmodel
,处理您没有提供代码的东西(fBusarrequisition
),然后将其释放。再次单击按钮将调用上次释放的内容
这个问题似乎很清楚,甚至不需要读取变量名,只需检查以下两行代码:
FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones;
FBuscarRequisicion.ShowModal;
查看变量名长度如何不匹配?(由于第一个字母比第二个多六个字母,
没有对齐。)
仔细阅读您发布的代码中的变量名,问题似乎非常清楚。(使用调试器两秒钟肯定会告诉您;您真的应该学会使用它)
这是什么语言?我根据您的问题历史记录假设Delphi。其中一个对象是
nil
。使用调试器找出它是哪一个。在第一次调用此事件方法后(第一次单击按钮后),至少fBusCarRequisition
将成为一个悬空指针。是否只有我一个人想知道.pgi
是什么?@J.:我也不知道.pgi
是什么,但以防万一你不知道,Windows将执行具有不可执行扩展名的文件;我偶尔会使用这个技巧来调试那些无法在dev/test上复制的模糊bug。设置生产系统的输出路径,将应用程序扩展更改为类似于.exd
或.xyz
,执行生成(将Project.exd
放在生产系统上与实际系统一起),设置断点,并仔细调试。找出问题,反转上面的步骤(清除扩展和输出路径),然后修复它。随后删除.exd
。
procedure TfListaEntregaBodegas.SBBuscarClick(Sender: TObject);
begin
inherited;
// You create something and assign it to one variable here.
// Set debugger breakpoint on next line (F5, click the grey
// gutter to the left of the editor line numbers, or right-click
// the line and choose Debug->Toggle Breakpoint, run your app (F9),
// and step through the code with F8.
FBuscarRequisicionBodega := TFBuscarRequisicionBodega.Create(Application);
FBuscarRequisicionBodega.dsRequisicionBodega.DataSet:=qListaRequisiciones;
// You then call ShowModal on a totally different variable here, then
// free it after ShowModal returns.
FBuscarRequisicion.ShowModal;
FBuscarRequisicion.Free;
dbgListaRequisiciones.Setfocus;
end;