我的表单包含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,消息'无效的指针操作'。”
原因是什么,我该如何纠正?
答案 0 :(得分:22)
“无效的指针操作”意味着您释放了不属于您的内存。其中一个原因是:
在您的代码中,您释放了TOpenDialog
的{{1}}属性。您没有分配该字符串列表,并且文档没有告诉您释放它,因此期望列表实际属于对话框组件是合理的,并且组件将在需要时释放它。检查 Dialogs.pas 中的源代码确认了这一点。由于您还释放了该对象,因此您有一个双重自由错误,它符合我上面列出的第一个标准。删除该行。
作为Uwe pointed out,您还要处理文件名的列表,但只检查是否存在文件名。这是程序中的逻辑错误,但它不会导致您看到的异常。
答案 1 :(得分:3)
你应该检查
if FileExists(OpenDialog1.Files[I]) then begin
而不是
if FileExists(OpenDialog1.FileName) then begin
更好地投资于持有该价值的本地变量。
为什么会这样?
OpenDialog1.Files.Free;
答案 2 :(得分:2)
文件由TOpenDialog拥有,不应直接释放。