Question

I ai une forme qui contient un composant de TOpenDialog (OpenDialog1) et un bouton. ofAllowMultiSelect a la propriété Options (de AddFilesToListView) réglé sur vrai.

Après avoir cliqué sur le bouton de la méthode est exécutée <=>:

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;

Lors de l'exécution de l'application, en sélectionnant le premier fichier, je n'ai aucun problème, mais quand on veut sélectionner le second, je reçois une erreur « projet3 du projet a soulevé une EInvalidPointer de classe d'exception avec le message « pointeur non valide l'opération ». »

Quelle est la cause de cela, comment puis-je corriger cela?

Était-ce utile?

La solution

« opération de pointeur non valide » signifie que vous libéré la mémoire qui ne vous appartient pas. L'un de ces trois choses est la cause:

  • Votre programme a libéré quelque chose qui avait déjà été libéré une fois.
  • Votre programme a libéré quelque chose qui n'a jamais été affecté en premier lieu.
  • Votre programme a libéré quelque chose qui avait été attribué à un gestionnaire de mémoire différent.

Dans votre code, vous libérant ainsi la propriété de TOpenDialog du Files. Vous ne l'avez pas allouez cette liste de chaînes, et la documentation ne vous dit pas pour le libérer, il est donc raisonnable de penser que la liste appartient en fait à la composante de dialogue, et que le composant libre quand il veut. Vérification du code source dans Dialogs.pas confirme. Puisque vous avez également libéré cet objet, vous avez une erreur double-free, qui répond au premier critère I énuméré ci-dessus. Retirez cette ligne.

Uwe a souligné , vous traitez également une liste des noms de fichiers, mais seulement de vérifier l'existence d'un. C'est une erreur de logique dans votre programme, mais ce ne serait pas faire l'exception que vous voyez.

Autres conseils

Vous devriez vérifier

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

au lieu de

if FileExists(OpenDialog1.FileName) then begin

investir mieux dans une variable locale tenant cette valeur.

Et pourquoi cela?

OpenDialog1.Files.Free;

Les fichiers appartient au TOpenDialog le, et ne doit pas être libéré directement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top