Ungültige Zeiger Betrieb
-
21-08-2019 - |
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?
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.