質問

を含むフォームがあります 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によって所有され、直接解放してはなりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top