Domanda

Ho una forma che contiene un componente TOpenDialog (OpenDialog1) e un pulsante. ofAllowMultiSelect ha la Options (di AddFilesToListView) immobili impostata su true.

Al momento facendo clic sul pulsante del metodo <=> viene eseguito:

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;

Quando si esegue l'applicazione, selezionando il primo file, non ho alcun problema, ma quando si vuole selezionare il secondo, ottengo un errore che dice "Progetto progetto3 sollevò un EInvalidPointer classe di eccezione con il messaggio 'non valido Puntatore Operazione'."

Qual è la causa di questo, come faccio a correggere questo?

È stato utile?

Soluzione

"operazione puntatore non valido" significa che è liberato di memoria che non appartengono a voi. Una di queste tre cose è la causa:

  • Il tuo programma liberato qualcosa che era già stato liberato una volta prima.
  • Il tuo programma liberato qualcosa che non è mai stato assegnato, in primo luogo.
  • Il tuo programma liberato qualcosa che era stato assegnato con un diverso gestore di memoria.

Nel codice, si sta liberando proprietà TOpenDialog s 'il Files. Non hai destinare tale lista di stringhe, e la documentazione non dice di liberare esso, quindi è ragionevole aspettarsi che la lista in realtà appartiene alla componente finestra di dialogo, e che il componente sarà liberarlo quando vuole. Controllo del codice sorgente in Dialogs.pas conferma. Dal momento che hanno anche liberato tale oggetto, si dispone di un errore di doppio libero, che incontra il primo criterio che ho elencato sopra. Rimuovere quella linea.

Uwe sottolineato , il gioco è anche l'elaborazione di un di nomi di file, ma solo controllare l'esistenza di uno. Questo è un errore logico nel programma, ma non avrebbe causato l'eccezione che stai vedendo.

Altri suggerimenti

Si dovrebbe verificare la presenza di

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

anziché

if FileExists(OpenDialog1.FileName) then begin

Meglio investire in una variabile locale tenendo quel valore.

E perché questo?

OpenDialog1.Files.Free;

I file è di proprietà del l'TOpenDialog, e non deve essere liberato direttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top