質問
を含むフォームがあります 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;
アプリケーションを実行して最初のファイルを選択するときは問題ありませんが、2 番目のファイルを選択しようとすると、「プロジェクト project3 で例外クラス EInvalidPointer がメッセージ '無効なポインター操作' で発生しました。」というエラーが表示されます。
これの原因は何でしょうか?どうすれば修正できますか?
解決
「無効なポインター操作」は、自分に属していないメモリーを解放したことを意味します。原因は次の 3 つのいずれかです。
- あなたのプログラムは、以前に一度解放されたものを解放しました。
- あなたのプログラムは、最初から割り当てられていなかったものを解放しました。
- プログラムは、別のメモリ マネージャーで割り当てられていたものを解放しました。
コードでは、 TOpenDialog
さんの Files
財産。その文字列リストは割り当てられておらず、ドキュメントにはそれを解放するように指示されていないため、リストが実際にはダイアログ コンポーネントに属し、コンポーネントが必要に応じてそれを解放すると予想するのが合理的です。ソースコードをチェックインする ダイアログ.パス それを裏付けています。そのオブジェクトも解放しているため、二重解放エラーが発生しており、上で示した最初の基準を満たしています。その行を削除します。
として ウーヴェ氏が指摘した, 、あなたも処理しています リスト ファイル名の存在をチェックするだけです。これはプログラム内の論理エラーですが、表示されている例外は発生しません。
他のヒント
あなたがチェックする必要があります。
if FileExists(OpenDialog1.Files[I]) then begin
の代わりに
if FileExists(OpenDialog1.FileName) then begin
より良い、その値を保持するローカル変数に投資ます。
そして、なぜこの?
OpenDialog1.Files.Free;
ファイルがTOpenDialogによって所有され、直接解放してはなりません。