我有一个表格,其中包含 TOpenDialog 成分 (OpenDialog1)和一个按钮。OpenDialog1ofAllowMultiSelect (的 Options) 属性设置为 true。

单击按钮后的方法 AddFilesToListView 被执行:

procedure TForm4.AddFilesToListView();
var
  ListItem : TListItem;
  I: Integer;
  F : File;
  LengthOfAudio : TDateTime;
  previousCursor : TCursor;

begin
  previousCursor := Self.Cursor;
  Self.Cursor := crHourGlass;

  if OpenDialog1.Execute then
  begin
    for I := 0 to OpenDialog1.Files.Count - 1 do begin
      if FileExists(OpenDialog1.FileName) then begin
        ListItem:=ListView1.Items.Add;
        ListItem.Caption := 'Test';
        ListItem.SubItems.Add(ExtractFileName(OpenDialog1.Files[I]));
        ListItem.SubItems.Add(ExtractFilePath(OpenDialog1.Files[I]));
      end else
        raise Exception.Create('File does not exist.');
    end;
  end;

  Self.Cursor := previousCursor;

  OpenDialog1.Files.Free;
end;

运行应用程序时,选择第一个文件,我没有问题,但当想要选择第二个文件时,我收到一条错误消息“Project project3 引发了异常类 EInvalidPointer,并显示消息“无效指针操作”。”

这是什么原因,我该如何纠正?

有帮助吗?

解决方案

“无效的指针操作”意味着你释放了不属于你的内存。以下三件事之一就是原因:

  • 您的程序释放了以前已经释放过一次的东西。
  • 你的程序释放了一些最初从未分配过的东西。
  • 您的程序释放了使用不同内存管理器分配的内容。

在您的代码中,您正在释放 TOpenDialogFiles 财产。您没有分配该字符串列表,并且文档没有告诉您释放它,因此可以合理地预期该列表实际上属于对话框组件,并且该组件将在需要时释放它。检查源代码 对话.pas 证实了这一点。由于您还释放了该对象,因此出现了双重释放错误,这符合我上面列出的第一个标准。删除该行。

作为 乌韦指出, ,您还正在处理 列表 文件名,但仅检查一个文件名是否存在。这是您的程序中的逻辑错误,但它不会导致您看到的异常。

其他提示

您应该检查

if FileExists(OpenDialog1.Files[I]) then begin

代替

if FileExists(OpenDialog1.FileName) then begin

更好投资一个局部变量保持该值。

和为什么?

OpenDialog1.Files.Free;

文件是由所述TOpenDialog拥有,并且不应该直接释放。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top