题
我有一个表格,其中包含 TOpenDialog
成分 (OpenDialog1
)和一个按钮。OpenDialog1
有 ofAllowMultiSelect
(的 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,并显示消息“无效指针操作”。”
这是什么原因,我该如何纠正?
解决方案
“无效的指针操作”意味着你释放了不属于你的内存。以下三件事之一就是原因:
- 您的程序释放了以前已经释放过一次的东西。
- 你的程序释放了一些最初从未分配过的东西。
- 您的程序释放了使用不同内存管理器分配的内容。
在您的代码中,您正在释放 TOpenDialog
的 Files
财产。您没有分配该字符串列表,并且文档没有告诉您释放它,因此可以合理地预期该列表实际上属于对话框组件,并且该组件将在需要时释放它。检查源代码 对话.pas 证实了这一点。由于您还释放了该对象,因此出现了双重释放错误,这符合我上面列出的第一个标准。删除该行。
作为 乌韦指出, ,您还正在处理 列表 文件名,但仅检查一个文件名是否存在。这是您的程序中的逻辑错误,但它不会导致您看到的异常。
其他提示
您应该检查
if FileExists(OpenDialog1.Files[I]) then begin
代替
的if FileExists(OpenDialog1.FileName) then begin
更好投资一个局部变量保持该值。
和为什么?
OpenDialog1.Files.Free;
文件是由所述TOpenDialog拥有,并且不应该直接释放。
不隶属于 StackOverflow