Delphi opendialog.onhint崩溃

Delphi opendialog.onhint崩溃,delphi,crash,fileopendialog,hint,Delphi,Crash,Fileopendialog,Hint,我已100%检查我正在关闭最近创建的文件上的所有句柄。但是当我调用“opendialog.execute”时,对话框会像往常一样弹出,但当鼠标悬停在一个最近创建的文件的提示上时,整个过程就会崩溃,并出现一个越界错误 我知道这并不是我的越界行为,就好像我打开文件时没有引起(onhint)事件一样。没有问题,对文件名列表进行硬编码以进行测试表明打开或保存文件没有问题。这完全取决于打开对话框的onhint事件。就像我说的,如果我很快或者我使用箭头键,我的程序没有问题 更有趣的是,它在100%的时间里都

我已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”。它在第一次运行时就没有问题,它只在提示这些编码文件时崩溃,但只有当我将该文件编码为白色时,应用程序才会打开。例如,如果我对它进行编码,然后尝试解码,它就会崩溃。。我可以再次运行它并对其进行解码,但在应用程序的一个实例中进行解码和编码没有问题。

是否确实创建了form1的实例

如果是:

你为什么不这样使用:

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

if OpenDialog.Execute then
  Address.Text:= OpenDialog.FileName
并使用FastMM4,在FastMM4.inc中定义FullDebugMode。 这可能有助于您首先找到真正的问题

——在代码中几乎不必提及“form1.xxx”,尤其是当您使用form1的方法编写代码时。我会删除那些参考资料

然后,我会创建一个尽可能简单的应用程序——一个表单、一个TopEndDialog和一个按钮,我会尝试编写尽可能少的代码来打开有问题的文件。如果成功了,试着找出你的简单应用程序和真实应用程序之间的区别。如果失败,请用失败的简单程序的代码/all/编辑上面的问题。

两件事:

使用调试DCU(项目/选项/使用调试DCU-然后进行完整构建)编译应用程序,然后查看异常发生的位置。当vcl/rtl代码中出现异常时,这将为您提供更多信息。向我们发布完整的错误消息,以及在哪个单元中失败

第二,可能更重要的是,文件在应用程序外部的行为。您建议它大约有30%的时间会失败,因此每次保存文件后,请在常规浏览器窗口中浏览到该文件,然后将鼠标移到该文件上,查看提示是否显示良好。然后在记事本中打开它。如果这两种方法都能起作用,那么在应用程序中失败将是一件有趣的事情

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


祝你好运

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

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

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

OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;

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

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

使用ActiveX

初始化 (零)

定稿 取消初始化 结束


原版由福克斯发布

好的,你能发布一些代码吗。(特别是onhint处理程序)。越界?奇怪。你能把错误信息完整地贴出来吗?谢谢这是一种方法,它不是来自form1中的组件,因此它无法识别form1中的对象,除非我指定。在建议的基础上,opendialog只保留文件名等数据。表单上的一个简单按钮(代码为“opendialogtest.execute”)也会崩溃。如果是这样,那么您/应该/使该方法成为表单的方法。换句话说,你很少会像Nick说的那样叫“form1.xxxxx”,这听起来像是糟糕的设计,但无论如何,听起来好像Form1还没有创建。Form1已经创建并运行了一段时间,因为这个错误只有在我对自应用程序打开以来创建/修改的编码文件发出提示后才会发生。很抱歉,作为一个noob,我很久没有使用它了。我该怎么初始化opendialog呢?我猜它应该是TopEndDialog,但这让delphi在TopEndDialog.create*之后需要更多参数(例如参数不够)它可能需要TWinControl类型的单个参数,但您可以传入nil:opendialog:=TopEndDialog.create(nil);
OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;