2

我已经检查了 100% 我正在关闭我最近创建的文件的所有句柄。但是当我调用“opendialog.execute;”时 对话框像往常一样弹出,但是在鼠标悬停在最近创建的文件的提示上时,整个事情都会因越界错误而崩溃。

我知道这不是我的任何越界,就好像我打开文件而不引起(onhint)事件一样没有问题,并且硬编码文件名列表以进行测试表明打开或保存文件没有任何问题。它纯粹是在打开对话框的 onhint 事件上。就像我说的那样,如果我很快或者我使用箭头键,那么我的程序就没有问题。

更有趣的是,它甚至不会发生 100% 的时间,大约 70%,这导致我认为我已经修复了好几次,如果不仅仅是在很短的时间内。有谁知道会发生什么?如果不是,我该如何禁用 onhint 事件?

要求的代码根本没有帮助

OpenDialog.execute;    // crashes here
if fileexists(form1.OpenDialog.FileName) then    
  form1.Address.Text:=form1.OpenDialog.FileName;

和错误 链接文本

编辑:好的,我有一些新信息 opendialog 的新实例仍然存在相同的问题。更有趣的是,我似乎已经解决了 30% 的问题,它提示带有双标签的文件,例如“test.jpg.enc”,它在第一次运行时就很好,它只会在提示时崩溃在这些编码文件中,但只有当我将该文件编码为白色时,应用程序才打开。例如,如果我对其进行编码,然后尝试解码并且它崩溃了..我可以再次运行它并很好地解码它,但是在应用程序的一个实例中解码然后编码没有问题。

4

6 回答 6

3

您确定创建了 form1 的实例吗?

如是:

你为什么不这样使用:

OpenDialog.Options:=  OpenDialog.Options + [ofFileMustExist];

if OpenDialog.Execute then
  Address.Text:= OpenDialog.FileName

并使用 FastMM4,并在 FastMM4.inc 中定义 FullDebugMode。这可能会帮助您找到真正的问题

于 2009-01-24T20:01:11.860 回答
3

首先——几乎从不需要在代码中引用“form1.xxx”,/尤其是/如果您正在使用 Form1 的方法编写代码。我会删除那些引用。

然后,我会创建一个尽可能简单的应用程序——一个表单、一个 TOpenDialog 和一个按钮,并且我会尝试编写尽可能少的代码来打开相关文件。如果可行,请尝试找出您的简单应用程序和实际应用程序之间的区别。如果失败,请使用 /all/ 失败的简单程序的代码编辑上面的问题。

于 2009-01-24T21:51:51.060 回答
2

解决方案是使用activeX,似乎在SP2之后引入了一个错误

使用 ActiveX;

初始化 OleInitialize(nil);

finalization OleUninitialize 结束。

最初由狐狸在这里发布

于 2009-02-26T14:49:21.883 回答
1

两件事情:

使用Debug DCU编译您的应用程序(Project / Options / Use Debug DCU 's - 然后进行完整构建),然后查看发生异常的位置。这将在 vcl/rtl 代码中何时发生异常时为您提供更多信息。向我们发布完整的错误消息以及它在哪个单元中失败。

其次,可能更重要的是,文件在您的应用程序之外的行为方式。您建议它在大约 30% 的情况下失败,因此每次保存文件后,在常规资源管理器窗口中浏览到它并将鼠标悬停在那里,看看提示是否正常显示。然后用记事本打开。如果这两个都有效,那么它会在您的应用程序中失败,这将是有趣的。

此外,当您发布上一个问题的后续问题时,如果您链​​接到上一个问题,这样我们就可以看到您之前尝试过的内容,这会很有帮助。

祝你好运!

于 2009-01-24T23:06:55.307 回答
1

错误消息不是越界而是访问冲突。这意味着您正在访问不属于您的内存。这主要发生在类变量(指向类的指针)未初始化或已被释放时。

我认为是form1的方法的代码可以使用一些更改(已经提到过):

OpenDialog.execute;    // crashes here
if fileexists(OpenDialog.FileName) then    
  Address.Text := OpenDialog.FileName;

但是什么是OpenDialog,是拖到form1的组件吗?在这种情况下,form1 可能未初始化。但最有可能的是 OpenDialog 是一个局部变量。在这种情况下,您可以初始化它:

OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;
于 2009-01-25T10:49:49.787 回答
0

您对 Nick Hodges 的回答的评论表明您正在从 Form1 外部调用 Form1 的 OpenDialog。这似乎是个坏主意。相反,可以调用 Form1 的公共方法,并且该方法可以操作 Form1 的组件。我没有测试你的场景,但似乎这可能会导致你的麻烦。

于 2009-01-25T17:46:45.227 回答