Frage

Ich habe eine Form, die eine TOpenDialog Komponente (OpenDialog1) und eine Schaltfläche enthält. OpenDialog1 hat die ofAllowMultiSelect (von Options) Eigenschaft auf true gesetzt.

Nach der Taste wird die Methode AddFilesToListView Klick ausgeführt wird:

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;

Wenn die Anwendung ausgeführt wird, die erste Datei auswählen, ich habe kein Problem, aber zu wollen, wenn die zweiten auszuwählen, erhalte ich eine Fehlermeldung, „Projekt project3 eine Ausnahmeklasse EInvalidPointer mit der Meldung‚ungültig Zeiger Operation‘angehoben.“

Was ist die Ursache dafür, wie kann ich dies korrigieren?

War es hilfreich?

Lösung

„Ungültige Zeigerbetrieb“ bedeutet, dass Sie Speicher freigegeben, die dir nicht gehören. Einer dieser drei Dinge ist die Ursache:

  • Ihr Programm befreit etwas, das schon einmal zuvor befreit worden war.
  • Ihr Programm befreit etwas, das nie an erster Stelle zugeordnet wurde.
  • Ihr Programm befreit etwas, das mit einem anderen Speichermanager zugewiesen worden war.

In Ihrem Code, du befreien Sie die TOpenDialog Unterkunft Files. Sie haben nicht die Zeichenfolge Liste zuweisen, und die Dokumentation, die Sie es befreien nicht sagen, so ist es vernünftig zu erwarten, dass die Liste gehört eigentlich zum Dialogkomponente, und dass die Komponente es freizugeben, wenn er will. Überprüfen des Quellcodes in Dialogs.pas bestätigt, dass. Da Sie auch das Objekt freigegeben haben, haben Sie ein Doppelfreies Fehler, der das erste Kriterium erfüllt ich oben aufgeführt ist. Entfernen Sie diese Zeile.

Wie Uwe wies darauf hin, Sie verarbeiten auch eine Liste von Dateinamen, sondern nur die Existenz einer Überprüfung. Das ist ein logischer Fehler in Ihrem Programm, aber es würde die Ausnahme nicht dazu führen, die Sie sehen.

Andere Tipps

Sie sollten prüfen

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

statt

if FileExists(OpenDialog1.FileName) then begin

Besser in einer lokalen Variablen investieren, diesen Wert zu halten.

Und warum das?

OpenDialog1.Files.Free;

Dateien wird durch die der TOpenDialog Besitz und sollte nicht direkt befreit werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top