문제

나는 a를 포함하는 양식이 있습니다 TOpenDialog 요소 (OpenDialog1) 및 버튼.OpenDialog1 has the ofAllowMultiSelect (의 Options) 속성이 True로 설정되었습니다.

버튼을 클릭하면 메소드가 있습니다 AddFilesToListView 실행됩니다 :

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;

응용 프로그램을 실행하고 첫 번째 파일을 선택할 때는 아무런 문제가 없지만 두 번째 파일을 선택하려면 "Project Project3가 '유효하지 않은 포인터 작동'메시지와 함께 예외 클래스 EinValidPointer를 제기했습니다."라는 오류가 발생합니다.

이것의 원인은 무엇입니까, 어떻게 수정합니까?

도움이 되었습니까?

해결책

"잘못된 포인터 작동"은 당신이 속하지 않은 메모리를 풀어주는 것을 의미합니다. 이 세 가지 중 하나는 원인입니다.

  • 귀하의 프로그램은 이전에 이미 해방 된 것을 해방 시켰습니다.
  • 귀하의 프로그램은 처음에는 결코 할당되지 않은 것을 해방 시켰습니다.
  • 귀하의 프로그램은 다른 메모리 관리자와 할당 된 것을 해제했습니다.

당신의 코드에서 당신은 TOpenDialog'에스 Files 재산. 해당 문자열 목록을 할당하지 않았으며 문서에서는 해방하라고 지시하지 않으므로 목록이 실제로 대화 상자 구성 요소에 속하며 구성 요소가 원하는 경우 해방 될 것으로 기대하는 것이 합리적입니다. 소스 코드를 확인합니다 대화 확인합니다. 해당 객체를 해제 했으므로 위에 나열된 첫 번째 기준을 충족하는 이중 무료 오류가 있습니다. 그 라인을 제거하십시오.

처럼 Uwe가 지적했다, 당신은 또한 처리 중입니다 목록 파일 이름이지만 하나의 존재 만 확인합니다. 그것은 당신의 프로그램에서 논리 오류이지만, 당신이보고있는 예외를 일으키지는 않습니다.

다른 팁

확인해야합니다

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

대신에

if FileExists(OpenDialog1.FileName) then begin

해당 값을 보유하는 로컬 변수에 더 잘 투자하십시오.

그리고 왜 이건?

OpenDialog1.Files.Free;

파일은 Topendialog가 소유하고 있으며 직접 해제해서는 안됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top