Pregunta

Tengo un formulario que contiene un componente TOpenDialog (OpenDialog1) y un botón. ofAllowMultiSelect tiene la Options (de AddFilesToListView) Propiedad se establece en true.

Al hacer clic en el botón el método <=> se ejecuta:

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;

Cuando se ejecuta la aplicación, seleccionar el primer archivo, no tengo ningún problema, pero cuando se quiere seleccionar la segunda, me sale un error que dice "proyecto3 Proyecto levantó una EInvalidPointer clase de excepción con el mensaje 'Operación no válida puntero'."

¿Cuál es la causa de esto, ¿cómo puedo corregir esto?

¿Fue útil?

Solución

"operación de puntero no válido" significa que liberado de memoria que no le pertenece. Una de estas tres cosas es la causa:

  • Su programa liberó algo que ya se había liberado una vez antes.
  • Su programa liberó algo que nunca se ha asignado en el primer lugar.
  • Su programa liberó algo que había sido asignado a un administrador de memoria diferente.

En su código, que está liberando la propiedad TOpenDialog la Files 's. Usted no asignó esa lista de cadenas, y la documentación no dice que para liberarlo, por lo que es razonable esperar que la lista realmente pertenece al componente de diálogo, y que el componente se liberarla cuando quiere. Comprobación del código fuente en Dialogs.pas lo confirma. Ya que también ha liberado a ese objeto, que tiene un error de doble liberación, que se reúne el primer criterio que se enumeran más arriba. Retire esa línea.

Uwe señaló , también eres el procesamiento de un de los nombres de archivo, pero sólo la comprobación de la existencia de uno. Eso es un error lógico en su programa, pero no haría que la excepción que se está viendo.

Otros consejos

Debe comprobar

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

en lugar de

if FileExists(OpenDialog1.FileName) then begin

Es mejor invertir en una variable local que sostiene ese valor.

Y por qué esto?

OpenDialog1.Files.Free;

Los archivos es propiedad de la del TOpenDialog, y no debe ser liberado directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top